PowerApps_データテーブルでFilter関数を使用したときに起こる謎事象とその回避方法

私がPowerApps作るときに、データを一覧の表示と更新する際のコントロールは、
データテーブル/テーブルコントロール（モダンコントロール）を好んで利用しています。

利用ケースとしては、100人のアンケート結果（20項目）をずらっと眺めたいときとか会議の予約で時間枠と内容を一覧で見たい場合です。一個一個処理しないといけないギャラリーよりもOperationが早くなるので優位性があります。

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/controls/control-data-table

ところが、データテーブルで接続先をExcelにして一覧データを取得/更新するときに、2つ問題が発生しました（ *本来、Dataverse Or Listsを採用すべきでしょうが、PowerAppsの障害の発生率は体感で多いと感じていて、コンティンプランをExcelで手運用としている為に、止む無くこの形にしています* ）。

本記事では、こちら2つの問題とその回避方法をご紹介します。


## その１：委任問題（所謂、黄色マーク）が発生した:warning:


:::note warn
委任とはクエリを接続先のデータソースに任せてしまい、PowerAppsは取得結果を返却してもらう機構です。これが厄介で、簡単なクエリなら委任できるのですが、ちょっと難しい事をさせると委任できなくなり、データソースからPowerAppsにデータを全部渡したうえで、PowerAppsでクエリ処理を行うような振る舞いになってしまいます。遅いだけならまだしも上限値が決まっており、デフォルト500件/最大2000件なのでデータ量が多いと、きちんとデータが取得できなくってしまいます。
:::

データ テーブル コントロールのItemsに接続先のデータソース名を指定するのですが、
Filter関数を使用したところ、委任警告が表示されてしまいました。以下のように実装したのですが本来、Filterは委任可能な関数のはずです。

```
Filter('テーブル1',日付 = Text(Today()) And 支店区分="1")
```

実はこれ接続するデータソースによってできるできないが変わってきます。:confused:
データソースはSharePoint上に格納したExcelファイルですが、この場合Filterで複数条件の利用ができません（マジスカ...）。

#### 仕方がないので解決策を考えました:star2:

:::note info

以下の修正で回避することができました。
 修正①：データソース側で、条件列1と条件列2を文字列結合した条件列3を追加


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/21592cdc-7221-97af-529a-0fc7447d6d0d.png)

 修正②：PowerApp側でFilterの条件列3をFormulasでグローバル変数にします。
 　Filter関数内で条件列3を動的に作ると委任警告が表示されてしまう対策
```
today_1 = Text(Today() &"1");
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/227b83be-1430-7c0c-9cb7-745e032ceb04.png)


 修正③：Filter関数内で条件列3を指定します。
```
Filter('テーブル1',日付支店区分 = today_1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/d1ba0f9f-c579-5ced-09d6-7cc349488fed.png)

つまり、複数条件指定や変数指定を関数外でやりましょうってことです。
これで委任警告も表示されなくなり、件数が増えても安心できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/a6fd0a9d-79de-7ec5-bd01-1c8a08390b60.png)

:::

## その２：Filterを使うとPatchでデータ更新しても画面だけは全然最新化されない

純粋にitemsのデータソースを設定する場合、patch関数でDB更新すると画面も秒で最新状態になります。ところが、その１のようにFilterを使った場合、謎挙動が発生します。ぱっと見はですね、更新されたように見えるのですが、マウスで別の行データを選択したあとに、更新対象行を選択すると、なぜか更新前の値が表示されます。データ量も50件くらいしかありません:anguished:。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/a5d8eae4-3785-e592-6332-6ef3fdb2623e.png)


#### 仕方がないので解決策を考えました２:star2:

　この変な挙動について調査して分かった事
 　・気長に2分後くらいに更新される
 　・データソース（Excel）は即時で更新される
 　・PowerAppsでpatchの後にRefresh関数を入れてもダメ
 　・Filterがなければ、データソースもPowerAppsも即時更新される
 　・アプリを再起動しても全然更新されない。
  
:::note info

以下の修正で回避することができました。
 修正①：OnVisibleでコレクション変数にデータソースを代入し、変数に対してFilterで絞り込みを行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/7ee27438-ff22-db8a-7e35-6fb3b47c1499.png)


 修正②：データテーブルの接続をExcelからコレクション変数に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/7eabb99e-8fba-1962-c918-80bb959b45a7.png)

 修正③：patch後、自画面に遷移させる（修正①が都度呼ばれる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/f5d2199a-1807-9482-df35-bbc521a26a2e.png)


:::

正直根本原因がわからず対症療法になっていますが、Filterなしなら即時更新されるので、データソースを変数に入れてあげて、PowerAppsでFilter処理してあげましょうという対策です。

これですぐに更新されるようになりました:sun_with_face:（原因がわかる人いればお教えください。）。
以上です。ご精読頂きありがとうございました。

* * *

こちらの記事を参考にさせていただきました。有難うございました。

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview

https://ippu-biz.com/development/powerplatform/powerapps/delgate001/

https://blog.truestar.co.jp/microsoft/powerapps/20231123/56856/

https://powerplatformnikki.com/udfcomponent/