【问题标题】:Flatten Invoice Header with Invoice Lines in Kettle在 Kettle 中使用发票行展平发票抬头
【发布时间】:2017-10-11 10:54:37
【问题描述】:

如果您有一个包含多个值(发票编号、日期、位置)的发票抬头和一个未知数量的具有多个值(产品、价格、税)的发票行,有没有办法将此数据扁平化为一行在发票行数量因发票而异的情况下扩展?


输入示例-

{"InvoiceRecords": [{
    "InvoiceDate": "8/9/2017 12:00:00 AM",
    "InvoiceLocation": "002",
    "InvoiceNumber": "2004085",
    "InvoiceRecordHeaderDetails": [{
        "InvNum": "2004085",
        "Location": "002",
        "InvDate": "8/9/2017 12:00:00 AM"
    }],
    "InvoiceRecordLineItemDetails": [{
        "UniqueID": "3939934",
        "InvNum": "2004085",
        "LINEITEM": "1",
        "CUSTID": "PREAA",
        "DEPTID": "320306",
        "PRODID": "088856",
        "ProdDesc": "STATE UST",
        "Unitprice": "0.003",
        "QuantShare": "237.5",
        "TaxRate": "7.25",
        "taxamount": "0.05"
    }],
    "InvoiceTaxCodeDetails": [{
        "InvNum": "2004085",
        "LineItem": "1",
        "UniqueID": "34",
        "taxCode": "SALES TAX",
        "taxrate": "7.25",
        "maxtax": "0"
    }]
}]}

我需要同一行中的所有项目(允许在给定发票记录上存在多个行项目和/或多个税码项目。


输出示例(注意:下面的“_n”指未确定的发票行和可能的税行数量):

{"InvoiceRecords": [{
    "InvoiceDate": "8/9/2017 12:00:00 AM",
    "InvoiceLocation": "002",
    "InvoiceNumber": "2004085",
    "InvoiceRecordHeaderDetailsInvNum": "2004085",
    "InvoiceRecordHeaderDetailsInvNumLocation": "002",
    "InvoiceRecordHeaderDetailsInvNumInvDate": "8/9/2017 12:00:00 AM",
    "InvoiceRecordLineItemDetailsUniqueID_1": "3939934",
    "InvoiceRecordLineItemDetailsInvNum_1": "2004085",
    "InvoiceRecordLineItemDetailsLINEITEM_1": "1",
    "InvoiceRecordLineItemDetailsCUSTID_1": "PREAA",
    "InvoiceRecordLineItemDetailsDEPTID_1": "320306",
    "InvoiceRecordLineItemDetailsPRODID_1": "088856",
    "InvoiceRecordLineItemDetailsProdDesc_1": "STATE UST",
    "InvoiceRecordLineItemDetailsUnitprice_1": "0.003",
    "InvoiceRecordLineItemDetailsQuantShare_1": "237.5",
    "InvoiceRecordLineItemDetailsTaxRate_1": "7.25",
    "InvoiceRecordLineItemDetailstaxamount_1": "0.05",
    "InvoiceTaxCodeDetailsInvNum_1": "2004085",
    "InvoiceTaxCodeDetailsLineItem_1": "1",
    "InvoiceTaxCodeDetailsUniqueID_1": "34",
    "InvoiceTaxCodeDetailstaxCode_1": "SALES TAX",
    "InvoiceTaxCodeDetailstaxrate_1": "7.25",
    "InvoiceTaxCodeDetailsmaxtax_1": "0",
    "InvoiceRecordLineItemDetailsUniqueID_n": "3939934",
    "InvoiceRecordLineItemDetailsInvNum_n": "2004085",
    "InvoiceRecordLineItemDetailsLINEITEM_n": "1",
    "InvoiceRecordLineItemDetailsCUSTID_n": "PREAA",
    "InvoiceRecordLineItemDetailsDEPTID_n": "320306",
    "InvoiceRecordLineItemDetailsPRODID_n": "088856",
    "InvoiceRecordLineItemDetailsProdDesc_n": "STATE UST",
    "InvoiceRecordLineItemDetailsUnitprice_n": "0.003",
    "InvoiceRecordLineItemDetailsQuantShare_n": "237.5",
    "InvoiceRecordLineItemDetailsTaxRate_n": "7.25",
    "InvoiceRecordLineItemDetailstaxamount_n": "0.05",
    "InvoiceTaxCodeDetailsInvNum_n": "2004085",
    "InvoiceTaxCodeDetailsLineItem_n": "1",
    "InvoiceTaxCodeDetailsUniqueID_n": "34",
    "InvoiceTaxCodeDetailstaxCode_n": "SALES TAX",
    "InvoiceTaxCodeDetailstaxrate_n": "7.25",
    "InvoiceTaxCodeDetailsmaxtax_n": "0"
}]}

谢谢!

【问题讨论】:

  • 欢迎提供三行示例!
  • 当然有。问题是它们有很多,具体取决于数据的形状。对于输入,您有一行,后跟任意数量的行。对于输出,您需要每张发票一行。您希望您的 lineitem 数据包含哪种类型的数据:字符串?数组?一个 XML? JSON?
  • @AlainD,我发布了一个示例。谢谢!
  • 所以输入是一行,后跟任意数量的行。输出是包含 JSON 的一行,它是 {header, [item], footer} 的数组。
  • 输入就是上面的输入例子。输出需要是 {header, [item], footer} 的数组,其中 [item] 是一个输出 [item] 中示例中的所有 [items](如上面的输出示例 2。)

标签: pentaho kettle flatten pentaho-data-integration denormalized


【解决方案1】:

您在spoon.bat 附近的samples 目录中有一个类似问题的示例。看看samples/transformation/XML Add 并在第一个巧克力中幸存下来:他们做的事情要复杂得多,只是为了展示所有可能的东西。

在您的情况下,使用Switch/Case 拆分,标题中的输入流,项目并设法在每个上保留 InvoiceNumber(稍后会详细介绍)。将三个流转换为 JSON(使用 JSON 输出,或者更简单,使用 Javascript)。然后你 Group by InvoiceNumber 的项目。通过 InvoiceNumber 加入三个流,为此我建议在标题流中使用 lookup stream,然后在页脚流中使用另一个 lookup stream。使用另一个 javascript 并将数据视为字符串,您可以构建格式为 { header, [item], footer} 的 JSON 行,您可以将其 Group by 连接起来只有一行。

有些工作,但相当标准,除了在项目和页脚上获取 InvoiceNumber 的棘手部分,因为它们已从流程中消失。为此,您可以使用 javascript 保留这些值,除非重新定义。添加一个新的启动脚本[右键单击选项卡顶部的Script1,添加一个副本,右键单击刚刚创建的Script1_0,并将其定义为启动脚本]。

关于这个启动脚本:

var PrevInvoiceNumber = -1;

在主脚本上:

if(InvoiceNumber && PrevInvoiceNumber!=InvoiceNumber)
    PrevInvoiceNumber = InvoiceNumber

然后您应该会在每行看到 PrevInvoiceNumber 的数据,它等于发票的预期 InvoiceNumber。

【讨论】:

  • 我认为这是对错误问题的正确答案。我猜你更喜欢我更正你更正问题的答案。不过我的时间已经晚了,你得等明天。基本上,它是相同的,除了您使用 3 个 JSON 输入(页眉、项目、页脚)读取数据并保留 InvoiceNr(这在 JSON 输入上是可能的)。生成带有序列号的 _n,创建键:值对,将字段拆分为行,对它们进行排序并将它们分组到单个输出中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多