PowerAppsで複数リストへの同時登録 (1:N)


最近PowerApps Communityでよく見かける質問に、「リスト1とリスト2に同時にデータを登録したい。なお、リスト2は"詳細テーブル"のように使いたい」というものがありました。
今回の投稿では、PowerAppsで、1:Nの関係をもつ複数のリストに対して、データを同時登録する方法を解説します。
リストの表示方法は?とか、編集方法は?とかありますが、簡単のために新規登録のみを取り扱います。
なお、データソースはSharePoint Onlineのカスタムリストを利用します。

データ構成

今回は商品の発送を管理するようなアプリを例にします。
データ構成(リスト構成)は以下の図のとおりです。

データの構成としては発送の基本情報を格納する「発送リスト」1に対して、発送する商品情報を格納する「発送詳細リスト」がNの構成になります。

画面構成

発送情報と発送詳細情報を登録する画面の構成は以下の通りです。

画面左部は基本情報を入力する部分、これは発送リストのフォームを利用します。(SubmitとFrom.LastSubmitを利用したかったため)
一方右部ですが、発送する商品の商品名と数量を登録・表示しています。N個の商品を発送する想定なので、一度Collectionに商品を登録して、最後に一括登録します。

作り方

発送商品一覧側

発送商品は商品名と数量をドロップダウンから選択します。本来は商品名は商品マスターから選択させたいのですが、今回は割愛します。
商品と数量の一覧への追加は、Collect関数で行います。

If(
    IsBlank(
        LookUp(
            colCartItem,
            Name = ItemName.Selected.Name
        ).Quantity
    ), //まずは同一商品がリストにあるか検索
    Collect(
        colCartItem,
        {
            Name: ItemName.Selected.Name,
            Quantity: Value(ItemCount.Selected.Value)
        }
    ),//なければ商品と数量をCollectionに追加
    UpdateIf(
        colCartItem,
        Name = ItemName.Selected.Name,
        {
            Name: ItemName.Selected.Name,
            Quantity: Value(ItemCount.Selected.Value)
        }
    ) //存在すればUpdate
)

これで追加すると、collectionに基づいてGalleryを表示できます。商品一覧です。後ほどこのCollectionをリストに一括登録します。

基本情報側

発送先の基本情報を入力するフォームは特に何もしていません。
発送登録画面なので、DefaultMode → Newに変更していることと、OrderGuid列に関して以下のようにDefaultをGUID関数で設定しているくらいです。

登録処理

今回のメインである登録処理について説明します。
登録処理は緑の登録ボタンで行います。
処理の流れは:
1. ボタンクリックでフォームの内容を登録
2. フォームのOnSuccessで、Collectionの内容をPatch
となります。

1. フォームの内容を登録

登録ボタンでフォームをサブミットするだけです。

Button.OnSelect
SumitForm(Form1)


このサブミットの成功をもって、次の処理に移ります。

2. collectionの内容をPatch

発送する商品の名前と数量をリストに一括登録するために、ForAllとPatchを利用します。
発送基本情報のIDと各商品のレコードを結びつけるために、1.でサブミットした際のIDが必要になりますが、これは@yamad365 さんに教えてもらいました。
Form1のOnSuccessに以下のように記述します。

Form1.OnSuccess
ForAll(
    colCartItem,
    Patch(
        OrderDetail,
        {
            Title: Name,
            orderid: Form1.LastSubmit.ID,//ここがポイント!
            Amount: Quantity
        }
    )
)

サブミットした際に発行されたID(を含むレコードの情報)は、Form1.LastSubmit.*列名* で取得できます。これを用いて関連付けを行います。

以上で、2つのリストに対して、1:Nの関係にあるデータを一括登録できました。

動作イメージ

Twitterでつぶやいた動画です。
商品数量の修正はカートマークのボタンで、Collectionのアイテム削除はごみ箱マークで行います。


おまけ

商品発送の詳細リストには、出荷されたアイテムの数量と名前、出荷入荷区分が入っています。
これを利用すると在庫管理アプリを作ることも可能です。
こちらは1リストで完結するのでほとんどなにもすることはないので、後日投稿します。