Power Apps SortとSortByColumnsを使う際は委任に注意|SPOとDataverseでの比較

前回の続きでSortとSortByColumnsと委任について詳しく調べてみた。

スポンサーリンク

委任とデータ行の制限

まずは委任とデータ行の制限について簡単に。

委任はSortやFilterといった処理を「データソース側に任せる」こと。

全部のデータを持ってきてPower Apps側で処理するより、データソース側でやってもらった方が早いよね、的な発想。

「データ行の制限」はPower Apps側でデータソースから取得するデータ(レコード)の数で、最大2000まで設定可能

これを超える数のデータはPower Appsに読み込まれず、変数とかコンボボックスとかに大きいデータを入れてもこのデータ数分のデータしか入らない。

ただし、ギャラリーやデータテーブルは特別で、委任に反しなければデータ行の制限数以上のデータを表示することができる

事前準備

事前準備は前回と一緒でこんなSharePointリストと
こんなDataverseのテーブルを用意して、
これらを委任できてるかわかりやすくするため「データ行の制限」を5に設定したアプリで使ってみる。

SortByColumns関数で委任ができないパターン

それでは早速、SortByColumns関数の委任できないパターンから。

第2引数に式を入れる

まずSortByColumns関数は第2引数に式を入れると委任ができなくなる
※委任できない式のためギャラリーの機能が使えず、先頭に表示されるはずの「FFF」のアイテムがデータ行の制限にひっかかって表示されない。
これは残念ながらDataverseも一緒。
またまた残念ながらWith関数で事前にテキスト型の変数に入れてもだめ。
ということで「委任しつつ条件によって並べ替えの基準とする列を変えたい」ときはこんな感じでSortByColumns自体を複数書くしかないっぽい。

2つくらいとかならいいけど、条件がたくさんあると書くのも読むのも大変そう。。。
ちなみに第3引数(昇順 or 降順)に式を入れることは可能。

第3引数にテーブルを入れる

続いて前回紹介した「第3引数にテーブルを指定する」方法も委任はできない。
※データを持ってきてからのソートになるので列「Num」が6のレコードは表示されない。
こちらもDataverseでも委任できない。

あんまりテーブルを渡す指定をする人はいないと思うけど、委任の警告が出ないっていうのが不親切だなぁと。。

Sort関数で委任ができないパターン

続いてSort関数で委任ができないパターン

第2引数に式を含める

前回の記事でも少し触れた通り、Sort関数も第2引数に式が含まれると委任ができなくなる
もちろんDataverseでもだめ。
こちらの公式によると、演算子や関数を使用した時点で委任はできなくなる、っぽいことを書いてある。
キャンバス アプリでの委任について - Power Apps
委任を使用して、キャンバス アプリで大規模なデータ セットが効率的に処理する方法について。

なので、委任を保ちつつソートをしたい場合、Sort単品だと「SortByColumnsの列を1つ指定」と同じことしかできないよう。

ちなみに複数列指定したい場合はSort関数2つで囲むと委任しつつ複数列での並べ替えが可能。

オブジェクト型のプロパティを式に含める

あと、Sort関数の第2引数でオブジェクトのプロパティにアクセスしても委任ができない(例はSPOの選択肢列にアクセス)。
※たぶん「.」がプロパティへアクセスする演算子だから

まとめ

ということで「委任を保ちつつ並べ替えをしたい」という場合はSortもSortByColumnsもそこそこ制約が大きくなる

並べ替えをしたいときは大きなデータを扱いたいときが多いと思うので、委任に注意しつつ使わないと思わぬ挙動になりそう、というお話でした。

※調べきれなかったけど他にも委任に引っかかるパターンは他にもありそうなので使うときは注意。

おまけ1:Withで囲むと委任はできるけどデータ行の制限に引っかかる

こんな感じでギャラリーのItemsプロパティにWith関数を書いてしまうと、委任に反しなくてもデータ行の制限分のデータしか表示されないっぽい。

図のようにWithのローカル変数に入れた値を使用しなくてもデータ行の制限に引っかかるので注意が必要。

おまけ2:AddColumnsなどの委任できない関数との組み合わせ

なので、この図のようにAddColumnsで囲めば「追加した列でのソートはできない」けど、「ソートしたのちのデータ」を制限数分持ってこれて、
AddColumnsを中に入れると「追加した列でソートできる」けど、「ソートする前のデータ」を制限数分持ってきてソートすることになる。
これはDataverseも同様

この辺りは「どんなデータを表示したいか?(逆に表示されなくても困らないか?)」をよく考える必要がありそう。

関連記事

コメント

タイトルとURLをコピーしました