Powerapps

PowerappsでCollectionを操作する。(Patch,UpdateIf,Remove)

Powerappsのコレクションを編集用のギャラリーから更新する方法

動画配信も始めたのでぜひそちらもチェックしてみてください。
(Powerapps関連ではないですが、15年間磨き続けた超時短パソコンテク動画です。)

  1. 作成:Patch
  2. 更新:Patch、Updateif
  3. 一括更新:Patch
  4. 削除:Remove
  5. 一括削除:Clear

色々やり方はあるのですが、特に一括(for allで更新するところ)が結構はまってしまったので備忘録として記事にしました。

今回テスト用に作ったのは以下のアプリ

  1. コレクションを編集するためのギャラリー
  2. コレクションを参照するためのテーブル
  3. 編集用のギャラリーに空白レコードを挿入するアイコン(Patchでコレクションにからレコードを作成しています。)
  4. コレクションを削除するアイコン
  5. ギャラリーでの編集を一括で更新するボタン(Patchバージョン)
  6. ギャラリーでの編集を一括で更新するボタン(updateifバージョン)
  7. ギャラリーで選択されている行を削除するアイコン
  8. ギャラリーで選択されている行のみ更新するアイコン(Patchバージョン)
  9. ギャラリーで選択されている行のみ更新するアイコン(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”と明示することでできました。