【问题标题】:Patching or updating a nested collection is not working修补或更新嵌套集合不起作用
【发布时间】:2020-09-24 06:12:47
【问题描述】:
ClearCollect(
    Coll_Products,
    {
        Id: 1,
        Title: "Apple",
        coll_types: [
            {
                Id: 1,
                color: "Red"
            },
            {
                Id: 2,
                color: "Green"
            }
        ]
    },
    {
        Id: 2,
        Title: "Grapes",
        coll_types: [
            {
                Id: 1,
                color: "Black"
            },
            {
                Id: 2,
                color: "Green"
            }
        ]
    }
);

Patch(Coll_Products,Lookup(Lookup(Coll_Products,Id=2).coll_types,Id=1),{color:"purple"});
//or
Patch(Coll_Products,Lookup(Lookup(Coll_Products,Id=2).coll_types,Id=1),{color:"purple"});
//or
Patch(Lookup(Coll_Products,Id=2).coll_types.Value,Lookup(Lookup(Coll_Products,Id=2).coll_types,Id=1),{color:"purple"});

我们正在尝试根据 Id 更新嵌套集合颜色值,但返回错误(补丁包含无效参数)。

没有一个语句不能更新嵌套集合值。

谁能帮我解决这个问题?

【问题讨论】:

    标签: powerapps powerapps-canvas powerapps-collection


    【解决方案1】:

    由于您在另一个集合的记录中拥有一个集合,因此您需要做一些补丁:从嵌套集合一直到外部集合。对于您拥有的集合(稍后在此答案中查看以更好地实现此方案),您可以使用以下表达式对其进行修补:

    Set(recordToPatch, LookUp(Coll_Products, Id = 2)); // 1
    ClearCollect(nestedCollectionToPatch, recordToPatch.coll_types); // 2
    Set(nestedRecordToPatch, LookUp(nestedCollectionToPatch, Value.Id = 1)); // 3
    Set(patchedNestedRecordValue, Patch(nestedRecordToPatch.Value, { color: "Purple" })); // 4
    Set(patchedNestedRecord, Patch(nestedRecordToPatch, { Value: patchedNestedRecordValue })); // 5
    Patch(nestedCollectionToPatch, nestedRecordToPatch, patchedNestedRecord); // 6
    Patch(Coll_Products, recordToPatch, { coll_types: nestedCollectionToPatch }); // 7
    

    我们可以少用几行,但这更容易(有点)理解;

    • 在第 1 行,我们正在检索要从外部集合中修补的记录
    • 在第 2 行,我们复制了与该记录关联的内部集合
    • 在第 3 行,我们在该集合中找到要修补的记录;请注意,Id 属性位于 Value 包装器中,因此我们需要先修补包装的记录
    • 在第 4 行,我们终于修补了打包的记录
    • 在第 5 行,我们将该记录再次包装在 Value 中,因此我们有了要修补到内部集合的记录的新值
    • 在第 6 行,我们修补嵌套集合
    • 在第 7 行,我们最终用更新的嵌套集合修补了外部集合

    请注意,在第 3 步中,我们必须从 Value 属性中解开对象。这是因为当您使用[...] 语法创建集合时,它相当于一个名为Value 的具有单个列的表。因此,如果我们显示您的集合的值(例如,使用 JSON 函数),您将拥有:

    [
      {
        "Id": 1,
        "Title": "Apple",
        "coll_types": [
          {
            "Value": {
              "Id": 1,
              "color": "Red"
            }
          },
          {
            "Value": {
              "Id": 2,
              "color": "Green"
            }
          }
        ]
      },
      {
        "Id": 2,
        "Title": "Grapes",
        "coll_types": [
          {
            "Value": {
              "Id": 1,
              "color": "Black"
            }
          },
          {
            "Value": {
              "Id": 2,
              "color": "Green"
            }
          }
        ]
      }
    ]
    

    为了简化这种结构,可以使用 Table 函数来防止嵌套集合被包装在具有 Value 属性的记录中:

    ClearCollect(
        Coll_Products2,
        {
            Id: 1,
            Title: "Apple",
            coll_types: Table({ Id: 1, color: "Red" }, { Id: 2, color: "Green" })
        },
        {
            Id: 2,
            Title: "Grapes",
            coll_types: Table({ Id: 1, color: "Black" }, { Id: 2, color: "Green" })
        }
    )
    

    这相当于这个集合:

    [
      {
        "Id": 1,
        "Title": "Apple",
        "coll_types": [
          {
            "Id": 1,
            "color": "Red"
          },
          {
            "Id": 2,
            "color": "Green"
          }
        ]
      },
      {
        "Id": 2,
        "Title": "Grapes",
        "coll_types": [
          {
            "Id": 1,
            "color": "Purple"
          },
          {
            "Id": 2,
            "color": "Green"
          }
        ]
      }
    ]
    

    如果嵌套集合中没有包装对象,修补它会变得容易一些:

    Set(recordToPatch2, LookUp(Coll_Products2, Id = 2)); // 1
    ClearCollect(nestedCollectionToPatch2, recordToPatch2.coll_types); // 2
    Patch(nestedCollectionToPatch2, LookUp(nestedCollectionToPatch2, Id = 1), { color: "Purple" }); // 3
    Patch(Coll_Products2, recordToPatch2, { coll_types: nestedCollectionToPatch2 }); // 4
    

    前两个步骤相同。但是我们现在可以直接在第 3 步修补嵌套集合,然后在第 4 步修补外部集合。

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回答,我们会尝试更新您的信息
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2016-02-13
    • 2016-06-09
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多