【PowerApps】複数行データを一括でコレクションに保存する方法

スポンサードリンク



こんにちは。sinyです。

この記事では、PowerAppsのギャラリー上に表示された複数行のデータを一括で新規登録したり、変更する手順についてまとめました。

試行錯誤の末にこのやり方でうまくできましたが、「もっとよいやりかたあるよ!」といった情報がありましたらご指摘いただけると幸いです。

一括登録機能の概要

ここでは、下図のような簡易的な作業報告アプリを例に複数の作業項目データを一括でCollection内に登録する機能の実装方法を説明します。

動作仕様
  • ホーム画面(HomeScreen)の新規登録ボタンを押すと新規作成画面(NewFormScreen)に遷移する。
  • 新規作成ボタンの「+」マークを押すとギャラリーに1行作業項目の入力欄が追加される。
  • ギャラリーの各行の保存ボタンを押すとその行のデータがCollection(コレクション名をWorkColとする)に反映される。
  • ギャラリーの各行のデータを一括でCollectionに反映させるには一括保存ボタンを押す。
  • データソースへの保存は画面上の登録ボタンを押した際に初めて反映される。
    ※作業項目の保存ボタンはあくまで一時的にコレクション(WorkCol)に保存するための機能です。
  • データソースとしては作業報告マスターテーブルと作業明細テーブルが1対多の関係で存在するものとします。
  • MasterFormのデータソースがマスターテーブル、DetailFormGalleryのデータソースが作業明細のデータを格納するコレクション(WorkCol)に設定されている前提で話を進めます。
  • 図に書いてあるdropdown,task,resultはDetailFormGalleryに配置した部品名です。

実装手順

下図に従って画面、機能を実装していきます。

①ホーム画面の名称をHomeScreenとします。
②新規作成画面の名称をNewFormScreenとします。

まず最初にHomeScreen上に新規登録ボタンを追加し、OnSelectプロパティに以下のコードを設定します。

NewForm(MasterForm);
ClearCollect(WorkCol, {Priority:"低",WorkContent:"", Status:"", saveBtn:true});
Navigate(NewFormScreen);

 

NewForm(MasterForm)MasterFormを編集モードで開く設定にします。
また、次のClearCollectでは作業項目の初期データを生成してWorkColというコレクションに格納しています。
これは新規作成画面を開いた際に初期値にセットされた作業項目の入力欄を表示させるために利用しています。
最後にNavigate関数でNewFormScreen画面に移動します。

続いて作業項目を入力するギャラリー(DetailFormGallery)の設定です。
ここでは作業項目の項目としては優先度、作業項目、結果の3つを定義しています。

優先度はドロップダウン型、それ以外はテキスト入力で構成しています。
作業項目にはそれぞれ保存、編集、削除ボタンを配置します。
保存ボタンを押すと編集ボタンだけが表示され、編集ボタンを押すと保存、削除ボタンだけが表示されるようにします。

また、保存ボタンを押した際はその作業項目を参照モードに変更します。

まず、作業項目毎に用意されている保存ボタンを押した際にその行の内容をコレクション(WorkCol)に反映させるため、保存ボタンのOnSelectに以下の関数を設定します。

Patch(WorkCol, ThisItem, {Priority:Dropdown.SelectedText.Value, WorkContent:task.Text, Status:result.Text,saveBtn:false});

 

Patch関数を使ってThisItem(作業項目の特定データ)をWorkColに登録しています。
Patch関数の第3引数は作業項目の各項目の要素(優先度:dropdown、作業項目task、結果:result)に指定された値を指定しています。

saveBtnは保存、編集、削除ボタンの表示/非表示を制御するための変数です。

削除ボタンはOnSelectに以下を定義します。

Remove(WorkCol,ThisItem)

 

コレクションなどからデータを削除したい場合はRemove関数を利用します。
ThisItemを指定することで「その行のデータを削除する」といった形で削除処理を実装できます。

編集ボタンはOnSeectに以下を定義します。

Patch(WorkCol, ThisItem,{saveBtn:true})

 

Patch関数を使って現在のデータ(ThisItem)のSaveBtnの値をFalseに設定することで編集できるようにしています。

なお、保存ボタンを押した行は編集不可にしたいので、作業項目の各要素(優先度:dropdown、作業項目task、結果:result)のDisplayModeに以下の関数を設定することで実現しています。

If(ThisItem.saveBtn, DisplayModeEdit,DisplayMode.View)

また、作業項目の右側にある「+」ボタンを押したときに動的に作業項目行を追加するために「+」マークのOnSelectに以下の関数を定義します。

Collect(WorkCol, {Priority:"低",WorkContent:"", Status:"", saveBtn:true});

 

Collect関数を使ってWorkColに初期値に設定された作業項目データを追加しているだけです。

最後に新規登録画面上にある「登録」画面を押したときに新規登録画面で入力した作業報告マスターデータとそれに紐づく作業項目テーブルデータが登録されるようにします。

まず、登録ボタンのOnSeectプロパティに以下を定義します。

SubmitForm(MasterForm);

SubmitForm関数の引数にMasterFormを指定することで作業報告マスターテーブルにデータを登録します。

次にMasterFormのOnSuccessプロパティに以下を設定し、作業報告マスタテーブルに今登録されたID情報を使ってそれに紐づく作業明細データを作業明細テーブルに登録させています。

 

ForAll(WorkCol,
Patch(作業明細, Defaults(作業明細),
{優先度: Priority, 作業項目: WorkContent, 進捗状況:Status, 明細ID:MasterForm.LastSubmit.ID}));
Refresh(作業報告);
Refresh(作業明細);
Notify("データ登録が完了しました。",NotificationType.Success);
Navigate(HomeScreen);

 

簡単に説明すると、ForAll(WorkCol~の部分でWorkColに格納されている作業項目データ1件1件に対してループ処理を廻し、 Patch(作業明細~で作業明細というテーブルにPatch関数でデータを登録させています。

明細ID:MasterForm.LastSubmit.IDの部分ですが、作業報告マスターテーブルのIDと作業明細テーブルの明細IDが外部キー的な構造になっている前提で、MasterForm.LastSubmit.IDと指定することで今登録された作業報告マスターデータのIDと明細IDを紐づけるような設定にしています。

LastSubmit
LastSubmit は、そのFormがSubmitされた結果の値を参照できます。
今回の例ではMasterForm.LastSubmit.IDとすることで登録されたデータの[ID]を取得しています。
以上で基本的なデータ登録処理は完成しましたが、入力する作業項目数が多い場合1つ1つ保存ボタンを押してCollectionにデータを反映し、最後に登録ボタンを押してデータソースへデータを反映させるというオペレーションになるため、UI的にちょっといけてないです。
できれば、作業項目は一括で保存確定→登録ボタンでデータ反映としたいところです。
そこで作業項目を一括でWorkColに反映させる一括保存ボタンを追加します。
一括登録ボタンのOnSelectプロパティに以下を定義することでDetailFormGalleryギャラリーに存在するデータすべてに対して一括でWorkColコレクションにデータを反映させることが出来ます。
ForAll(DetailFormGallery.AllItems,
Patch(WorkCol, ThisRecord,{Priority:ThisRecord.Dropdown.SelectedText.Value,WorkContent:ThisRecord.task.Text,
Status:ThisRecord.result.Text,saveBtn:false}));

 

ForAll(ギャラリー名.AllItems~とすることでギャラリーのすべてのデータに対してForループを廻すことが出来ます。

また、Forループ内でPatch(WorkCol, ThisRecord~の様にしてデータを登録していますが、Patch関数の第2引数にはThisItemではなくThisRecordと指定するのがポイントです。

ThisRecordは今ループ処理で対象としているギャラリーのデータが格納されているので、ThisRecord.task.Textのようにアクセスすることで各項目の値を取得することが出来ます。

以上、「PowerAppsのギャラリーで一括保存する方法」でした。

 

 

 

おすすめの記事