2つのコレクションがあるとします。
Base Collection
Target 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です。
オブジェクト説明
オブジェクト全体フロー
入力
Base FieldとTarget Fieldが対応するように、フィールド名を設定します。
Base Field1とTarget Field1は入力必須です。
出力
ソースコード
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