PowerApps│ギャラリーで選択したレコードをまとめて修正する方法

アイキャッチ

こんにちは、あんこ先生です。

数十件の修正対象を、フォームコントロールでひとつずつ行う。

とてもめんどうですよね。

もう少し楽したくありませんか?

実は、ギャラリーコントロールからまとめて修正できちゃうんです。

そこで、今回ではギャラリーコントロールでまとめて修正する方法を紹介します。

この方法ならサクサクっと修正できちゃいますよ。

すぐ使えるコピペ用コードも用意しているので、動作を確認してみましょう!

そもそもギャラリーがなにかわからない、ちょっと復習したいって人はこの記事をどうぞ。


ギャラリーコントロールからレコードをまとめて修正する

当機能は、ギャラリーコントロールAllItemsプロパティForAll関数を組み合わせて実現していきます。

ForAll関数の使い方はこの記事で詳しく解説しています。

AllItemsプロパティとは、そのギャラリーコントロールに含まれるすべてのアイテムをテーブル化したものです。

データソースと異なり、テンプレートに追加した各種コントロールも含まれるのがポイントです。

そのテーブルから変更のあったレコードだけ、ForAll関数で更新していきます。

作成例では、都道府県ごとの人口を記録したデータソース(AreaPopulation)を使用しています。

いきなり完成では味気ないので、少しずつ機能を加えて解説していきますね。

テンプレートの作成方法


テンプレートにテキスト入力コントロールを埋め込む

まず、テンプレートに人口を修正するためのテキスト入力コントロールを埋め込みます。

あとはDefaultプロパティに次のコードを記載するだけです。

ThisItem.Population //人口


チェックすると入力欄をアクティブ化させる

何もしないと無条件で修正できてしまいます。

そこで、テンプレートにチェックボックスコントロールを埋め込みます。

これは、隣接するチェックボタンコントロールにチェックを入れた場合のみ、テキスト入力コントロールに入力できるよう制御するためです。

ついでにキャンセル処理として、チェックを外したときは初期値に戻すように設定します。

それぞれ、次のコードを記載すれば動作します。

DisplayModeプロパティ

//表示モード切替
If(Checkbox01.Value,DisplayMode.Edit,DisplayMode.View)

OnUncheckプロパティ

//初期化
Reset(TextInput01)


数値が修正されると背景の色を変える

次は、テンプレートにアイコンコントロール四角形を最背面に埋め込みます。

これは、修正箇所の背景色を変える機能を追加するためです。

そして、次のコードを記載します。

Fillプロパティ

//背景色の切替
If(ThisItem.Population=Value(TextInput01.Text),
     RGBA(255, 255, 255, 1),
     RGBA(246, 88, 16, 0.25)
)


数値が修正されると保存用アイコンを表示する

最後に、データソースに保存するため、テンプレートにアイコンコントロールを埋め込みます。

修正対象ではないのに更新できても仕方ないので、表示条件を設けます。

ついでに更新もさせます。この時点では、該当レコード単体の更新になります。

ちなみに、レコードを更新するとギャラリー内のコントロールはすべてリセットされます。

そのため、チェックボタンコントロールをリセットさせる処理は不要です。

アイコンには、次のコードを記載します。

Visibleプロパティ

//RectangleBackと連動
RectangleBack.Fill=RGBA(246, 88, 16, 0.25)
//こっちでも可
ThisItem.Population=Value(TextInput01.Text)

OnSelectプロパティ

//更新処理
Patch(AreaPopulation,ThisItem,{Population:Value(TextInput01.Text)})

なんとなく形になってきましたね。

つぎは、まとめて更新する機能です。

レコードをまとめて更新する方法


更新対象の絞り込み

SharePointリストは、まとめて更新してもリクエストは1件ずつ処理する仕様なので時間がかかります。

そのため、極力更新するレコードは絞り込む必要があります。

今回は設置したチェックボックスコントロールを利用し、それをキーに対象を絞り込んでいきます。

Filter(Gallery01.AllItems,Checkbox01.Value=true)

Filterのコードはたったこれだけです。

この記述でギャラリーコントロール内でチェックが入っているレコードのみ抽出します。

このような使い方ができるのでAllItemsプロパティが大好きです。


まとめて更新

ForAll関数と先ほどの絞り込みを使ってまとめて更新していきます。

ForAll関数は、指定したレコード数だけ処理を繰り返します。

従って、更新処理をチェックが入っているレコード数分繰り返すわけですね。

やり方は、ギャラリー外にアイコンコントロールをひとつ設置します。

そして、次のコードを記載します。

OnSelectプロパティ

//対象レコード数分、更新を繰り返す。
ForAll(Filter(Gallery01.AllItems,Checkbox01.Value=true),
    Patch(AreaPopulation,ThisRecord,
        {Population:Value(TextInput01.Text)}
    )
)

AllItemsプロパティは、初期100レコードしか読み込まれないため使用する際は注意が必要です。

なお、スクロールすることで100レコードずつ追加される特性があります。

今回はその特性を利用して、対象の全レコードを抽出しています。

変更前の数値を表示させる方法


アプリ起動時、コレクションへ退避させる

データソースを更新すると元の数値はわかりません。

そのため、アプリ起動時に一度コレクションに退避させます。

その値をテンプレートに埋め込むことで、修正前の数値を表示できます。

OnStartプロパティ

//アプリ起動時にコレクションへ
ClearCollect(_Bkup,AreaPopulation)


修正前の数値を表示する

修正前の数値表示用として、テンプレートにラベルコントロールを埋め込みます。

データソースとコレクションは同じレイアウトなので、連番(Sql)で紐づけします。

そして、次のコードを記載します。

Textプロパティ

//紐づけしたコレクションの人口を表示
LookUp(_Bkup,Sql=ThisItem.Sql).Population

まとめ

今回はギャラリーコントロールで選択したレコードをまとめて更新する方法を紹介しました。

修正項目が少ない場合、単体でも、フォームコントロールより利便性が高いですよね。

使い方はアイデア次第!さっそくアプリに組み込んで動作させてみましょう!

ご支援よろしくおねがいします

この記事を気に入ってくださった方、寄付してあげてもいいよという方がいらっしゃっいましたら、ご支援いただけると助かります。

下記リンクからAmazonギフト券で、金額は15円からお気持ちを入力してください。

受取人のメールアドレスは amazon@anko7793.com までお願いします。

メッセージもいただけるとたいへん喜びます。

よろしくお願いします。

Amazonギフト券(Eメールタイプ) 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
七草あんこ
非IT系中間管理職やってます。社命によりoffice365を主軸とした業務改善プロジェクトメンバーに任命されたことでPowerAppsと出会えました。いまではビジネス・プライベートを問わず、欠かせないツールになっています。導入初期やアプリ作成時に遭遇した諸問題の解決法とサンプルアプリの作り方を紹介していきます。主にTwitterで情報収集しているので不明点など呟いているとお邪魔するかもしれません。