如何在WEBMethods中映射文档列表?

时间:2014-08-27 15:37:29

标签: webmethods

我想映射一个在WebMethods中是文档列表的数组。我认为你可以在不映射所有孩子的情况下映射该变量。我已经完成了这一切,并且没有在PassArea中显示任何内容。 (PassArea是之后发送到大型机程序的数据数组。)

     A           -->         B
       Field1                 F1
       Field2                 F2
       field3                 F3

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

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

2 个答案:

答案 0 :(得分:6)

如果文件列表的字段" A"具有与文档列表字段不同的名称" B"那么不,你不能映射文件清单" A"记录清单" B"。 WebMethods不知道A中的哪个字段对应于" B"中的哪个字段。

您必须执行以下操作:

  1. LOOP over document list" A"
  2. 映射" A"的每个字段。到包含与文档列表相同的字段的通用文档" B"
  3. 将通用文档附加到文档列表" B"
  4. 删除通用 文档。
  5. 第二步截屏

    Step #2 screenshot

    第3步截图

    Step #3 screenshot

答案 1 :(得分:0)

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

  1. Techcommunity SoftwareAG - performance impact with appendToDocumentList
  2. quest4apps.com - Reason to avoid appendToDocumentList
  3. 正如#2提示的那样,他们有6种方式从最快到最慢排列如下(但我会在前三个中给出一个例子,因为后三者是相当的显然很慢,这被认为是避免的):

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

    • 创建Java服务的最简单方法是首先映射输入输出。 input output doc
    • 右键单击并单击"生成代码" ,直到出现对话框Generate code for Implementing Service 选择"选项以实现此服务" Generated service 并且创建了服务
    • 只需将代码重新安排到:
    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();
    
    }
    
    • 结果resultJavaService

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

    • 创建流程服务和输入&amp;输出文件
    • 创建MAP步骤
    • 在ForEach循环中选择两个文档。 ForEach

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

    • 创建流程服务和输入&amp;输出文件
    • 创建LOOP步骤
    • 更改LOOP的属性,输入数组= A;输出数组= B;并在LOOP步骤下创建一个地图 LoopProperties
    • 将A到B中的所有参数映射 MapAtoB

    希望这些有帮助...