根据条件合并 2 个集合以填充嵌套集合

Posted

技术标签:

【中文标题】根据条件合并 2 个集合以填充嵌套集合【英文标题】:Merge 2 collections on a condition to populate a nested collection 【发布时间】:2019-05-22 19:36:43 【问题描述】:

我有 2 个从数据库中获取数据的集合。

集合 1 列名称:A_id、Bid、PCid、Bname ==> 所有文本字段

集合 2 列名称:A_ref、Cid、Cname、值 ==> 所有文本字段

集合 1 和 2 基于 collection1.A_id=collection2.A_ref 相关

我有第三个集合,它是一个嵌套集合:

Collection 3 列名:action(text), colA(collection)

colA 列名:Bid(text)、PCid(text)、Bname(text)、colB(collection)

colB 列名:Cid、Cname、值 ==> 所有文本字段

我想根据上述条件加入集合 1 和集合 2 以加载嵌套集合 3。

请帮忙。

我曾尝试使用集合 VBO,但没有成功。我还尝试使用嵌套循环阶段和带有决策阶段的计数器,但我的代码未能在填充值之前将空行添加到嵌套集合中。

使用 Blueprism 阶段

我想根据上述条件加入集合 1 和集合 2 以加载嵌套集合 3。

我正在使用嵌套循环阶段和带有决策阶段的计数器,但我的代码无法将行添加到嵌套集合中。

【问题讨论】:

让我澄清一下,所以你想要 if cells collection1.A_id=collection2.A_ref 然后合并这两个集合,然后在集合 3 中写入合并的集合?如果是,您想在集合 3 下创建一个新的子集合吗? 或者只是在collection3的相同字段上写入Collection 1和2字段的信息,例如Collection 1.Bid to Collection 3.colA.Bid? 填充集合 3,它是来自集合 1 和 2 的数据的嵌套集合。1 和 2 的连接将基于条件 c1.a_id=c2.a_ref 如果集合 3 已经预定义了字段,则在初始值选项卡中添加一个空行。您尚未指定要遵循我上面询问的两种方法中的哪一种。 【参考方案1】:

Aswin,请检查以下解决方案:

如需更多信息,我会将 XML 文件作为您导入到 Blue Prism 并检查每个阶段,因为这需要大量时间和屏幕截图来解释所有内容。此外,您将对环境中的每一步都有清晰的了解。

从我的 github 存储库链接下载 XML 文件:

Blue Prism Merge Collections to populate a nested-collection

希望这些信息有用。

【讨论】:

【参考方案2】:

我相信您正在寻找的是我所说的“框连接”。你需要一个代码阶段。

输入:

主要(集合) 嵌套(集合) 主键(文本) 嵌套键(文本) 新字段名称(文本)

输出:

输出集合

代码:

' Check for requirements: key columns exist, and that the new field to create in the main
' collection does not already exist.
If Not Main.Columns.Contains(Main_Key) Then
    Throw New Exception("Main Collection does not contain the key column '" & Main_Key & "'")
Else If Not Nested.Columns.Contains(Nested_Key) Then
    Throw New Exception("Nested Collection does not contain the key column '" & Nested_Key & "'")
Else If Main.Columns.Contains(New_Field_Name) Then
    Throw New Exception("Main Collection already contains a field named '" & New_Field_Name & "'")
End If

' Add the column containing the DataTable which will be populated with data from the Nested collection.
Main.Columns.Add(New_Field_Name, GetType(DataTable))

For Each MainRow As DataRow In Main.Rows
    ' Create the new nested table for this row and populate the column names.
    Dim Table As New DataTable
    For Each NestedColumn As DataColumn In Nested.Columns
        Table.Columns.Add(NestedColumn.ColumnName, NestedColumn.DataType)
    Next

    ' Because we don't want to copy the key column.
    Table.Columns.Remove(Nested_Key)

    ' Check each row in the Nested collection to see if it matches current key.
    For Each NestedRow As DataRow In Nested.Rows
        If MainRow(Main_Key) = NestedRow(Nested_Key) Then
            ' Got a match; add the row from Nested into the new table.
            Dim NewRow As DataRow = Table.NewRow
            For Each TableColumn As DataColumn In Table.Columns
                NewRow(TableColumn.ColumnName) = NestedRow(TableColumn.ColumnName)
            Next
            Table.Rows.Add(NewRow)
        End If
    Next

    ' Set the nested collection
    MainRow(New_Field_Name) = Table
Next

Output_Collection = Main

使用问题中的示例,您需要将以下内容传递到代码阶段输入:

[集合 1] -> 主要 [集合 2] -> 嵌套 “A_id”-> 主键 “A_ref”-> 嵌套键 "colB" -> 新字段名

生成的输出集合将包含来自集合 1 的字段,并添加了一个列“colB”,其中包含来自集合 2 的字段(不包括键)。从那里,计算阶段可以将结果放入集合 3。

【讨论】:

感谢 Nick 提供详细的代码。但这不符合目的。如果您注意到,预期的输出集合是多嵌套集合。例如: 感谢 Nick 提供详细的代码。但这不符合目的。如果您注意到,预期的输出集合是多嵌套集合。例如:集合 1:A_id, Bid, PCid, Bname 1, 90001, 40001, Aswin, 2, 90002, 40002, Navin 集合 2:A_ref, Cid, Cname, value 2, 10001, Agarwal, 32,2, 10002, Kumar, 26 输出集合(集合 3):action,Bid, PCid, Bname, Cid, Cname, value "不需要",90001, 40001, Aswin,"不需要", 90002, 40002, Navin, 10001, Agarwal, 32,10002, Kumar, 26

以上是关于根据条件合并 2 个集合以填充嵌套集合的主要内容,如果未能解决你的问题,请参考以下文章

根据集合的大小动态添加行

使用 DataReader 填充嵌套集合

Arangodb AQL 连接、合并、嵌入嵌套的三个或更多集合

更新嵌套的 MongoDB 集合 (Pymongo)

从骨干集合中的两个不同url填充数据

如何填充嵌套的虚拟对象?