【问题标题】:Java code to write a missing value in a mapping Informatica PowerCenter用于在映射 Informatica PowerCenter 中写入缺失值的 Java 代码
【发布时间】:2019-06-24 14:16:30
【问题描述】:

我的任务是查看一个数据库 (SAP iDoc),其中包含由段派生的特定值。我必须在映射的末尾导出一个 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。

你能帮我创建一个为缺少的 QUALF_1 添加一行的 JAVA 转换吗?

这里是要求表:

+-------+-------+---------------+
| 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 |
+-------+-------+---------------+

【问题讨论】:

  • 嗨,亚历山大,欢迎来到 StackOverflow!只是一个提示,你应该使用三个反引号 ``` 来包装你的表/代码,它将代码格式化为一个易于阅读的代码块。我还建议您正确对齐和缩进任何表格/代码,这样更容易阅读并增加您获得帮助的可能性并减少您被否决的机会。糟糕的格式可能是您收到一票或多票反对票的原因。
  • 现在已修复。
  • 很好,好多了:) 谢谢!

标签: java informatica informatica-powercenter


【解决方案1】:

您应该在连接器转换中连接这两个表。 使用左(主)外连接,然后将其放入目标。然后将右表中的 BETRG 列映射到目标,并将左表中的其余列映射到目标。 发生的情况是,当没有匹配时,BETRG 将为空。把它变成一个表达式,看看它的值是空还是空,然后把它改成 0 或者你想要的值。

【讨论】:

  • 我必须事先过滤掉 QUALF 013,因为它们是同一数据结构的一部分。这行不通。
【解决方案2】:

这是我创建的,但不幸的是,目前它仅适用于行级别,而不适用于整个数据。我正在努力使代码正常运行:

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();
}

【讨论】:

    【解决方案3】:

    以下是有效的:

    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(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多