作成画面

上部にフォームで見積書リストのアイテム、下部にギャラリーで見積書明細のリストのアイテムの一覧を表示します。
スクリーンの OnVisible プロパティでは QuotationDetails と QuotationDetailsIndexed という 2 つのコレクションを初期化します。QuotationDetails はギャラリーにバインドされるデータで、QuotationDetailsIndexed は保存時に連番を付けるために使用します。
NewForm(CreateForm);
ClearCollect(QuotationDetails, Filter(見積書明細, '見積書 ID' = 0));
ClearCollect(QuotationDetailsIndexed, Filter(見積書明細, '見積書 ID' = 0))
ギャラリーの Items プロパティにはアイテムが連番で並ぶように以下の数式を設定します。
SortByColumns(Filter(QuotationDetails, 連番 > 0), "Index", Ascending)
ギャラリーのテキスト入力の OnChange プロパティでは入力したテキストがコレクションに反映されるように Patch を呼び出すようにします。
Patch(QuotationDetails, ThisItem, { 摘要: Self.Text })
保存ボタンの OnSelect プロパティでは、まず親の見積書リストのアイテムを SubmitForm で登録し、次に子の見積書明細リストのアイテムを ForAll と Patch を使って登録していきます。ギャラリーは項目が追加されたり削除されたりして連番が続きになっていない可能性があるため、いったん QuotationDetails のコレクションを QuotationDetailsIndexed にコピーする形で連番を振り直しています。
If(
SubmitForm(CreateForm),
Clear(QuotationDetailsIndexed);
ForAll(
QuotationDetails,
Collect(
QuotationDetailsIndexed,
{
ID: ThisRecord.ID,
'見積書 ID': CreateForm.LastSubmit.ID,
連番: CountRows(QuotationDetailsIndexed) + 1,
摘要: ThisRecord.摘要,
数量: ThisRecord.数量,
単価: ThisRecord.単価
}
)
);
ForAll(
QuotationDetailsIndexed,
Patch(
見積書明細,
ThisRecord
);
Navigate(
MainScreen,
ScreenTransition.None
)
)
)
更新画面

基本的には作成画面とそれほど変わりません。
スクリーンの OnVisible プロパティではコレクションを初期化しますが、見積書 ID でアイテムを取ってくるようにします。
EditForm(UpdateForm);
ClearCollect(QuotationDetails, Filter(見積書明細, '見積書 ID' = MainGallery.Selected.ID));
ClearCollect(QuotationDetailsIndexed, Filter(見積書明細, '見積書 ID' = 0))
ギャラリーから項目を削除するときに、新規に追加したものでよければそのままコレクションから削除してしまえばいいのですが、既存のアイテムを削除するときはリストから削除しなければならないので、そのようなアイテムはいったん連番を -1 としておき、保存時にまとめて削除するようにします。削除ボタンの OnSelect プロパティは以下のようになります。
If(ThisItem.ID = 0, Remove(QuotationDetails, ThisItem), Patch(QuotationDetails, ThisItem, { 連番: -1 }))
保存ボタンの OnSelect プロパティでは、作成画面とほぼ同じですが、削除とマークされたアイテムを削除するロジックが追加されます。
If(
SubmitForm(UpdateForm),
Clear(QuotationDetailsIndexed);
ForAll(
Filter(
QuotationDetails,
連番 < 0
),
Remove(
見積書明細,
ThisRecord
)
);
ForAll(
Filter(
QuotationDetails,
連番 > 0
),
Collect(
QuotationDetailsIndexed,
{
ID: ThisRecord.ID,
'見積書 ID': UpdateForm.LastSubmit.ID,
連番: CountRows(QuotationDetailsIndexed) + 1,
摘要: ThisRecord.摘要,
数量: ThisRecord.数量,
単価: ThisRecord.単価
}
)
);
ForAll(
QuotationDetailsIndexed,
Patch(
見積書明細,
ThisRecord
);
Navigate(
MainScreen,
ScreenTransition.None
)
)
)
削除ボタンの OnSelect プロパティでは親子関係のアイテムをすべて削除するようにします。
RemoveIf(見積書明細, '見積書 ID' = MainGallery.Selected.ID);
Remove(見積書, MainGallery.Selected); Navigate(MainScreen, ScreenTransition.None)