Powerappsのコレクションを編集用のギャラリーから更新する方法
動画配信も始めたのでぜひそちらもチェックしてみてください。
(Powerapps関連ではないですが、15年間磨き続けた超時短パソコンテク動画です。)
- 作成:Patch
- 更新:Patch、Updateif
- 一括更新:Patch
- 削除:Remove
- 一括削除:Clear
色々やり方はあるのですが、特に一括(for allで更新するところ)が結構はまってしまったので備忘録として記事にしました。
今回テスト用に作ったのは以下のアプリ
- コレクションを編集するためのギャラリー
- コレクションを参照するためのテーブル
- 編集用のギャラリーに空白レコードを挿入するアイコン(Patchでコレクションにからレコードを作成しています。)
- コレクションを削除するアイコン
- ギャラリーでの編集を一括で更新するボタン(Patchバージョン)
- ギャラリーでの編集を一括で更新するボタン(updateifバージョン)
- ギャラリーで選択されている行を削除するアイコン
- ギャラリーで選択されている行のみ更新するアイコン(Patchバージョン)
- ギャラリーで選択されている行のみ更新するアイコン(Updateifバージョン)
③編集用のギャラリーに空白レコードを挿入
Set( Index, Index + 1 ); Collect( datacollection, { Index: Index, ischosen: false, name: "", phone: "", comments: "" } )
これはPatchではなくて単純にCollect関数で新規レコードをコレクションに追加しています。
レコード挿入時にIndex番号をインクリメントしてレコードに割り当てています。
一意の値がコレクションになければ更新、削除等するときにどのレコードが対象かの条件文が書けないのでこういう実装にしています。
④コレクションを削除する
Clear(datacollection); Set( Index, 0 ); Set( Index, Index + 1 ); Collect( datacollection, { Index: Index, ischosen: false, name: "", phone: "", comments: "" } )
Clear関数でコレクションを削除しています。※今回のテーマとは関連しないです。
コレクションをクリアした時点で新規のレコードを1レコード挿入する実装としています。
⑤ギャラリーでの編集を一括で更新するボタン
ForAll( RenameColumns( Gallery_for_Edit.AllItems, "Index", "tmpIndex" ), Patch( datacollection, LookUp( datacollection, Index = tmpIndex ), { name: TextInput_name.Text, phone: TextInput_telephone.Text, comments: TextInput_comment.Text } ) )
これが一番今回でハマったポイントです。
データソース側のカラム名とギャラリー側のカラム名が同じ場合はPatchでうまく処理できません。したがって今回は2~5行目でギャラリー側のカラム名を変更しています。
他にも、別名のカラムを追加したりする方法もあるようですが、うまくいかなくて最終的にRename(リネーム)することでうまくいきました。
⑥ギャラリーでの編集を一括で更新する
ForAll( RenameColumns( Gallery_for_Edit.AllItems, "Index", "tmpIndex" ), UpdateIf( datacollection, Index = tmpIndex, { name: TextInput_name.Text, phone: TextInput_telephone.Text, comments: TextInput_comment.Text } ) )
これはPatchの代わりにUpdateIf関数を利用した場合です。UpdateIfで書いた方が条件はシンプルに書けますが、PatchでもUpdateIfでもどちらでもいいでしょう。
⑦ギャラリーで選択されている行を削除する
Remove( datacollection, First( Filter( datacollection, Index = ThisItem.Index ) ) )
レコードの削除はRemove関数で実装しています。
これはシンプルなのであまり悩む要素がありませんでした。
⑧ギャラリーで選択されている行のみ更新する
Patch( datacollection, ThisItem, { name: TextInput_name.Text, phone: TextInput_telephone.Text, comments: TextInput_comment.Text } );
これはシンプルなのであまり悩む要素がありません。
⑨ギャラリーで選択されている行のみ更新する
UpdateIf( datacollection, Index = Gallery_for_Edit.Selected.Index, { name: TextInput_name.Text, phone: TextInput_telephone.Text, comments: TextInput_comment.Text } )
選択した行を1行更新するだけならPatchを使った方がシンプルです。そもそもUpdateifは条件に合致したレコードを一括で更新できる処理なので。今回は練習を兼ねて実施してみました。
3行目の条件を指定しているところがポイントなのですが、Gallery側を”Gallery_for_Edit.Selected.Index”と明示することでできました。