Power Apps ForAll + Patch で複数レコードを一括更新する
ギャラリーやコレクションで保持している変更を一括で更新したい場合、ForAll()とPatch()を組み合わせて行うことができます。
追記:新しくよりスマートなやり方の記事を書きました。ご参考にしてください!
一般的によくハマること
とりあえずForAllで更新してみようとすると、大体失敗すると思います。
Collectionやギャラリーのカラムの名前とデータソースのカラムの名前がかぶってると失敗するので、処理中に出てくるカラム名はかぶらないようにしないといけません。
いくつかのやりかた
このカラムかぶりを解消する手段として、3種類あります。
・曖昧性除去演算子で回避する
・ギャラリーに非表示コントロールを追加して回避する
・カラム名を変更して回避する
どれを使う?
方法はいくつかありますが、その中でも個人的におすすめのAddColumnsを利用した方法について書いておきます。
AddColumnsでかぶりを解消する
下記ではID、Cost、Statusの3つのカラムがかぶっているケースです。
それぞれAddColumns()で違う名前でカラムを追加して、Patch()しています。
例
ForAll(
AddColumns(
colItems,
"colID",
ID,
"colCost",
Cost,
"colStatus",
Status
),
Patch(
DataSourceItems,
LookUp(
DataSourceItems,
ID = colID
),
{
Cost: colCost,
Status: colStatus
}
)
);
このようにすることで更新を行うことができます。
上記は更新時にカラム名の変更を行っていますが、カラム名の変更をコレクションを作る段階で行ってもいいと思います。
他の方法を避けた理由
だめというわけではありませんが、他の方法を避けた理由を書いておきます。
曖昧性除去演算子の方法
委任問題が発生したため、場合によるかなとおもって避けました。コードは短いので問題なければこちらでもいいと思います。
ギャラリーの方法
ギャラリーに出していない場合も考えられますし、非表示のコントロールを追加するのも嫌な感じがしたので避けました。
他の方法の詳細については、下記のサイトに乗っています。
参考URL
How to bulk update records in PowerApps
https://powerapps.microsoft.com/ja-jp/blog/bulk-update-using-forall-and-patch/
AddColumns リファレンス
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-table-shaping
Patch リファレンス
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-patch