レコードを一括で更新、作成すると、一度に多くのレコードを操作できます。 ここでは、レコードを一括更新する場合の以下のようなシナリオに沿って説明します。
- たくさんの写真があり、それらを一度にアップロードする。
- 1 週間のデータを含むタイムシートを一度に提出する。
新しいレコードを一括で作成する。 たとえば、アプリで多数の画像を選択する必要がある場合、一度にすべての画像をアップロードすることができます。
この記事では、シナリオに応じて一括でレコードの更新、または作成する方法について説明します。
レコードを一括で更新する式
このセクションの式は、キャンバス アプリのレコードの一括更新に使用できます。
Patch() 関数 - コレクションがデータ ソースと一致する場合は、この関数を使用します。
Patch( DataSource, Collection )
ForAll() 関数 + ネストされたパッチ + 曖昧性解消演算子一この関数は、データソースに結合する必要のある異なる列がある場合に使用します。
ForAll( Collection, Patch( DataSource, LookUp( DataSource, Id = Collection[@Id] ), { Column: Value } ) )
AddColumns() 関数一この関数は、データソースにテーブルを簡単に参照するフィールドがない場合に、データソースへのアップデートを含むコレクションのルックアップ参照の提供に使用できます。
チェックリストの例
この例では、タスクのチェックリストを使用しています。 いくつかのタスクが完了したら、それらを完了としてマークできます。 このシナリオを、製品発売時のチェックリストやホーム インスペクションのチェックリストなどに拡張できます。
次のスクリーンショットは、Microsoft Excel ファイルのチェックリスト項目を示しています。 この例では、ブログやソーシャルメディアへの投稿に関連するタスクをチェックすることができます。 Excel 内のテーブルは ChecklistItems
と呼ばれます。
この例では、コレクションを使用してこの動作をデモしています。 このアプローチは、選択した表形式のバックエンドで機能します。
Excel データは静的データとしてアプリにインポートされます。
App.OnStart
プロパティで、Excel の ChecklistItems データを ChecklistItemsSource
コレクションに Collect()
します。
ChecklistItemsSource
のコレクションは、アプリ全体のソースデータとして使用されます。
この例では、2 画面のアプリを使用しています。
- 画面 1— チェックリスト項目を確認し、それらを完了としてマークする目的で使用します。
-
画面 2— 新しいチェックリスト項目を作成する目的で使用します。 新しい項目が
ChecklistItemsSource
コレクションに追加されます。
チェックリストの項目がチェックされるたびに、CheckedItems
のコレクションに追加されます。 チェックボックス コントロールの OnCheck
イベント プロパティには以下の式を使用しています。 項目がすでにチェックされていて、コレクションの一部である場合、その項目は削除されます。 そうでない場合は、チェックした項目が追加されます。
状態を 完了 と 保留の間で切り替えたり、Oncheck
と OnUncheck
のイベントを利用することができます。
If( !IsBlank(
LookUp( CheckedItems, Id = ThisItem.Id )
),
Remove( CheckedItems, ThisItem ),
Collect( CheckedItems, ThisItem )
)
一度に複数のレコードを作成する
シナリオに応じて、レコードを一括更新するさまざまな方法があります。 このセクションでは、キャンバス アプリで一度に複数のレコードを作成する方法について説明します。
上の例でユーザーが 完了 を選択すると、CheckedItems コレクションに由来する変更で ChecklistItemsSource
を更新する必要があります。
同じ名前の列の場合
ソースと宛先の列名が同じ場合は、Patch ステートメントを使用できます。 たとえば、ChecklistItemsSource
と CheckedItems
コレクションの列名は同じです。 以下の式を使用して、すべての変更でソースを一度に更新できます。
Patch( ChecklistItemsSource, CheckedItems )
異なる名前の列の場合
ソース テーブルと宛先テーブルの列が異なる場合は、代わりに ForAll with Patch を使用してください。
ForAll()
では、条件を使用して各レコードをループする必要があります。 条件は、異なるテーブルの類似した列 (たとえば、 Id
列) の比較です。 この比較は、ソース テーブルと宛先テーブルに同じ名前の列がある場合には複雑になります (たとえば、ProjectId
が Project
と PurchaseOrder
の両方のテーブルにある列であった場合など)。
以下が代替手段です。
一義化演算子とともに使用する
ソース テーブルと宛先テーブルの列名が同じ場合、CheckedItems
の Status
を 「完了」に更新するには、次の式を使用します:
ForAll( CheckedItems,
Patch( ChecklistItemsSource,
LookUp( ChecklistItemsSource, Id = CheckedItems[@Id] ),
{ Status: "Done" }
)
)
CheckedItems
コレクションの各項目にについては、一義化演算子 (CheckedItems[@Id])
で表現された Id が ChecklistItemsSource
コレクションの Id 列と比較されます。 続いて、一致した各レコードが「完了」の状態で更新されます。 一義化演算子は、異なるテーブルに属する 2 つの列が同じ名前の場合に使用されます。 この一義化演算子を使用しない場合は、最初のレコードのみが更新されます。
ギャラリー内で追加のラベルを使用する
チェックしたアイテムの保存に追加のコレクションを使用したくない場合は、次の手順を試すことができます。
ギャラリーのテンプレート内に追加のラベルを作成します。
- これを Id 列にバインドします。
- ラベルの名前を IdText に変更します。
前述のチェックボックス コントロールの OnCheck コードを削除します。
[完了] ボタンの OnSelect イベントに次の式を記述します:
ForAll( Filter( ChecklistGallery.AllItems, StatusCheckbox.Value = true ), Patch( ChecklistItemsSource, LookUp( ChecklistItemsSource, Id = IdText.Text ), { Status: "Done" } ) )
ここでは、ギャラリーの項目に直接フィルターを適用して、チェックされた項目を探しています。 フィルタリングされた項目の各レコードについては、Id と IdText ラベルに格納された値を比較して、ChecklistItemsSource テーブル上で一致するものを見つけます。
状態が「完了」に更新されます。
一義化演算子は、ギャラリーの項目には使用できません。 その代わりに、ギャラリー内にラベルを保存し、参照して比較することができます。
別のラベルで新しい列を作成する代替手段を使用する
この方法は、一義化演算子やギャラリー内のラベルを使用する代替手段です。
データソースのローカル コピーを作成する際に、 AddColumns()
式を使ってソース コレクションの Id 列に別のラベル (NewId
) を付けた新しい列を作成することができます。 ForAll with Patch を使用する場合は、NewId 列をソースデータの Id 列と比較します。
レコードを一括作成する
たとえば、多くの画像を一度にアップロードする場合など、新しいレコードを一括作成することができます。
こちらが、チェックリストの例を使用した例です。
チェックリスト項目の作成画面では、追加を選択するたびに NewChecklistItems
のコレクションに情報が格納されます。
提出を選択すると、ソース コレクションの更新に ForAll()
と Patch()
が使用されます。
ForAll( NewChecklistItems,
Patch( ChecklistItemsSource,
Defaults( ChecklistItemsSource ),{
Id: Id,
Category: Category,
Description: Description,
Status:Status
}
)
)
NewChecklistItems
の各アイテムに対して、ChecklistItemsSource
のコレクションに新しいレコード (Defaults(ChecklistItemsSource)
として表示) が作成されます。
Id
には NewChecklistItems
コレクションの Id
が設定されます。 同様に、Category
、Description
、Status
の値が設定されます。