PowerApps│Patch関数の使い方 応用編

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

SharePointリストに多くのレコードを短い時間で書き込みたくありませんか?

普段、繰り返し処理はForAll関数を使っていますが、数十レコードでも数分待たされることがあります。

待てないことはありませんが、速いに越したことはないですよね。

実はPatch関数の使い方次第で、速度は劇的に改善します。

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

その思いで、「レコードをまとめて登録したい」、「条件を絞ってまとめて更新したい」といった中級者の方を対象に、Patch関数の使い方を解説します。

Patch関数ForAll関数って何?という方は先にこちらの記事を読んでください。

Patch関数の概要


Patch関数は、データソース内で1つ以上のレコードを作成したり変更したりできます。

1回1レコードに対して処理できますが、テーブルを与えることで複数レコードをまとめて処理することができます。

与えるテーブルについて、すこしコツが必要なのでパターン別に紹介していきますね。

データソースはなんでも構いませんが、SharePointリストに対して、更新用のコレクションを与えて、レコードをまとめて作成・変更してみます。


テスト用アプリの準備


左側がオリジナルのSharePointリスト、右側が更新用のコレクションです。

変更点をわかりやすくするため、一致しない部分を色付けしてます。

ボタンを押すと、Patch関数に更新用コレクション(テーブル)を与えて更新します。


更新用コレクションの構成は、上図のとおり4つの列です。

SharePointリストも自動作成される列を除けば同じ構成です。

多いと1画面に収まらないので絞っていますが、数を増やしても処理に支障はありません。

これらを使って、進めていきますね。

Dataverse for Teamsを使う場合は、コレクションに主キーを含めてください。

Patch関数にテーブルを与えて複数レコードを更新する


レコードの更新


更新の方がかんたんなのでこちらから紹介します。

図のように既存レコードの一部をまとめて書き換える処理です。

たとえば、入力済みデータの商品コードや数量を間違えていたとします。

1件ずつ修正したものを更新してもよいのですが、数が多いとちょっとモヤモヤします。

先にすべての修正を行い、見直してからまとめて更新する感じです。

ForAll関数でもサクっとできますが、件数が増えると処理時間が段違いなのでPatch関数で行います。


すべての項目列を含める


はじめに更新用コレクションを作成します。

入力の都度、次のコードが実行されコレクションに格納されます。

Remove(col更新用,LookUp(col更新用,ID=ThisItem.ID));
Patch(col更新用,Defaults(col更新用),
    {
        ID:ThisItem.ID,
        Date:dteDate.SelectedDate,
        Code:drpCode.Selected.Value,
        Value:drpValue.Selected.Value        
    }
)

登録有無にかかわらず一度消してから、登録しなおしています。

これは新規or既存ならの条件分岐を無視できるためです。オススメですよ。

注意点として、更新の場合は必ず一意の主キーが必要となります。

SharePointリストならID列がそのまま使えますよ。

なんとか更新用コレクションができたら更新ボタンを押します。

ボタンのコードは次の通りです。

Patch(SPOリスト,col更新用)

たったこれだけです。

単一レコード更新よりシンプルです。

さらに処理速度も速く、100件くらいなら数秒で終わります。

更新対象が1件の場合でも、レコード特定を省略できるメリットがありますよ!


項目列を絞る


今度は不要な項目列を含めないパターンです。

例では取引日を更新用コレクションに含めていません。

このコレクションを与えて実行した場合、データソースの取引日列は更新されません。

これはPatch関数の特性で、与えていない項目列の値は既存を維持するためです。

ちなみに、コレクション作成時に不要な列を除かなくても、DropColumns関数あとから除外することもできます


主キーが存在しないレコードを含む


データソースにはない主キーを含むレコードがある場合です。

結論から言いますと、そのレコードは作成も更新もされません。

なお、次のようなエラーが表示されます。


その更新用コレクションに主キーが存在するレコードがあった場合、それは更新されます。

上図なら主キー1001-1003は存在しないのでエラー、4-5は更新されます。

まずこうはならないんですが、更新前にIDが存在するか確認するステップがあると安心ですね。

Patch関数にテーブルを与えて複数レコードを作成する


レコードの作成


次はレコードをまとめて作成します。

やり方は更新とほぼ同じです。

Patch関数主キーが存在するか否かで、更新と作成が切り替わります

パターン別にみていきましょう。


主キーを含まない


更新用コレクションを作る際に、主キー列を外したまたは空にしたパターンです。

Patch関数にこのテーブルを与えると、データソースに新しいレコードを作成します。

ボタンのコードは変わりません。

Patch(SPOリスト,col更新用)


主キーを含む

更新用コレクションに主キーを含んだ場合、データソースにその主キーがあれば更新されます。

なかった場合はエラーとなり、更新も作成もされません。

でも主キーいれてコレクションつくっちゃったし・・・

そんなときはDropColumns関数で列ごと消してしまいましょう。

Patch(SPOリスト,DropColumns(col更新用,"ID"))

DropColumns関数は、指定した項目列をテーブルから除外する関数です。

要らない項目列の方が多い場合は、ShowColumns関数で残したい列を指定できますよ。

DropColumns関数ShowColumns関数は一生使うことはないと思っていたのですが、使ってみるととても便利でした。

Patch関数の更新時間確認用動画

Patch関数の使い方のまとめ

今回はPatch関数に更新用のテーブルを与える方法を解説しました。

主キーと対象の項目列さえ準備できれば、まとめて更新できるので便利ですよね。

しかもコードはシンプル、そしてすごく速い。

更新時間が短いとアプリユーザーからも評価高いので、ぜひマスターしてください。

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

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

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

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

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

よろしくお願いします。

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

コメントを残す

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

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