Azure Logi c Приложения формируют новый массив из двух коллекций массивов на основе условия - PullRequest
0 голосов
/ 10 марта 2020

У меня есть две коллекции массивов, как показано ниже

"**entitiy1**": [
{
  "lotNumber": "Lot04",
  "itemId": "1000123",
  "locationId": "65668"
},
{
  "lotNumber": "Lot02",
  "itemId": "1000123"
  "locationId": "1000006"
}]


"**entitiy2**":[
{
"storageLocationId": "1000006",
"storageLocationName": "Back Cooler"
},
{
"storageLocationId": "1000007",
"storageLocationName": "Stock Room"
}]

Окончательный новый массив должен быть сформирован путем сопоставления данных с использованием locationId и storageLocationId

[{
  "lotNumber": "Lot02",
  "itemId": "1000123"
  "locationId": "1000006",
  "storageLocationName":"Back Cooler"
}]

Я пытаюсь, как показано ниже. Я перебираю один массив и фильтрую второй массив с текущим условием соответствия элементов. Но для каждого l oop всегда отображается как неудачный. Отображается как предыдущая и следующая итерационные ссылки. Когда мы перейдем к следующей итерации, она отобразится как переданная для соответствующего элемента. Но мне нужен только соответствующий вывод

enter image description here

3-я строка имеет соответствующую запись enter image description here

Как можно сформировать окончательный массив со всеми соответствующими записями?

"For_each": {
            "actions": {
                "Append_to_array_variable": {
                    "inputs": {
                        "name": "finalArray",
                        "value": "@outputs('Compose')"
                    },
                    "runAfter": {
                        "Compose": [
                            "Succeeded"
                        ]
                    },
                    "type": "AppendToArrayVariable"
                },
                "Compose": {
                    "inputs": {
                        "itemCount": "@items('For_each')?['itemCount']",
                        "locationId": "@items('For_each')?['locationId']",
                        "locationName": "@body('Filter_array')?[0]['storageLocationName']",
                        "lotNumber": "@items('For_each')?['lotNumber']",
                        "sellByDate": "@items('For_each')?['sellByDate']"
                    },
                    "runAfter": {
                        "Filter_array": [
                            "Succeeded"
                        ]
                    },
                    "type": "Compose"
                },
                "Filter_array": {
                    "inputs": {
                        "from": "@body('Select_ESO_Locations')",
                        "where": "@equals(string(item()['storageLocationId']), string(items('For_each')['locationId']))"
                    },
                    "runAfter": {},
                    "type": "Query"
                }
            },
            "foreach": "@body('Select_LSO_Locations')",
            "runAfter": {
                "Initialize_variable": [
                    "Succeeded"
                ]
            },
            "type": "Foreach"
        }

1 Ответ

0 голосов
/ 11 марта 2020

Ваше действие создания не выполнено, потому что вы пытаетесь прочитать из отфильтрованного массива, используя жестко закодированный индекс [0]. Просто измените способ чтения значения на Inside для каждого в Compose вместо

"locationName": "@body('Filter_array')?[0]['storageLocationName']",

do

"locationName": "@body('Filter_array')?[0]?['storageLocationName']",

Ваш измененный For Each должен выглядеть следующим образом

"For_each": {
            "actions": {
                "Append_to_array_variable": {
                    "inputs": {
                        "name": "finalArray",
                        "value": "@outputs('Compose')"
                    },
                    "runAfter": {
                        "Compose": [
                            "Succeeded"
                        ]
                    },
                    "type": "AppendToArrayVariable"
                },
                "Compose": {
                    "inputs": {
                        "itemCount": "@items('For_each')?['itemCount']",
                        "locationId": "@items('For_each')?['locationId']",
                        "locationName": "@body('Filter_array')?[0]?['storageLocationName']",
                        "lotNumber": "@items('For_each')?['lotNumber']",
                        "sellByDate": "@items('For_each')?['sellByDate']"
                    },
                    "runAfter": {
                        "Filter_array": [
                            "Succeeded"
                        ]
                    },
                    "type": "Compose"
                },
                "Filter_array": {
                    "inputs": {
                        "from": "@body('Select_ESO_Locations')",
                        "where": "@equals(string(item()['storageLocationId']), string(items('For_each')['locationId']))"
                    },
                    "runAfter": {},
                    "type": "Query"
                }
            },
            "foreach": "@body('Select_LSO_Locations')",
            "runAfter": {
                "Initialize_variable": [
                    "Succeeded"
                ]
            },
            "type": "Foreach"
        }

PS При этом, пожалуйста, рассмотрите также следующие варианты 1) Используйте жидкостное преобразование, которое преобразует json в json. Вы будете иметь больше контроля над преобразованием, написав жидкостное преобразование. Обратите внимание, что для этого требуется учетная запись интеграции, и если вы используете ее на своем предприятии, я настоятельно рекомендую этот путь 2) Используйте функции Azure для преобразования

...