こんにちは、あんこ先生です。
ギャラリーにリスト以外を与えた場合、リストの更新がすんなりできませんよね。
更新できない理由は、更新したいリストとギャラリーの中身が一致していないからです。
逆を言えば、それを一致させればリストの更新が行えるわけです。
そこで、今回はShowColumns関数等を使って出力データを加工する方法をコード付きで解説します。
これができたらとても便利!
ShowColumns関数等を使って出力データを加工する方法
お弁当注文アプリで動作を学ぶ
今回も例示としてお弁当注文アプリを用いて説明しますね。
追加の機能要件は次のとおりです。
- 未登録日のみの注文を抽出できる
- 一括登録前に内容を確認できる
- 一括登録できる
ポイントはユーザー目線の固定注文ですね。
下準備┃注文内容一覧
今回使用するリストは1つです。
前回作っている場合は読み飛ばしてください。
注文内容を保存するリストについて、名前は注文内容一覧としておきます。
注文日、社員名、注文内容、そして受取の4つの列で構成しています。
内部名はそれぞれ、Date、Name、OrderItem、Getになります。
Columns系関数は内部名を使うのでここポイントです。
実際にリストを作る場合は、はじめに内部名で登録し、その後表示名に直しましょう。
直接表示名で登録すると内部名がODataに変換されて判別つきにくくなりますのでオススメできません。
これで下準備は完了です。
出力データの加工
データ加工のゴール
上図が大本である注文内容一覧の中身です。
実際はもっとたくさんの列がありますが、一括登録に使用するのはオレンジ枠で囲んだ3列のみです。
入力フォームとなっているギャラリーから、この3列で構成されたテーブルを作成するのが目的です。
未登録データの抽出
はじめに表示されたカレンダーから未登録データを抽出します。
図の通り、先頭から3日分は注文に値が入っています。
つまり、注文に値が入っていない部分を抽出すればよいわけです。
今回はGallery1.AllItemsプロパティを使ってみます。
ここはFilter関数で注文列が空であるレコードだけ引っ張ればOKです。
Filter(Gallery1.AllItems,IsBlank(ThisRecord.注文.Value))
可視化するとこんな感じです。
ギャラリーのテンプレートに設置した各種コントロールも含まれていますね。
必要な列のみ表示する│ShowColumns
次に更新に使わない列は邪魔なので必要な列のみ残します。
表示したい列のみとするにはShowColumns関数を使います。
使い方はかんたん、表示したい列を内部名で指定するだけです。
ダブルクォーテーションで囲むのがポイントですよ。
//Value列とRadio1列だけにする
ShowColumns(
Filter(Gallery1.AllItems,IsBlank(ThisRecord.注文.Value)),
"Value","Radio1")
可視化するとこんな感じです。
この時点では注文列は空なので、注文情報が含まれるRadio1列を残しています。
Radio1列はテーブル型なのでこの時点では中身が見えません。
列の名前を変える│RenameColumns
続いて、注文内容一覧の列名に合わせるためValue列の名前をDate列に変更します。
列名を変更するにはRenameColumns関数を使います。
こちらも変更前と変更後の列名を内部名で指定します。
//"Value"列を"注文日"列にリネームする
RenameColumns(
ShowColumns(//余計な列が多いので"Value"列と"Radio1"列だけにする
Filter(Gallery1.AllItems,IsBlank(ThisRecord.注文.Value)),//登録ボタンのテキストが登録=未注文に絞る
"Value","Radio1"),
"Value","Date")
可視化するとこんな感じです。
Value列がDate列に変わりましたね。
列を追加する│AddColumns
今度は社員名と注文内容をの列を追加します。
列を追加するにはAddColumns関数を使います。
はじめにRenameColumns関数までのテーブルをAs関数を使って名づけします。
これをしておかないとラジオボタンの値を簡単に参照できません。
スコープの問題なんですが、ここは割愛しますね。
列追加に戻りますが、まずName列に社員名、ここは変数の値をそのまま入れ込みます。
もうひとつのOrderItem列は少し複雑です。
ラジオボタンはSelectedプロパティ=Defaultプロパティ(初期値)ではありません。
初期値が指定されていてもユーザーが操作しないとSelectedプロパティには含まれません。
そのため、条件文を使って入れ込む値を判定させます。
Selectedプロパティが空なら初期値、そうでないなら選択値としています。
//"社員名"列に社員名、"注文種別"列にラジオボタンの選択値または固定注文の値をいれて追加する
AddColumns(
RenameColumns(
ShowColumns(
Filter(Gallery1.AllItems,IsBlank(ThisRecord.注文.Value)),
"Value","Radio1"),
"Value","Date") As tbl, //RenameColumnsまでのテーブルをtblに名づけする
"Name",glb社員.社員名,
"OrderItem",
If(IsBlank(tbl.Radio1.Selected.Value),
{Value:tbl.Radio1.Default},
{Value:tbl.Radio1.Selected.Value})
)
可視化するとこんな感じです。
だいぶそれらしくなってきましたね。
不要な列を削除する│DropColumns
次に更新に使わない列を削除します。
指定した列を削除するにはDropColumns関数を使います。
こちらも削除したい列を内部名で指定するだけです。
ShowColumns関数との使い分けは、指定する列の数で判別しましょう。
不要となったRadio1列を削除してみます。
//"Radio1"列いらなくなったので削除
DropColumns(
AddColumns(
RenameColumns(
ShowColumns(
Filter(Gallery1.AllItems,IsBlank(ThisRecord.注文.Value)),
"Value","Radio1"),
"Value","Date") As tbl,
"Name",glb社員.社員名,
"OrderItem",
If(IsBlank(tbl.Radio1.Selected.Value),
{Value:tbl.Radio1.Default},
{Value:tbl.Radio1.Selected.Value})
),
"Radio1")
可視化するとこんな感じです。
目的のテーブルが作成できましたね!
事前確認と一括登録
事前確認
いきなりリストに書き込んでもよいですが、事前確認画面があるとミスがないか確認できますよね。
とりあえずコレクションに入れて、ギャラリーやデータテーブルで可視化してやりましょう。
ClearCollect(col一括登録,
DropColumns(
AddColumns(
RenameColumns(
ShowColumns(
Filter(Gallery1.AllItems,IsBlank(ThisRecord.注文.Value)),
"Value","Radio1"),
"Value","Date") As tbl,
"Name",glb社員.社員名,
"OrderItem",
If(IsBlank(tbl.Radio1.Selected.Value),
{Value:tbl.Radio1.Default},
{Value:tbl.Radio1.Selected.Value})
),
"Radio1")
)
一括登録
最後に、先ほど作成したコレクションを使ってリストに登録してみましょう。
Patch関数は列名が一致しているとテーブルをぶつけることができます。
これによりForAll関数を使った更新よりもだんぜん早く実行できます。
件数が多いほどその差は顕著なので、ぜひ利用してみてください。
指定方法は更新元テーブルと更新用テーブルだけです。
Patch(T_注文一覧,col一括登録)
エラーが出る場合は、内部列名かデータの型が一致していないケースが考えられます。
更新用テーブルから1列ずつ減らしてどの列が引っかかっているのか調べて対応しましょう。
ShowColumns関数等を使って出力データを加工する方法のまとめ
今回はShowColumns関数等を使って出力データを加工する方法を紹介しました。
列の追加だけではなく、必要な列を残したり、不要な列を削除したり、さらには名前を変えたりと様々なことが可能です。
前回の入力データ加工と合わせると思い通りのテーブルが作成できますね。
特にPatch関数で複数件を更新する場合、ForAll関数の組み合わせでは時間がかかりすぎます。
そんなときは出力データを加工してテーブルごとぶつけてみましょう。
件数が多いほど時短につながりますよ。
コメントを残す