Power Apps中ForAll+LookUp更新SharePoint数据异常及报错问题
问题概述
从Gallery选中2个条目(如MU002、MU005,各自Amount值为10),期望对应SharePoint的Menu列表中这两个条目的Amount各减1,但实际未选中的列表最早条目被修改,选中项无变化;使用ThisRecord.Menu_ID时触发网络错误:Fetching items failed. Possible invalid string in filter query,附带clientRequestId: 0861bfa4-2d87-49af-836d-1d3e5f865766与serviceRequestId: baee79a1-f0ed-4000-804a-b7c423855b49,同时SharePoint和本地集合的数值更新失效。
问题根源
- ForAll用法错误:Power Apps中
ForAll是表生成函数,而非循环语句,用它执行循环Patch会导致上下文变量引用混乱,ThisRecord作用域失效。 - 字段引用不明确:更新Menu列表时,
{Amount: Value(Amount) - 1}中的Amount未指定上下文,默认引用数据源当前记录值,而非选中项的数值,导致更新错误条目。 - 类型匹配问题:
Text(ThisRecord.Menu_ID)的多余格式转换,若Menu列表的Menu_ID与选中项的类型不匹配,会导致LookUp无法定位正确记录,最终修改第一条匹配的错误条目。 - 集合更新冲突:在
ForAll内部直接PatchSelectedItemsOrder集合,循环过程中集合内容变化会引发后续迭代的引用错误。
修正后的代码
If( CountRows(SelectedItemsOrder) > 0, With( { UserID: LookUp(User, Email.Email = User().Email, User_ID) }, With( { ExistingOrder: LookUp(Order, Date_Order = Today() && User_ID = UserID), IsDuplicateCarbonCopy: !IsBlank( LookUp(Order, Date_Order = Today() && Carbon_Copy.Email = If(IsBlank(ComboBox2.SelectedItems), User().Email, First(ComboBox2.SelectedItems).Email)) ) }, If( IsDuplicateCarbonCopy, Notify("คุณทำรายการซ้ำในวันนี้.", NotificationType.Error), With( { NewOrder: Patch( Order, Defaults(Order), { Food_1: If(CountRows(SelectedItemsOrder) >= 1, First(SelectedItemsOrder).Menu_ID, Blank()), Price_1: If(CountRows(SelectedItemsOrder) >= 1, First(SelectedItemsOrder).Price, Blank()), Food_2: If(CountRows(SelectedItemsOrder) >= 2, Last(FirstN(SelectedItemsOrder, 2)).Menu_ID, Blank()), Price_2: If(CountRows(SelectedItemsOrder) >= 2, Last(FirstN(SelectedItemsOrder, 2)).Price, Blank()), Total: Sum(Value(Label2_1.Text), Value(Label2_3.Text)), House: Text(LookUp(User, Email.Email = User().Email, House)), User_ID: UserID, Rice: cb_Kao.Value, Bag: cb_KubKao.Value, Detail: ti_Detail.Text, Date_Order: Today(), Carbon_Copy: If( IsBlank(ComboBox2.SelectedItems), LookUp(User, Email.Email = User().Email).Email, First(ComboBox2.SelectedItems) ), Credit: Value(ti_Credit_Order.Text), Net: Value(Label2_5.Text) }, Form2.Updates ) }, Notify("สั่งข้าวสำเร็จ.", NotificationType.Success); If( !IsBlank(NewOrder), // 生成批量更新表 Collect( tempUpdates, ForAll( SelectedItemsOrder As SelectedItem, If( !IsBlank(SelectedItem.Menu_ID) && Value(SelectedItem.Amount) >= 1, { ID: LookUp(Menu, Menu_ID = SelectedItem.Menu_ID).ID, // 用唯一ID定位记录 Amount: Value(SelectedItem.Amount) - 1 }, Blank() ) ) ); // 批量更新SharePoint Menu列表 Patch(Menu, tempUpdates); // 更新本地集合MenuCollection ForAll( SelectedItemsOrder As SelectedItem, UpdateIf( MenuCollection, Menu_ID = SelectedItem.Menu_ID, {Amount: Value(SelectedItem.Amount) - 1} ) ); // 清理临时集合 Clear(tempUpdates); // 检查库存不足项 ForAll( SelectedItemsOrder As SelectedItem, If(Value(SelectedItem.Amount) < 1, Notify("สินค้า " & SelectedItem.Menu_ID & " หมดแล้ว", NotificationType.Error)) ) ) ) ) ) ), Notify("No items selected", NotificationType.Error) ); Set(ShowConConfirm, false); Refresh(Order); ResetForm(Form2); Navigate(Scr_Main); Reset(ComboBox2); Clear(SelectedItemsOrder);
关键修正点
- 批量Patch优化:通过
ForAll生成包含唯一ID和更新值的临时表,一次性Patch到SharePoint,避免循环操作的上下文问题,提升性能。 - 唯一ID定位:使用SharePoint列表的
ID字段定位记录,比Menu_ID更可靠,避免类型匹配错误导致的LookUp失败。 - 明确上下文引用:用
As SelectedItem给循环项命名,避免ThisRecord的作用域冲突,确保引用选中项的正确字段。 - 分离库存检查:提前检查所有选中项的库存,避免部分更新后才报错。
- 简化无效条件:移除原代码中恒成立的
!IsBlank(ComboBox2.SelectedItems) || IsBlank(ComboBox2.SelectedItems)条件,精简逻辑。
额外建议
- 确保
Menu列表的Menu_ID字段类型与SelectedItemsOrder中的Menu_ID类型完全一致(如均为文本或数值),避免转换错误。 - 避免直接引用标签文本(如
Label2_1.Text),建议将计算逻辑存入变量或集合,提升稳定性。 - 本地集合
MenuCollection可通过Refresh(Menu)重新加载,避免手动Patch导致的同步问题。
内容的提问来源于stack exchange,提问作者ปฏิพล เหลนปก
相关产品推荐
相关产品推荐

