修补或更新嵌套集合不起作用


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 更新嵌套集合颜色值,但我们返回错误(Patch 具有无效参数(。

没有任何语句无法更新嵌套集合值。

有人可以帮我解决这个问题吗?

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

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 上修补外部集合。

希望这有帮助!

最新更新