LoginSignup
12
12

More than 3 years have passed since last update.

【PowerApps】コレクションをそのままデータソースにコピーする。

Last updated at Posted at 2019-05-30

皆さんご存知の通り、PowerAppsのアプリでデータソースにデータを書込み編集する時に数秒時間が掛かります。

何度も続けて書込む場合はアプリの使い勝手が悪いです。

そこでアプリのOnStart属性でそのデータソースを丸ごとコレクションに入れて端末内で編集をして、後でまとめてデータソースを更新すると良いです。数式はこんな感じになります。

App.OnStart
 Collect(ProductMasterCol,Tbl_ProductMaster)

ちなみにこの例ではTbl_ProductMasterがデータソースで、そのデータをそのままProductMasterColと言うコレクションに入れています。

これで列名は全く同じになり、オフラインでも使えてとても便利です。しかし、その間他の人はそのデータソースにアクセスしないのが前提です。

しかし、Collect関数はその逆は出来ません。つまり、作業が終了し、コレクションをそのままデータソースにコピーしたい時にそれが出来ないのです。

そこで試行錯誤の末、下の式で実現出来ました。出来た時はかなり嬉しかったです。

OnSelect

    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分が無いとそのコレクション内で追加されたレコードはソースデータに追加されません。

12
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12