前提・実現したいこと
複数テーブルを結合して特定列データ行の小計列、合計列を追加しようとしています。
ただし、結合テーブルの中にDB.Nullが含まれます。
https://teratail.com/questions/320488
にてDecimal型すべての合計列の追加はDBNull なら 0 に書き換える方法で一旦解決しております。
(希望する結果をそのように指定していたため)
前スレッドでベストアンサーを決定した後、実際のデータでいろいろ試している最中にDB.Nullと0を区別して表示させた方がよいと思うところがありましたので、新しいスレッドを作らせて頂きました。
今回はDB.Nullをテーブル表示として残す方法を模索しております。
結合テーブル
HIN CODE1 CODE2 CODEME1 CODEME2
100 101 102
110 111 112
300 121 142 221 242
310 131 152 231 252
200 201 202
210 211 212
希望する結果(今回はDB.Nullの表示をそのまま残します)
HIN CODE1 CODE2 CODEME1 CODEME2 subtotal1 subtotal2 total
100 101 102 101 102 203
110 111 112 111 112 223
300 121 142 221 242 342 384 726
310 131 152 231 252 362 404 766
200 201 202 201 202 403
210 211 212 211 212 423
subtotal1はCODE1,CODEME1の合計値(DB.Nullは0として計算)
subtotal2はCODE2,CODEME2の合計値(DB.Nullは0として計算)
totalはCODE1,CODE2,CODEME1,CODEME2の合計値
発生している問題
下記ソースコードでサンプルデータの希望する実行結果は得られていますが、 今後計算する列数が増えた場合に、Decimal型かどうかのIF文が複雑になってしまいます。 列数が増えても複雑にならないスマートな記述方法を探しております。
該当のソースコード
VB
1Imports System 2Imports System.Data 3Imports System.Windows.Forms 4 5Public Class Form1 6 7 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 8 9 Dim table As DataTable = New DataTable() 10 table.Merge(CreateDataTable1()) 11 table.Merge(CreateDataTable2()) 12 table.Columns.Add("subtotal1", GetType(Decimal)) 13 table.Columns.Add("subtotal2", GetType(Decimal)) 14 table.Columns.Add("total", GetType(Decimal)) 15 16 Dim subtotal1 As Decimal = 0D 17 Dim subtotal2 As Decimal = 0D 18 Dim total As Decimal = 0D 19 20 For i As Integer = 0 To table.Rows.Count - 1 21 If TypeOf table.Rows(i).Item("CODE1") Is Decimal And TypeOf table.Rows(i).Item("CODEME1") Is Decimal Then 22 subtotal1 = table.Rows(i).Item("CODE1") + table.Rows(i).Item("CODEME1") 23 End If 24 If TypeOf table.Rows(i).Item("CODE1") Is Decimal And TypeOf table.Rows(i).Item("CODEME1") IsNot Decimal Then 25 subtotal1 = table.Rows(i).Item("CODE1") 26 End If 27 If TypeOf table.Rows(i).Item("CODE1") IsNot Decimal And TypeOf table.Rows(i).Item("CODEME1") Is Decimal Then 28 subtotal1 = table.Rows(i).Item("CODEME1") 29 End If 30 If TypeOf table.Rows(i).Item("CODE2") Is Decimal And TypeOf table.Rows(i).Item("CODEME2") Is Decimal Then 31 subtotal2 = table.Rows(i).Item("CODE2") + table.Rows(i).Item("CODEME2") 32 End If 33 If TypeOf table.Rows(i).Item("CODE2") Is Decimal And TypeOf table.Rows(i).Item("CODEME2") IsNot Decimal Then 34 subtotal2 = table.Rows(i).Item("CODE2") 35 End If 36 If TypeOf table.Rows(i).Item("CODE2") IsNot Decimal And TypeOf table.Rows(i).Item("CODEME2") Is Decimal Then 37 subtotal2 = table.Rows(i).Item("CODEME2") 38 End If 39 40 table.Rows(i).Item("subtotal1") = subtotal1 41 table.Rows(i).Item("subtotal2") = subtotal2 42 table.Rows(i).Item("total") = subtotal1 + subtotal2 43 Next 44 45 Me.DataGridView1.DataSource = table 46 End Sub 47 48 Protected Function CreateDataTable1() As DataTable 49 Dim table As DataTable = New DataTable() 50 Dim idColumn As DataColumn = New DataColumn("HIN", GetType(String)) 51 table.Columns.Add(idColumn) 52 table.Columns.Add(New DataColumn("CODE1", GetType(Decimal))) 53 table.Columns.Add(New DataColumn("CODE2", GetType(Decimal))) 54 table.Rows.Add("100", 101D, 102D) 55 table.Rows.Add("110", 111D, 112D) 56 table.Rows.Add("300", 121D, 142D) 57 table.Rows.Add("310", 131D, 152D) 58 table.PrimaryKey = New DataColumn() {idColumn} 59 Return table 60 End Function 61 62 Protected Function CreateDataTable2() As DataTable 63 Dim table As DataTable = New DataTable() 64 table.Columns.Add(New DataColumn("HIN", GetType(String))) 65 table.Columns.Add(New DataColumn("CODEME1", GetType(Decimal))) 66 table.Columns.Add(New DataColumn("CODEME2", GetType(Decimal))) 67 table.Rows.Add("200", 201D, 202D) 68 table.Rows.Add("210", 211D, 212D) 69 table.Rows.Add("300", 221D, 242D) 70 table.Rows.Add("310", 231D, 252D) 71 Return table 72 End Function 73 74 75End Class
補足情報(FW/ツールのバージョンなど)
OS Windows10
VB.NET
Microsoft Visual Studio Community 2017
Version 15.6.7
VisualStudio.15.Release/15.6.7+27428.2043
Microsoft .NET Framework
Version 4.8.04084
回答2件
あなたの回答
tips
プレビュー