简体   繁体   中英

For each inside map Dataweave

I am trying to do a for each on a database result set in Dataweave and not able to achieve the result.

Input payload:

{
    "x_orders_cursor": [{
        "LINE_QTY": 1,
        "ORDER_NUMBER": 11820490,
        "ORDERED_ITEM": "PAT1M",
        "LINE_UOM": "PC"
    }, {
        "LINE_QTY": 5000,
        "ORDER_NUMBER": 11820542,
        "ORDERED_ITEM": "ACC62-A-D",
        "LINE_NUMBER": 1,
        "LINE_UOM": "PC"
    }, {
        "LINE_QTY": 2000,
        "ORDER_NUMBER": 11820542,
        "ORDERED_ITEM": "ACC62-A-D",
        "LINE_NUMBER": 2,
        "LINE_UOM": "PC"
    }]
}

Expected Payload:

{
    "Orders": [
        {
            "OrderNum": "11820490",
            "Lines": [
                {
                    "LineNum": 1,
                    "ProductNum": "PAT1M",
                    "TxnQty": 1,
                    "TxnQtyUOM": "PC"
                }
            ]
        },
        {
            "OrderNum": "11820542",
            "Lines": [
                {
                    "LineNum": 1,
                    "ProductNum": "ACC62-A-D",
                    "TxnQty": 1000,
                    "TxnQtyUOM": "PC"
                },
                {
                    "LineNum": 2,
                    "ProductNum": "ACC62-A-D",
                    "TxnQty": 2000,
                    "TxnQtyUOM": "PC"
                }
            ]
        }
    ]
}

Result set is based on a database table that stores both Order Number and Line Number.

You have to use groupBy for grouping line numbers from same order then map it. Please refer following code

%dw 1.0
%output application/json
---
Orders : payload.x_orders_cursor groupBy $.ORDER_NUMBER map {
    "OrderNum": $.ORDER_NUMBER[0],
        "Lines": $ map (LineDetails,index) ->{
            "LineNum": LineDetails.LINE_NUMBER default 1,
            "ProductNum": LineDetails.ORDERED_ITEM,
            "TxnQty": LineDetails.LINE_QTY,
            "TxnQtyUOM": LineDetails.LINE_UOM
        } orderBy $.LineNum
} orderBy $.OrderNum

I have used orderBy for ordering order and line items with order number and line numbers respectively

Hope this helps.

Use the map and groupby operators to do this. Should be on below lines

payload groupBy $.ORDER_NUMBER map {
OrderNum: $.ORDER_NUMBER[0],
Lines": $ map (val,index) -> {
            LineNum: val.LINE_NUMBER default 1,
            ProductNum: val.ORDERED_ITEM,
            TxnQty: val.LINE_QTY,
            TxnQtyUOM: val.LINE_UOM
        } orderBy $.LineNum
} orderBy $.OrderNum

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM