1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【BluePrism】コレクションを比較して差分抽出&重複レコードを削除する

Last updated at Posted at 2019-12-17

2つのコレクションがあるとします。
###Base Collection
image.png

###Target Collection
image.png

  • フィールド1 ⇔ Field1
  • フィールド2 ⇔ Field2
  • フィールド3 ⇔ Field3

に対応しているとします。
2つのコレクションを比較して、上記のフィールドで同じパラメータのレコードがあった場合に
レコード削除&差分抽出するオブジェクトを作りました。

##概要図
image.png

##実行結果
比較元と比較対象のコレクションの差分抽出、重複レコードを削除した結果は以下の通りです。
Base Collectionのフィールド1~3を対象とし、対応するTarget CollectionのField1~3を比較した結果です。

###Result Base Collection
Base CollectionとTarget Collectionで重複しなかったレコードを抽出したコレクション。
抽出元のコレクションはBase Colelctionです。
image.png

###Result Target Collection
Base CollectionとTarget Collectionで重複しなかったレコードを抽出したコレクション。
抽出元のコレクションはTarget Colelctionです。
image.png

###Duplicate Collection
Base CollectionとTarget Collectionで重複したレコードを抽出したコレクション。
抽出元のコレクションはTarget Colelctionです。
image.png

##オブジェクト説明
###オブジェクト全体フロー
image.png

###Input
Base FieldとTarget Fieldが対応するように、フィールド名を設定します。
Base Field1とTarget Field1は入力必須です。
image.png

###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

1
2
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?