3

我想映射一个在 WebMethods 中是文档列表的数组。我认为您可以只映射该变量而不映射所有子项。我已经这样做了,但 PassArea 中没有任何显示。(PassArea 是之后发送到大型机程序的数据数组。)

     A           -->         B
       Field1                 F1
       Field2                 F2
       field3                 F3

文档是 A,Natural 程序的输入文档是 B。--> 是将它们连接在一起的链接。

我没有要展示的图片,因为那会泄露一些公司信息。

4

2 回答 2

7

如果文档列表“A”的字段与文档列表“B”的字段名称不同,则不,您不能将文档列表“A”映射到文档列表“B”。WebMethods 不知道 A 中的哪个字段对应于“B”中的哪个字段。

您必须执行以下操作:

  1. 在文档列表“A”上循环
  2. 将“A”的每个字段映射到包含与文档列表“B”相同字段的通用文档
  3. 将通用文档附加到文档列表“B”
  4. 删除通用文档。

步骤 #2 截图

步骤 #2 截图

第三步截图

第三步截图

于 2014-09-02T16:13:40.097 回答
0

有很多方法可以在文档数组之间进行映射。但在您创建之前,请考虑以下著作:

  1. Techcommunity SoftwareAG - appendToDocumentList 对性能的影响
  2. quest4apps.com - 避免 appendToDocumentList 的原因

正如#2的提示所说,它们有 6 种方式从最快到最慢排列如下(但我将在前三种中举一个例子,因为后三种显然很慢,这被认为是可以避免的):

1. Java Loop:通过Java服务完成的循环。

  • 创建 java 服务最简单的方法是首先映射输入输出。 输入输出文档
  • 右键单击并单击“生成代码”直到出现对话框为实现服务生成代码 选择选项“用于实现此服务” 生成的服务 并创建服务
  • 只需将代码重新排列成这样:
public static final void mappingDocuments(IData pipeline) throws ServiceException {

    // pipeline
    IDataCursor pipelineCursor = pipeline.getCursor();
    
    // Instantiate input A
    IData[] A = IDataUtil.getIDataArray(pipelineCursor, "A");
    
    // Initiate output B
    IData[] B = new IData[A.length];
    
    if (A != null)
    {
        for (int i = 0; i < A.length; i++)
        {
            // Populate the Field in doc A
            IDataCursor ACursor = A[i].getCursor();
            String Field1 = IDataUtil.getString(ACursor, "Field1");
            String Field2 = IDataUtil.getString(ACursor, "Field2");
            String Field3 = IDataUtil.getString(ACursor, "Field3");
            ACursor.destroy();
            
            // Create IData[i] and cursors finally put all Fields into B[i] variable output
            B[i] = IDataFactory.create();
            IDataCursor BCursor = B[i].getCursor();
            IDataUtil.put(BCursor, "F1", Field1);
            IDataUtil.put(BCursor, "F2", Field2);
            IDataUtil.put(BCursor, "F3", Field3);
            BCursor.destroy();
    
            // OR JUST USE CLONE BELOW IF YOU DON'T HAVE ANY MODIFICATION INSIDE THE VARIABLE
            // B[i] = IDataUtil.clone(A[i]);
        }
    }
    pipelineCursor.destroy();
    
    // Finally to put the B Map(IData) to output.
    // Actually you can use only single pipelineCursor throughout all code but it's just for readable
    IDataUtil.put(pipelineCursor, "B", B);
    pipelineCursor.destroy();
        
}
  • 结果结果JavaService

2. 隐式循环:对于相同大小的简单列表,您可能希望在 MAP 步骤中直接链接它们

  • 创建流服务和输入输出文档
  • 创建 MAP 步骤
  • 在 ForEach 循环中选择两个文档。 为每个

3. 显式循环:使用 LOOP 步骤及其输出数组。

  • 创建流服务和输入输出文档
  • 创建 LOOP 步骤
  • 改变LOOP的属性,输入array=A;输出数组=B;并在 LOOP 步骤下创建地图 循环属性
  • 将 A 中的所有参数映射到 B 地图AtoB

希望这些有帮助...

于 2017-12-04T12:59:59.797 回答