こんにちは、あんこ先生です。
SharePointリストに多くのレコードを短い時間で書き込みたくありませんか?
普段、繰り返し処理はForAll関数を使っていますが、数十レコードでも数分待たされることがあります。
待てないことはありませんが、速いに越したことはないですよね。
実はPatch関数の使い方次第で、速度は劇的に改善します。
なので今回もPatch関数のすばらしさをなんとかして伝えたい!
その思いで、「レコードをまとめて登録したい」、「条件を絞ってまとめて更新したい」といった中級者の方を対象に、Patch関数の使い方を解説します。
Patch関数やForAll関数って何?という方は先にこちらの記事を読んでください。
Contents
Patch関数の概要
Patch関数は、データソース内で1つ以上のレコードを作成したり変更したりできます。
1回1レコードに対して処理できますが、テーブルを与えることで複数レコードをまとめて処理することができます。
与えるテーブルについて、すこしコツが必要なのでパターン別に紹介していきますね。
データソースはなんでも構いませんが、SharePointリストに対して、更新用のコレクションを与えて、レコードをまとめて作成・変更してみます。
テスト用アプリの準備
左側がオリジナルのSharePointリスト、右側が更新用のコレクションです。
変更点をわかりやすくするため、一致しない部分を色付けしてます。
ボタンを押すと、Patch関数に更新用コレクション(テーブル)を与えて更新します。
更新用コレクションの構成は、上図のとおり4つの列です。
SharePointリストも自動作成される列を除けば同じ構成です。
多いと1画面に収まらないので絞っていますが、数を増やしても処理に支障はありません。
これらを使って、進めていきますね。
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関数に更新用のテーブルを与える方法を解説しました。
主キーと対象の項目列さえ準備できれば、まとめて更新できるので便利ですよね。
しかもコードはシンプル、そしてすごく速い。
更新時間が短いとアプリユーザーからも評価高いので、ぜひマスターしてください。
Dataverse for Teamsを使う場合は、コレクションに主キーを含めてください。