2つのコレクションがあるとします。
###Base Collection
- フィールド1 ⇔ Field1
- フィールド2 ⇔ Field2
- フィールド3 ⇔ Field3
に対応しているとします。
2つのコレクションを比較して、上記のフィールドで同じパラメータのレコードがあった場合に
レコード削除&差分抽出するオブジェクトを作りました。
##実行結果
比較元と比較対象のコレクションの差分抽出、重複レコードを削除した結果は以下の通りです。
Base Collectionのフィールド1~3を対象とし、対応するTarget CollectionのField1~3を比較した結果です。
###Result Base Collection
Base CollectionとTarget Collectionで重複しなかったレコードを抽出したコレクション。
抽出元のコレクションはBase Colelctionです。
###Result Target Collection
Base CollectionとTarget Collectionで重複しなかったレコードを抽出したコレクション。
抽出元のコレクションはTarget Colelctionです。
###Duplicate Collection
Base CollectionとTarget Collectionで重複したレコードを抽出したコレクション。
抽出元のコレクションはTarget Colelctionです。
###Input
Base FieldとTarget Fieldが対応するように、フィールド名を設定します。
Base Field1とTarget Field1は入力必須です。
###Output
###Code
Base Collectionのレコード重複を除外した後、そのCollectionをベースにして
Target Collectionとの対応するフィールドと比較して差分抽出、重複削除を行っています。
Try
If Base_Field1 = "" Or Target_Field1 = "" Then
Success = False
Message = "Base_Field1, Target_Field1は必須項目です。"
Exit Sub
End If
Dim NewBase_Collection As DataTable
NewBase_Collection = Base_Collection.Clone
Dim count As Long = 0
For Each r1 As DataRow In Base_Collection.Rows
If count = 0 Then
NewBase_Collection.ImportRow(r1)
Else
Dim find_rows As DataRow()
find_rows = NewBase_Collection.Select(Base_Field1 & " = '" & r1(Base_Field1) & "'" & _
If(Base_Field2 <> "", " AND " & Base_Field2 & " = '" & r1(Base_Field2) & "'", "") & _
If(Base_Field3 <> "", " AND " & Base_Field3 & " = '" & r1(Base_Field3) & "'", ""))
If find_rows.Length = 0 Then
NewBase_Collection.ImportRow(r1)
End If
End If
count = count + 1
Next
Dim Tmp_Duplicate_Collection, Tmp_Result_Target_Collection, Tmp_NewBase_Collection As DataTable
Tmp_Duplicate_Collection = Target_Collection.Clone
Tmp_Result_Target_Collection = Target_Collection.copy()
Tmp_NewBase_Collection = NewBase_Collection.Clone
For Each r2 As DataRow In NewBase_Collection.Rows
Dim find_rows As DataRow()
find_rows = Tmp_Result_Target_Collection.Select(Target_Field1 & " = '" & r2(Base_Field1) & "'" & _
If(Target_Field2 <> "", " AND " & Target_Field2 & " = '" & r2(Base_Field2) & "'", "") & _
If(Target_Field3 <> "", " AND " & Target_Field3 & " = '" & r2(Base_Field3) & "'", ""))
If find_rows.Length <> 0 Then
' Base_CollectionにもTarget_Collectionにも存在する場合
For Each r3 As DataRow In find_rows
Tmp_Duplicate_Collection.ImportRow(r3)
r3.Delete()
Next
Else
Tmp_NewBase_Collection.ImportRow(r2)
End If
Next
Duplicate_Collection = Tmp_Duplicate_Collection.DefaultView.ToTable
Result_Target_Collection = Tmp_Result_Target_Collection.DefaultView.ToTable
Result_Base_Collection = Tmp_NewBase_Collection.DefaultView.ToTable
Success = True
Message = ""
Catch e As Exception
Success = False
Message = e.Message
End Try
##サンプル
https://github.com/falcslab/blueprism/tree/collection
BPA オブジェクト - コレクション差分比較.xml