PowerApps│Patch関数の使い方 基本編

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

データソースの更新に使うPatch関数を使って意図した処理を行えていますか?

PowerAppsでデータを登録・修正するには3つの方法があります。

そのうちの1つであるPatch関数、わたしは大好きです。

なぜなら、必要なところだけ更新できる、項目を省略しても自動で初期値が入るといった利点があるからです。

たとえば、都道府県リストの人口だけ更新したい場合、それ以外の項目を入力しなくて済みます。

また、ForAll関数と組み合わせれば全学生の身長をまとめて更新するといった使い方もできます。

Patch関数のすばらしさをなんとかして伝えたい!

そこで、今回は「特定の項目だけ更新したい」、「まとめて登録と更新を行いたい」といった初心者の方を対象に、Patch関数の使い方を解説します。

この記事を読めば、データ更新をマスターできますよ。

Patch関数の概要


Patch関数は、データソース内で1つ以上のレコードを作成や変更が行えます。

主にユーザーの操作を必要としない更新を実行する場合や、条件分岐を絡ませる場合に使用します。

かんたんな変更であればフォームコントロールを使用するのもよいですね。

上記のとおりPatch関数は、データソースに対してレコードの作成と変更が行えます。

フォームコントロールでいうNewFormEditFormに該当します。

フォームコントロールCollect関数ではコレクションの更新は行えないため、Patch関数で行うことになります。

また、戻り値として更新後のレコードまたはテーブルを返します

これを利用すれば、フォームコントロールLastSubmit関数と同じことが実現できます。

Patch関数には、データソースの外部でレコードをマージする機能もありますが、使いどころが見当たらないので割愛します。

Patch関数の使い方


レコードの作成│レコード


データソースに新しいレコードを作成します。

1レコードを追加する場合、次の式で表します。

Patch(テーブル, Default(テーブル), {レコード})

たとえば、都道府県リストに新たなレコードを追加するには次のように記述します。

Patch(都道府県リスト, Defaults(都道府県リスト),
    {
        Code:11,
        Group:"関東地方",
        Area:"埼玉県",
        AreaName:"さいたまけん",
        CapitalCity:"さいたま市",
        CapitalCityName:"さいたまし"
    }
)

Defaults関数はデータソースの既定値を含むレコードを返します。

これを使用することで、項目に漏れがあっても自動で規定値を返してくれます。

また、レコード部分を入力する際、項目が選択肢として表示されるので便利です。

このPatch関数を実行すると、データソースに埼玉県のレコードが作成されます。

入力しなかった項目は初期値が入ります。

たとえば、下記のように読みの項目を入力しなかった場合、読みの項目は空欄になります。

Patch(都道府県リスト, Defaults(都道府県リスト),
    {
        Code:11,
        Group:"関東地方",
        Area:"埼玉県",
        CapitalCity:"さいたま市",
    }
)

あらかじめ、おなじレコードセットのコレクションなどがあれば、レコードそのもので追加することもできます。

Patch(都道府県リスト, Defaults(都道府県リスト),Rec都道府県リスト)

ただし、ギャラリードロップダウンSelectedでは添付ファイルのId列などが含まれないため、指定できません。

項目名を揃えるには、いったんリストをコレクションに落とし込んだものを流用するのがかんたんです。


レコードの作成│テーブル


今度はレコードではなくテーブルを与えてレコードを作成します。

Patch(テーブル, 追加するテーブル)

データソースに含まれる項目で構成されているテーブルを与えると、その全レコードが追加されます。

Patch(都道府県リスト, ShowColumns(col都道府県リスト,"Code","Title","Area","AreaName","CapitalCity","CapitalCityName"))

テーブルを与えた場合、存在する項目のみ値を含んだレコードが作成されます。

ShowColumns関数項目名を内部名で指定するため、GroupTitleになっています。

テーブル型であれば、ギャラリーのAllItemsSplit関数の戻り値、各種コネクタで使用されるassignmentsなども可能です。

ただし、Id列など読み取り専用が含まれているとエラーとなります。

その場合、ShowColumns関数で項目を絞るか、読み取り専用が含まれないコレクション間で使用するのが良いと思います。


レコードの変更│レコード


特定のレコードの項目を変更します。

Patch(テーブル, テーブルに含まれるレコード, {変更内容})

レコードを特定するためには、LookUp関数を使うのがかんたんです。

たとえば、北海道の県庁所在地を変更したい場合、北海道のレコードを指定します。

一意であるCodeで1を指定するか、Areaで北海道を指定するのがベターです。

Patch(都道府県リスト, LookUp(都道府県リスト,Code=1),{CapitalCity:"青森市",CapitalCityName:"あおもりし"})

リストをギャラリーに展開している場合は、Selectedを使うと視覚的に把握しやすいですね。

Patch(都道府県リスト, Gallary1.Selected,{CapitalCity:"青森市",CapitalCityName:"あおもりし"})

ただし、指定した列がデータソースに存在しない場合は何も処理されませんので注意してください。

また、変更内容は直接入力してもよいですが、コントロールの値や変数を参照させることもできます。

Patch(都道府県リスト, Gallary1.Selected,{CapitalCity:TextInput1.Text})

いろいろなパターンを試してみましょう!


レコードの変更│テーブル

次にテーブルを与えてレコードの項目をまとめて変更します。

第1、第2プロパティのテーブルは同じもので構いません。

変更内容を含んだテーブルで指定した項目のみ中身が変更されます。

Patch(テーブル, テーブル,変更内容を含んだテーブル)

たとえば、既存レコードでArea列だけ変更したい場合は次のように記載します。

Patch(都道府県リスト, 都道府県リスト,ShowColumns(col都道府県リスト,"Area"))

同様にCapitalCityなども指定すれば一括してその項目が変更されます。

これを利用すれば、最初にリストのコピーをコレクションなどに取っておけば、変更内容をまとめて元に戻すことができますね。

Patch関数の活用事例


条件分岐してレコードを変更する


If関数Switch関数を組み合わせて、条件分岐させます。

たとえば、チェックボックスがオンだったらAreaの中身を空にするといった具合です。

If(Checkbox1.Value,
    Patch(都道府県リスト,Gallery1.Selected,{Area:Blank()})
)

条件分岐の使い方はこちらの記事で詳しく解説しています。


レコードが未登録だったら登録する


新規にレコードを登録する際、すでにその情報があると重複してしまいますよね?

そのため、まずレコードが登録済みではないか確認してからPatch関数を実行させます。

同じレコードを複数回使う場合は、With関数を使うと省力化できますよ。

まず、埼玉県のレコードが登録済みかIsBlank関数で確認します。

判定が空なら未登録なので、新規レコードを作成します。

判定が空ではない=既存なら、レコードを変更します。

With({Rec:LookUp(都道府県リスト,Area="埼玉県")},
    If(IsBlank(Rec),
        Patch(都道府県リスト,Defaults(都道府県リスト),{Code:11,Area:"埼玉県"}),
        Patch(都道府県リスト,Rec,{Code:11,Area:"埼玉県"})
    )
)

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


ギャラリーの初期値を最後に更新したレコードにする


Patch関数は戻り値として、更新後のレコードを返します。

その戻り値をギャラリーDefaultに指定すれば、最後に更新したレコードを選択した状態にできます。

戻り値はそのままでは指定できないため、一度変数に落とし込みます。

Set(varLastRec,Patch(テーブル,Gallary1.Selected,{}))

あとはその変数varLastRecギャラリーDefaultに指定するだけです。


注文番号などリストのIDを流用して付番する


注文番号は一意である必要があります。

Now関数を使って付番してもよいのですが、桁が長くなりがちです。

そこで、レコード作成後、リストに自動付番されたIDを使って注文番号を割り当てます。

下記例では、埼玉県のレコードを作成した後、注文番号を頭CD+5桁の数値で付番します。

Set(varLastRec,Patch(都道府県リスト,Defaults(都道府県リスト),{Area:"埼玉県"}));
Patch(都道府県リスト,varLastRec,{OrderNo:Text(varLastRec.ID,"CD00000")})

Patch関数の使い方のまとめ

今回はPatch関数の使い方を解説しました。

レコードの作成と部分的な変更を行えるのが特徴です。

ちゃんと記述すれば、細かいレコード操作が行えるのでとても重宝します。

一見便利なPatch関数ですが、入力規制やエラーチェックをしっかりしないとすぐこける一面もあります。

そのあたりはフォームの方に軍配があがりますね。

とはいえ、Patch関数のすばらしさはお伝えできたと思います。

何かと利用することが多い関数なので、ぜひマスターしてください。

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

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

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

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

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

よろしくお願いします。

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

コメントを残す

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

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