3

平台:SoftwareAG WebMethods 8.2 问题:我有 2 个 DocumentList。其中一个包含 XOPObjects 和其他字符串。我必须将 XOPObject 转换为 String 并将其复制到其他 DocList 的对应字符串字段。怎么了?没有什么。当 XOPObject 的 base64string 很好地生成时,String 字段仍然是条目。

使用 Given DocList:A(Source with XOP) DocList:B(Target with String field) 执行的步骤

 1. Loop over A
 2. Create Base64String from XOPObject using pub.soap.utils:getXOPObjectContent
 3. Call pub.flow:debugLog to check if the base64String is generated
 4. Generate index variable from $iteration with pub.math:subtractInts as index:=$iteration-1
 5. Perform map step from base64String to B's String field with index set to %index%
 6. After loop
 7. pub.xml:documentToXmlString to generate xml representation of the B document
 8. pub.flow:debugLog
 9. Nothing is in the String field...

知道这里出了什么问题吗?

4

3 回答 3

1

在 webMethods Integration Server 流服务中,循环具有两个属性来标识要迭代的列表:一个输入数组,这是必需的,一个输出数组,这是可选的。

循环步骤的工作方式是它只保留对输入和输出数组中的项目所做的更改;如果您更改管道中任何其他列表中的项目,则这些更改会在循环步骤退出时丢失。这就是它的工作方式。

引用webMethods Developer User's Guide的第 198 页:

指定输入数组

LOOP 步骤要求您指定一个输入数组,其中包含将用作 LOOP 中一个或多个步骤的输入的各个元素。在运行时,LOOP 步骤为指定数组中的每个成员执行一次循环。例如,如果您想对存储在采购订单中的每个行项目执行 LOOP,您可以使用存储订单行项目的文档列表作为 LOOP 的输入数组。

您可以在 LOOP 步骤的“属性”面板上指定输入数组的名称。您指定的数组可以是以下任何数据类型: * 字符串列表 * 字符串表 * 文档列表 * 对象列表

LOOP 步骤对输入数组中指定的数组的每个成员执行一次。

设计流程时,请记住,由于循环中的服务针对指定输入数组中的单个元素进行操作,因此它们必须设计为将数组元素而不是整个数组作为输入。

循环步骤属性

例如,如果您的 LOOP 针对一个名为 LineItems 的文档列表执行,该列表包含名为 Item、Qty 和 UnitPrice 的子项,您可以将 LineItems 指定为 LOOP 步骤的 Input 数组,但循环内的服务将采用 LineItems 的各个元素 (例如,项目、数量、单价等)作为输入。

从 LOOP 步骤收集输出

如果您的 LOOP 步骤产生一个输出变量,则服务器可以将该输出收集到管道中的一个数组中。

为此,您使用输出数组参数来指定您希望服务器为循环的每次迭代收集输出的数组变量的名称。例如,如果您的循环检查采购订单中每个行项目的库存状态,并在每次执行时生成一个名为 InventoryStatus 的字符串,则您可以将 InventoryStatus 指定为 Output 数组的值。在运行时,服务器会自动将 InventoryStatus 转换为一个数组变量,其中包含循环每次迭代的输出。

要从循环的每次传递中收集输出,请指定您希望服务器为每次迭代收集的输出变量的名称。

鉴于所有这些,实际上有几种不同的方法可以解决您的问题:

  1. 在循环步骤的输出数组属性中指定第二个文档列表变量名称。这样做将保留您在循环步骤退出时对第二个文档列表所做的更改。

  2. 在循环步骤之前的映射步骤中获取您的第一个文档列表(具有 XOPObject 对象的那个)的副本,然后循环遍历副本而不是原始并内联改变副本的项目。

  3. 在循环步骤中分别使用pub.list:appendToDocumentListpub.list:appendToStringList构造一个新的文档列表或字符串列表。这需要更多代码,并且在您的情况下不是必需的,因为您希望输出列表为输入列表中的每个项目包含一个项目,但是当您过滤掉输入列表项目时很有用(即,生成的输出列表将是输入列表的子集)。

于 2014-02-14T23:46:21.197 回答
0

我不确定你是否还在寻找这个问题的答案。我记得我曾经遇到过同样的问题。问题出在对象类型和字符串之间的映射。因此,在映射中,您会将对象类型映射到字符串,因为我们希望它在运行时包含 base64String。

您可以尝试通过替换目标文档列表中的变量名称而不是直接映射。

于 2014-09-17T14:49:59.910 回答
0

也许您可以生成一个字符串列表作为循环输出数组,然后在循环之外,将输出字符串列表映射到 B 的字段?

于 2015-06-11T12:20:14.833 回答