用于在映射Informatica PowerCenter中写入缺失值的Java代码

时间:2019-06-24 14:16:30

标签: java informatica informatica-powercenter

我有一个任务要看一下数据库(SAP iDoc),该数据库中具有按段派生的特定值。我必须在映射的末尾导出一个xml,该xml的子组件可以包含多行。我的问题是我们有一个组件,该组件具有两个用限定符分隔的值。

每笔交易如下:

+----------+-----------+--------+
| QUALF_1  | BETRG_dc  | DOCNUM |
+----------+-----------+--------+
|     001  |        20 | xxxxxx |
|     001  |        22 | xxxxxx |
+----------+-----------+--------+

+---------+-----------+-----------+
| QUALF_2 |  BETRG_pr |  DOCNUM   |
+---------+-----------+-----------+
|    013  |        30 |    xxxxxx |
|    013  |        40 |    xxxxxx |
+---------+-----------+-----------+

我的问题是,当与内置转换结合时,我们的几何级数会像这样

+---------+-----------+-----------+
| DOCNUM  |  BETRG_dc |  BETRG_pr |
+---------+-----------+-----------+
| xxxxxx  |        20 |        30 |
| xxxxxx  |        20 |        40 |
| xxxxxx  |        22 |        30 |
| xxxxxx  |        22 |        40 |
+---------+-----------+-----------+

您会看到只有第一行和最后一行是正确的。

问题出在以下事实:如果BETRG_dc为0,则不会发送整个段,因此过滤器转换失败。

我发现QUALF_1和QUALF_2的段号是连续的。例如,QUALF_1是48,而QUALF_2是49。

能帮我创建一个JAVA转换,为缺少的QUALF_1添加一行。

以下是要求表:

+-------+-------+---------------+
| QUALF | BETRG | SegmentNumber |
+-------+-------+---------------+
|   013 |    20 |            48 |
|   001 |   150 |            49 |
|   013 |    15 |            57 |
|   001 |   600 |            58 |
+-------+-------+---------------+

我想看看转换,如果我们有这样的来源:

+-------+-------+---------------+
| QUALF | BETRG | SegmentNumber |
+-------+-------+---------------+
|   001 |   150 |            49 |
|   013 |    15 |            57 |
|   001 |   600 |            58 |
+-------+-------+---------------+

继续并插入一个段ID为48且BETRG值为“ 0”的行。

我已经尽力了。

预期输出应如下所示:

+-------+-------+---------------+
| QUALF | BETRG | SegmentNumber |
+-------+-------+---------------+
|   013 |     0 |            48 |
|   001 |   150 |            49 |
|   013 |    15 |            57 |
|   001 |   600 |            58 |
+-------+-------+---------------+

3 个答案:

答案 0 :(得分:0)

您应该在联接器转换中联接两个表。 使用Left(master)外连接,然后将其放入目标。然后将右表中的BETRG列映射到目标,左表中的其余列映射。 发生的情况是,当没有匹配项时,BETRG将为空。将其带入表达式中,查看该值是否为null或为空,然后将其更改为0或所需的值。

答案 1 :(得分:0)

这是我创建的,但是不幸的是,现在它仅在行级别上起作用,而不能在整个数据上起作用。我正在努力使代码正常运行:

QUALF_out = QUALF;
BETRG_out= BETRG;
SegmentNumber_out= SegmentNumber;

  if(QUALF.equals("001"))
{
  segment_new=(SegmentNumber - 1);
}

int colCount=1;
myList.add(SegmentNumber);


System.out.println("SegmentNumber_out: " + segment_new);

if(Arrays.asList(myList).contains(segment_new)){
    QUALF_out = QUALF;
    BETRG_out= BETRG;
    SegmentNumber_out= SegmentNumber;    
    QUALF_out="013";
    BETRG_out="0";
    SegmentNumber_out=segment_new;
    generateRow();
    } else {
  QUALF_out = QUALF;
  BETRG_out= BETRG;
  SegmentNumber_out= SegmentNumber;    
  generateRow();
}

答案 2 :(得分:0)

这是有效的:

import java.util.*;

private ArrayList<String> myList2 = new ArrayList<String>();

QUALF_out = QUALF;
BETRG_out = BETRG;
SegmentNumber_out = SegmentNumber;
DOCNUM = DOCNUM;

array_for_search = QUALF + ParentSegmentNumber + DOCNUM ;
myList2.add(array_for_search);

System.out.println("myList: " + myList2);
System.out.println("Array: " + myList2.contains("910" + ParentSegmentNumber + DOCNUM));

if(!myList2.contains("910" + ParentSegmentNumber + DOCNUM)){
        QUALF_out="910";
        BETRG_out="0";
}
    generateRow();