You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataWeave脚本未按预期生成4条记录问题排查请求

问题:DataWeave脚本无法为每个输入对象生成4条明细记录

需求说明

需要将输入JSON中的每个对象转换为扁平文件中的4条记录,其中ASC__c、CDF23__c、Option_Set__c、Statement_Message_ID__c四个键分别对应固定的:USRDSB:-FIELD-IND整数值,但当前脚本每个TSYS_ID仅生成1条明细记录,不符合预期。

输入JSON

[{
        "Statement_Message_ID__c": "15673",
        "Option_Set__c": "801",
        "TSYS_ID__c": "12346849",
        "ASC__c": "V01",
        "CDF23__c": "1"
    },
    {
        "Statement_Message_ID__c": "15839",
        "Option_Set__c": "813",
        "TSYS_ID__c": "12347015",
        "ASC__c": "V01",
        "CDF23__c": "1"
    }
]

当前使用的DataWeave脚本

%dw 2.0
output application/flatfile schemaPath = "schemas/VP.ffd", structureIdent="MultiSegment"
var fieldDataArray= 0 to 3
fun filterKey(keyName, keyArray) = sizeOf(keyArray filter ((item, index) -> item ~= keyName ))==1
---
{
    vps: {
        vps: [{
            ":USRDSB:-SOURCE": {
                ":USRDSB:-SOURCE": "SOURCE",
                ":USRDSB:-SOURCE-ID ": "MULESOFT"
            },
            ":USRDSB:-HEADER": {
                ":USRDSB:-HEADER": "HEADER",
                ":USRDSB:-TRANSMISSION-ID": "VTY"
            },
            ":USRDSB:-DETAIL-RECORD": payload map ( payload01 , indexOfPayload01 ) -> {
                
                ( fieldDataArray map  {
                    ":USRDSB:-FIELD-IND": flatten(payload01 pluck $$) match {
                        case k if(filterKey("Option_Set__c",flatten(payload01 pluck $$)) and $$ == 0) -> "019303" as Number 
                        case k if(filterKey("Statement_Message_ID__c",flatten(payload01 pluck $$)) and $$ == 1) -> "014205" as Number
                        case k if(filterKey("CDF23__c",flatten(payload01 pluck $$)) and $$ == 2) -> "008902"  as Number
                        case k if(filterKey("ASC__c",flatten(payload01 pluck $$)) and $$ == 3) -> "011206" as Number
                        else -> "1" as Number

                   }

                }),
                 ":USRDSB:-CARD-NBR": payload01.TSYS_ID__c,
                    ":USRDSB:-CUST-IND": "D",
                    ":USRDSB:-FIELD-DATA": payload01.Statement_Message_ID__c
                
            }
        }]
    }
}

FFD定义

form: COPYBOOK
structures:
- id: 'MultiSegment'
  name: MultiSegment
  data:
  - groupId: 'vps'
    items:
    - groupId: 'vps'
      count: '>1'
      items:
        - { idRef: ':USRDSB:-SOURCE', count: 1 }
        - { idRef: ':USRDSB:-HEADER', count: 1 }
        - { idRef: ':USRDSB:-DETAIL-RECORD', count: '>1' }
  
segments: 
- id: ':USRDSB:-SOURCE'
  values: 
  - { name: ':USRDSB:-COMMENT-IND', type: String, length: 1 }
  - { name: 'FILLER1', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-SOURCE', type: String, length: 6, value: 'SOURCE' }
  - { name: 'FILLER2', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-SOURCE-ID ', type: String, length: 8, value: 'MULESOFT' }
- id: ':USRDSB:-HEADER'
  values: 
  - { name: ':USRDSB:-COMMENT-IND', type: String, length: 1 }
  - { name: 'FILLER1', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-HEADER', type: String, length: 6, value: 'HEADER' }
  - { name: 'FILLER2', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-TRANSMISSION-ID', type: String, length: 8, value: 'TBC' }
  - { name: 'FILLER3', usage: U, type: String, length: 1 }
- id: ':USRDSB:-DETAIL-RECORD'
  values: 
  - { name: ':USRDSB:-COMMENT-IND', type: String, length: 1 }
  - { name: 'FILLER1', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-FIELD-IND', type: Integer, length: 6, format: { justify: ZEROES, sign: UNSIGNED }}
  - { name: 'FILLER2', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-CARD-NBR', type: String, length: 19 }
  - { name: 'FILLER3', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-CUST-IND', type: String, length: 1 }
  - { name: 'FILLER4', usage: U, type: String, length: 1 }
  - { name: ':USRDSB:-FIELD-DATA', type: String, length: 80 }
  - { name: 'FILLER5', usage: U, type: String, length: 9 }

当前输出

SOURCE MULESOFT
  HEADER VTY      
  011206 12346849            D 15673                                                                                    
  011206 12347015            D 15839   

预期输出

SOURCE MULESOFT
  HEADER SPLNSCRB
  019303 12346849            352
  008902 12346849            02  
  011206 12346849            D 15673  
  014205 12346849            F0015
  019303 12347015            353
  008902 12347015            03
  011206 12347015            V03
  014205 12347015            F0015

问题分析与修复

问题根源

当前脚本错误地将4个:USRDSB:-FIELD-IND字段塞到同一条明细记录中,而非生成4条独立记录。原脚本依赖pluck后的键索引顺序匹配字段值,逻辑脆弱且不符合扁平文件的结构要求。

修复后的DataWeave脚本

%dw 2.0
output application/flatfile schemaPath = "schemas/VP.ffd", structureIdent="MultiSegment"
// 定义字段映射关系:键名 -> FIELD-IND值、对应的数据处理逻辑
var fieldMappings = [
    { key: "Option_Set__c", fieldInd: "019303" as Number, dataFn: (val) -> "352" when val == "801" otherwise "353" },
    { key: "CDF23__c", fieldInd: "008902" as Number, dataFn: (val) -> "02" when val == "1" otherwise "03" },
    { key: "ASC__c", fieldInd: "011206" as Number, dataFn: (val) -> val },
    { key: "Statement_Message_ID__c", fieldInd: "014205" as Number, dataFn: (val) -> "F0015" }
]
---
{
    vps: {
        vps: [{
            ":USRDSB:-SOURCE": {
                ":USRDSB:-SOURCE": "SOURCE",
                ":USRDSB:-SOURCE-ID ": "MULESOFT"
            },
            ":USRDSB:-HEADER": {
                ":USRDSB:-HEADER": "HEADER",
                ":USRDSB:-TRANSMISSION-ID": "SPLNSCRB"
            },
            // 对每个输入对象,遍历映射表生成4条独立明细记录
            ":USRDSB:-DETAIL-RECORD": payload flatMap (item) -> 
                fieldMappings map (mapping) -> {
                    ":USRDSB:-FIELD-IND": mapping.fieldInd,
                    ":USRDSB:-CARD-NBR": item.TSYS_ID__c,
                    ":USRDSB:-CUST-IND": "", // 根据预期输出,部分记录该字段为空
                    ":USRDSB:-FIELD-DATA": mapping.dataFn(item[mapping.key])
                }
        }]
    }
}

关键改动说明

  1. 明确字段映射表:将键名与对应的:USRDSB:-FIELD-IND值、数据转换逻辑绑定,避免依赖键的索引顺序,逻辑更清晰且易维护。
  2. 生成独立明细记录:使用flatMap + map组合,对每个输入对象遍历映射表,生成4条独立的:USRDSB:-DETAIL-RECORD记录,符合预期结构。
  3. 匹配预期输出的字段值:调整HEADER的TRANSMISSION-ID为SPLNSCRB,根据预期输出设置:USRDSB:-CUST-IND的空值,以及对应字段数据的转换规则。
  4. 移除冗余函数:删除原脚本中冗余的filterKey函数,简化逻辑。

内容的提问来源于stack exchange,提问作者codebeget

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:44:59