Power Apps・データソースの委任とは

# 要点
:::note
- フィルタリングを「データソース」側で事前にかけるように任せることが委任
- 委任できるかできないかは「データソースやフィルタリングする関数などの組み合わせ」で決まる
- データソースからデータを取得するときには「取得できるデータ行の制限」がある
- 委任できないフィルタリングの場合、「取得できるデータ行の制限」によってフィルタリングにすらかからない「フィルタリングかからない問題」が発生することがある
- 「フィルタリングかからない問題」を必要に応じて回避するように考えないといけない
:::

# はじめに
Power Appsは今後のアップデートで仕様が変わることもあります。
公式の情報や実際の挙動を確かめるなどの正確な情報を取り入れながら理解を深めることをお勧めします。

# 前知識
Power Appsでアプリを作成するときです。Power Appsのアプリでは何かしらのデータを「データソース」に残す仕組みをとっています。そして「データソース」にアプリが問い合わせてデータを取得。その後、アプリに表示したりしています。アプリがデータを取得するとき、「データソース」は通常、全てのデータをアプリに渡します。そしてアプリがその中で必要なデータをフィルタリングして使用することになります。

```mermaid
stateDiagram-v2
    アプリ--> データソース: 問い合わせる
    データソース--> アプリ: 全てのデータ渡す
```

# 委任とは
先ほど、通常は全てのデータをPower Appsに渡してデータをフィルタリングすると書きました。しかし、「データソース」が事前にフィルタリングをしてからアプリに渡すことがあります。このフィルタリングを「データソース」に任せることが委任です。

```mermaid
stateDiagram-v2
    アプリ--> データソース: 問い合わせる
    データソース--> アプリ: フィルタリングしてデータを渡す
```

# 委任できる・できない
Power Appsでは、アプリがデータを取得するとき、委任ができるときは自動で委任をしてくれます。逆に委任ができないときは委任をしません。この、委任ができるか・できないかは「データソースやフィルタリングする関数などの組み合わせ」によって決まります。

委任する・しないは「どこでフィルタリングするか」という話です。今までの内容だけだとアプリ作成者側が意識しないといけないことは何もないように感じるかもしれません。しかし、次の話が加わると委任できる・できないの違いが重要になってきます。

# データソースからデータを取得するときに制限がある
前知識で、アプリが「データソース」からデータを取得するとき、通常は「全てのデータをアプリに渡す」と書きました。しかし、データソースからデータを取得するときには「取得できるデータ行の制限」というのが実際には存在します。つまり、データソースからデータを取得するときは、取得できるデータ行の上限までしか取得することができないのです。
```mermaid
stateDiagram-v2
    アプリ--> データソース: 問い合わせる
    データソース--> アプリ: 全てのデータ渡す(ただし上限あり)
```
ちなみに、「取得できるデータ行の制限」はデフォルトでは500行です。設定で最大2000行まで変更できます。変更方法は以前の私の記事が参考になります。

https://qiita.com/76r6qo698/items/4f8859f0d4e07d2f975f

# 「委任できる・できない」と「データ行の制限」
まず、データソースからデータを取得するときはデータ行の制限があります。これは委任できる・できないに関わらずです。ですが、「データ行の制限」について問題になるのは委任できない場合がほとんどです。このことについて詳しく解説していきます。
### 「委任できる」と「データ行の制限」
「データソース」からデータを取得するときに委任ができる場合です。この場合はデータソース側でフィルタリングをかけてくれます。そのため、「データ行の制限」を超えないようにフィルタリングをかけてからアプリに渡せばいいわけです。また、「データ行の制限」を超えたとしても、データソースで全てのデータからフィルタリングをしてくれています。なのでアプリには「上位〇件を表示します」というような表示をすれば違和感ない作りになるのではないかと思います。
### 「委任できない」と「データ行の制限」
「データソース」からデータを取得するときに委任ができない場合です。この場合はアプリ側でフィルタリングをかけることになります。フィルタリングをかけるためにアプリは「データソース」からデータを全て取得しようとします。ただ「データ行の制限」で取得するデータ行に制限がかかります。アプリは制限のかかった中で取得できたデータからフィルタリングをかけていくわけです。裏を返せば、「データ行の制限」によってアプリに渡せなかったデータはフィルタリングにもかかることなくやり取りが終わってしまいます。ここが想定と異なる挙動を引き起こす問題になりやすいのです。この「委任できない」と「データ行の制限」によって引き起こされる、フィルタリングにすらかかることがないデータ行が存在してしまう問題を「フィルタリングかからない問題」とでもいうことにします。

もう少し具体的に説明します。もし、「データ行の制限」が10行だとします。そしてデータソースには20行のデータが記録されていたとします。この状況で委任できないフィルタリングをかけます。すると、データソースから全てのデータを取得したいところですが、「データ行の制限」により10行分だけ取得することになります。アプリはこの10行に対してフィルタリングをかけて表示することになります。つまり11行目～20行目はアプリに渡せなかったためフィルタリングにもかかりません。仮に11～20行目に表示したいデータがあったとしてもです。これが「フィルタリングかからない問題」です。
```mermaid
stateDiagram-v2
    アプリ--> データソース: 問い合わせる
    データソース--> アプリ: 10行のデータ渡す
    note left of アプリ
            受け取った10行にフィルタリングをかける。
            →11～20行目のデータはフィルタリングすらかからない。
    end note
    note right of データソース
            20行持ってるが、制限により10行しか渡さない
    end note
```


# 「フィルタリングかからない問題」を回避するために

この「フィルタリングかからない問題」を回避する私が思いついた方法をいくつか挙げてこの記事を終わりにします。

:::note info
- 「データソースやフィルタリングする関数などの組み合わせ」は委任できるものを選ぶ
- データの行数は「データ行の制限」を超えないようにする
- 事前にデータソースからデータを分割して取得しておく
:::

### 「データソースやフィルタリングする関数などの組み合わせ」は委任できるものを選ぶ
問題は「委任できない」場合に起こるため、委任ができる組み合わせのものを使用すればそもそも問題は起こりません。
そのため、できるだけ委任できる組み合わせのものを使用していけば回避できます。
これについては下記の記事や公式の記事が参考になるかと思います。

https://www.docswell.com/s/rnakamuramartiny/KXQGPZ-PowerApps-delegate#p24

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

注意していただきたいのは、どれが委任できて委任できないかはアップデートによって変わることがある点です。他の記事も参考にしながら情報を更新していただければいいと思います。

そしてデータソースは「Dataverse → SharePoint List → Excel」という順で委任できる関数が多いというイメージは持っていても問題ないかと思います。

### データの行数は「データ行の制限」を超えないようにする
そもそも「データ行の制限」を超えることが無ければ「フィルタリングかからない問題」を意識する必要もないです。最大で2000行まで設定できるので、2000行に収まらないか考えてみるのも1つかと思います。

### 事前にデータソースからデータを分割して取得しておく
いままでの2つと比べると難しい内容になります。「データ行の制限」があるがゆえにフィルタリングにかからない行が存在してしまう。ならばアプリ側は事前にデータソースから全てのデータを分割してコレクションに保持。そしてアプリ側はそのコレクションに対してフィルタリングをかけて使用するようにすれば問題が回避できるという考え方です。
この「事前にデータソースから全てのデータを分割してコレクションに保持」する方法については下記の記事が参考になります。

https://artisan.jp.net/blog/power-apps-sharepoint-online-limits-1/

最初に難しい内容といったように、下記などの懸念点があります。

- 複数の関数を組み合わせる実装が要求される
- 「全てのデータを取得する処理」にある程度時間が必要
- コレクションに保持した後、データソースに変更があった時の差分について考慮しなければいけない可能性もある
- そもそもデータソースによっては、実装に必要な関数が委任できないことがある。その場合は分割取得による回避はできない。

こういった懸念点もありますが、データ行が大きくなっても問題が回避できます。Power Appsに慣れてきたころに挑戦してみてもいいかと思います。

# おわりに
「フィルタリングかからない問題」について、Power Appsを実際に使用して再現する記事。
「事前にデータソースからデータを分割して取得しておく」ことで「フィルタリングかからない問題」を解決する具体的な記事などをまた機会があれば投稿していきたいと思います。

以上です。

# 参考

https://www.docswell.com/s/rnakamuramartiny/KXQGPZ-PowerApps-delegate#p24

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

https://artisan.jp.net/blog/power-apps-sharepoint-online-limits-1/