皆さんご存知の通り、PowerAppsのアプリでデータソースにデータを書込み編集する時に数秒時間が掛かります。
何度も続けて書込む場合はアプリの使い勝手が悪いです。
そこでアプリのOnStart属性でそのデータソースを丸ごとコレクションに入れて端末内で編集をして、後でまとめてデータソースを更新すると良いです。数式はこんな感じになります。
Collect(ProductMasterCol,Tbl_ProductMaster)
ちなみにこの例ではTbl_ProductMasterがデータソースで、そのデータをそのままProductMasterColと言うコレクションに入れています。
これで列名は全く同じになり、オフラインでも使えてとても便利です。しかし、その間他の人はそのデータソースにアクセスしないのが前提です。
しかし、Collect関数はその逆は出来ません。つまり、作業が終了し、コレクションをそのままデータソースにコピーしたい時にそれが出来ないのです。
そこで試行錯誤の末、下の式で実現出来ました。出来た時はかなり嬉しかったです。
ForAll(
RenameColumns(
ProductMasterCol,
"Product_ID",
"Product_ID2"
),
Patch(
Tbl_ProductMaster,
If(
CountIf(
Tbl_ProductMaster,
Product_ID = Product_ID2
) = 0,
{Product_ID: Blank()},
LookUp(
Tbl_ProductMaster,
Product_ID = Product_ID2
)
),
LookUp(
ProductMasterCol,
Product_ID = Product_ID2
)
)
)
ポイントは二つあります。最初のRenameColumns関数と真ん中辺でCountIf関数のあるIf文の部分です。
最初、RenameColumns関数を使わずにその後の行で
Product_ID = Product_ID
とやってたのですが、PowerAppsが違いを把握出来ないのか上手くいきませんでした。RenameColumns関数で列名を変えた事で上手くいったのです。
次のポイントのIf分はコレクションでレコードを追加した時にこのIf分で、ソースデータ内にProduct_IDが存在してたらそのレコードを探してPatchをし、存在しなければ新しいレコードを作成しています。
このIf分が無いとそのコレクション内で追加されたレコードはソースデータに追加されません。