C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 2つのDataTableの比較抽出方法について


(過去ログ 50 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■27396 / inTopicNo.1)  2つのDataTableの比較抽出方法について
  
□投稿者/ PROTO (16回)-(2008/11/05(Wed) 12:40:36)

分類:[.NET 全般] 

いつも参考にさせていただいています。

同じ構造のDataTableが2つ(TableA、TableB)有り、TableAの列Aに含まれるデータと一致するTableBの全てのレコードを抽出してTableCを作成したいと考えています。
どのような方法があるでしょうか?お知恵を貸していただければと思います。

環境:WinXP VS2005 言語:VB.NET

DataTableの構造TableA
 列A
 列B
 列C
 
DataTableの構造TableB
 列A
 列B
 列C

レコード数は
TableA < TableB

テーブル間にリレーションを張る方法を考えたのですが、TableAを親としたときに、
レコード数がTableA > TableBの場合、リレーションを設定するときに問題ないのですが、
レコード数がTableA < TableBの場合、リレーションを設定するときに下記のエラーが発生します。
"対応する親の値が指定されてない値があるため、この制約を有効にできません。"
  と出てしまいます。

リレーションを張る方法を、
http://www.microsoft.com/japan/msdn/thisweek/300x10/phase2/relationaldata/vb.aspx
を参考に下記のようにしたのですが、一致するレコードを全て取得したいのですが、
どののようにすればいいのかで、止まっています。

Dim ds As DataSet
Dim dt1, dt2 As DataTable
ds = New DataSet
ds.Tables.Add(dt1)
ds.Tables.Add(dt2)

Me.DataGridView1.DataSource = ds
Me.DataGridView1.DataMember = "TableA"

Me.DataGridView2.DataSource = ds
Me.DataGridView2.DataMember = "TableB"
'リレーションを設定
ds.Relations.Add(New DataRelation("TableA_TableB", ds.Tables("TableA").Columns(0), ds.Tables("TableB").Columns(0)))
Me.DataGridView3.DataSource = ds
Me.DataGridView3.DataMember = "TableA.TableA_TableB"

引用返信 編集キー/
■27398 / inTopicNo.2)  Re[1]: 2つのDataTableの比較抽出方法について
□投稿者/ 魔界の仮面弁士 (887回)-(2008/11/05(Wed) 13:16:43)
No27396 (PROTO さん) に返信
> 同じ構造のDataTableが2つ(TableA、TableB)有り、TableAの列Aに含まれるデータと一致する
> TableBの全てのレコードを抽出してTableCを作成したいと考えています。

これでよいのかな。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
 Dim tblA As DataTable = CreateA()
 Dim tblB As DataTable = CreateB()

 Dim ds As New DataSet()
 ds.Tables.Add(tblA)
 ds.Tables.Add(tblB)
 ds.Relations.Add("TableA_TableB", tblA.Columns("列A"), tblB.Columns("列A"), False)


 DataGridView1.DataSource = ds
 DataGridView1.DataMember = "TableA"

 DataGridView2.DataSource = ds
 DataGridView2.DataMember = "TableB"

 tblA.Columns.Add("カウント", GetType(Integer), "Count(Child.列A)")

 Dim dvA As New DataView(tblA)
 dvA.RowFilter = "カウント>0"
 DataGridView3.DataSource = dvA

 Dim dvB As New DataView(tblB)
 dvB.RowFilter = "Parent.カウント>0"
 DataGridView4.DataSource = dvB

 'Dim tblC As DataTable = dvB.ToTable()
End Sub


Private Shared Function CreateA() As DataTable
 CreateA = New DataTable("TableA")
 With CreateA.Columns
  .Add("列A")
  .Add("列B")
  .Add("列C")
 End With
 With CreateA.Rows
  .Add("11", "21", "A1")
  .Add("12", "22", "A2")
  .Add("13", "23", "A3")
  .Add("14", "24", "A4")
 End With
End Function

Private Shared Function CreateB() As DataTable
 CreateB = New DataTable("TableB")
 With CreateB.Columns
  .Add("列A")
  .Add("列B")
  .Add("列C")
 End With
 With CreateB.Rows
  .Add("11", "21", "B1")
  .Add("11", "22", "B2")
  .Add("13", "23", "B3")
  .Add("14", "24", "B4")
  .Add("21", "23", "B5")
  .Add("22", "24", "B6")
 End With
End Function
引用返信 編集キー/
■27405 / inTopicNo.3)  Re[2]: 2つのDataTableの比較抽出方法について
□投稿者/ PROTO (17回)-(2008/11/05(Wed) 14:13:28)
魔界の仮面弁士さんありがとうございます。

やりたいことが出来ました!
ありがとうございます。

No27398 (魔界の仮面弁士 さん) に返信
> ■No27396 (PROTO さん) に返信
>>同じ構造のDataTableが2つ(TableA、TableB)有り、TableAの列Aに含まれるデータと一致する
>>TableBの全てのレコードを抽出してTableCを作成したいと考えています。
>
> これでよいのかな。
>
> Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
>  Dim tblA As DataTable = CreateA()
>  Dim tblB As DataTable = CreateB()
>
>  Dim ds As New DataSet()
>  ds.Tables.Add(tblA)
>  ds.Tables.Add(tblB)
>  ds.Relations.Add("TableA_TableB", tblA.Columns("列A"), tblB.Columns("列A"), False)
>
>
>  DataGridView1.DataSource = ds
>  DataGridView1.DataMember = "TableA"
>
>  DataGridView2.DataSource = ds
>  DataGridView2.DataMember = "TableB"
>
>  tblA.Columns.Add("カウント", GetType(Integer), "Count(Child.列A)")
>
>  Dim dvA As New DataView(tblA)
>  dvA.RowFilter = "カウント>0"
>  DataGridView3.DataSource = dvA
>
>  Dim dvB As New DataView(tblB)
>  dvB.RowFilter = "Parent.カウント>0"
>  DataGridView4.DataSource = dvB
>
>  'Dim tblC As DataTable = dvB.ToTable()
> End Sub
>
>
> Private Shared Function CreateA() As DataTable
>  CreateA = New DataTable("TableA")
>  With CreateA.Columns
>   .Add("列A")
>   .Add("列B")
>   .Add("列C")
>  End With
>  With CreateA.Rows
>   .Add("11", "21", "A1")
>   .Add("12", "22", "A2")
>   .Add("13", "23", "A3")
>   .Add("14", "24", "A4")
>  End With
> End Function
>
> Private Shared Function CreateB() As DataTable
>  CreateB = New DataTable("TableB")
>  With CreateB.Columns
>   .Add("列A")
>   .Add("列B")
>   .Add("列C")
>  End With
>  With CreateB.Rows
>   .Add("11", "21", "B1")
>   .Add("11", "22", "B2")
>   .Add("13", "23", "B3")
>   .Add("14", "24", "B4")
>   .Add("21", "23", "B5")
>   .Add("22", "24", "B6")
>  End With
> End Function
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -