こんにちは、あんこ先生です。
数十件の修正対象を、フォームコントロールでひとつずつ行う。
とてもめんどうですよね。
もう少し楽したくありませんか?
実は、ギャラリーコントロールからまとめて修正できちゃうんです。
そこで、今回ではギャラリーコントロールでまとめて修正する方法を紹介します。
この方法ならサクサクっと修正できちゃいますよ。
すぐ使えるコピペ用コードも用意しているので、動作を確認してみましょう!
そもそもギャラリーがなにかわからない、ちょっと復習したいって人はこの記事をどうぞ。
ギャラリーコントロールからレコードをまとめて修正する
当機能は、ギャラリーコントロールの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
まとめ
今回はギャラリーコントロールで選択したレコードをまとめて更新する方法を紹介しました。
修正項目が少ない場合、単体でも、フォームコントロールより利便性が高いですよね。
使い方はアイデア次第!さっそくアプリに組み込んで動作させてみましょう!
なんとなく形になってきましたね。
つぎは、まとめて更新する機能です。