【PowerApps】委任の影響範囲について(Sum関数、Filter関数)

【PowerApps】委任の影響範囲について(Sum関数、Filter関数) | Tableau-id Press -タブロイド-
PowerApps_200

みなさん、PowerApps使っていますか?

私は最近になってPowerAppsで業務アプリの作成をすることになりました。今回はPowerAppsの委任の影響範囲について、記事を書きたいと思います。

PowerAppsとは?

Microsoftが開発したローコードのWebアプリ開発ツールがPowerAppsです。

関連製品として、PowerBI(BIツール)やPowerAutomate(業務自動化ツール)などのPowerPlatform製品があります。これらはMicrosoft365ライセンスのみで利用ができるため(一部機能に制限がありますが)多くの企業で気軽に導入が可能です。

製品間の連携はスムーズで、PowerAppsで作成したアプリでデータを取得→データをPowerBIで可視化→レポートをPowerAutomateで自動で配信などアイデア次第で、複雑なシステムも構築可能です。

委任について

そんなPowerAppsですが、「委任」という初心者が躓きやすい独自の処理制限が存在します。詳細な説明はドキュメントに譲るとして概要だけ説明したいと思います。

PowerAppsには、条件に合うデータを取得する関数(Filter関数)データの集計を行う関数(Aggregate 関数)が存在します。その処理を、アプリ側で実行するかデータベース側で実行(=委任)するかによって扱えるデータの行数に制限がかけられます。これがPowerAppsの委任問題と呼ばれるものです。

また、データベースにより委任できる関数は決まっています。例えばSharePointリストに対してはFilter関数の条件として、「=」の条件式は委任可能ですが、「IsBlank(指定のカラムが空白かどうかに対して真偽を返す)」の条件は委任できません。その場合、PowerApps上での処理は以下の図のようになります。

ここまでは理解しやすいですが、委任しない場合の処理できるデータには上限値が存在します。それが「データ行の制限」です。以下の例では「500」と設定されていますが、これは委任処理しない場合には500行までしかPowerApps側で関数の処理ができないということになります。

デフォルトでは「500」に制限。「2000」まで設定は可能。

この場合、500行を超えるデータに対しては正しい処理が行われません。例えば、行数をカウントする関数Countrowsの場合、データベースから返却された行数が1000件だった場合でもアプリ上は500件までしか処理されないため、CountRowsの値は「500」となります。(本来計算してほしい値は「1000」ですが。)

これがPowerAppsの委任問題です。

委任の範囲はどこまで?

委任できる関数と委任できない関数がある場合、処理はどのようになるのでしょうか?例えば、Filter関数でレコードを絞り込んだ後、合計値をSum関数で計算する場合などです。

この件については、Microsoftのドキュメント上に以下のような記載がありました。(「注意」の個所)

記載を読むとわかりづらいため、実際にどのような挙動になるか試してみました。

調査内容

SharePointリストに以下のような形で1000行のデータを作成。このデータに対して、Sum関数(委任できない)を使いどのような形で処理されるか見てみようと思います。

ちなみに、PowerApps上では1000件のデータは表示させるだけなら全行取得できます。(アプリを開いたときに1000行すべて表示されているわけではなく、スクロールすると100行ずつ表示が増える遅延読込となりますが。)

調査内容は、委任できないSum関数に対して、事前にFilter関数でデータを絞り込んだ場合(ここは委任させる)ちゃんと正しい数値計算ができるのか?という観点で実施したいと思います。SumとFilter関数を使うと委任に対する警告が表示されるため、Filter処理も正しく委任できないと記載しているブログなどもありましたが、実際に見てみましょう。

結果は以下のようになりました。少しわかりづらいですが、左が条件の説明、真ん中の数値が実際に計算した結果、右側がその計算式となっています。

以下一つずつ確認していきましょう。

①Sum関数のみ

全レコードに対して、「num2」のカラムを合計したら「1000」になりますが、Sum関数は委任できないため上位500件のレコードだけに対して集計をするため「500」となります。これは予想通りですね。

②Filterで上位700件を取得してSum

これは委任して700件のレコードを取得しますが、その後Sum関数では500件しか処理できないため、「500」になります。この場合はFilter関数で700件取得できたのか500件しか取得できていないのかは不明です。

③Filterで上位500件を取得してSum

順番を間違えた気がしますが、Filterで上位500件を取得しその後Sum。これは当然「500」が返ってきました。

④Filterで500~700番目のレコードを取得してSum

ここでは「200」が返ってきました。SumとFilterを合わせたときに委任に対する警告が表示されますが、どちらの処理もPowerApps側で実施した場合、Filter処理の時点で正しく絞り込みができない場合もありました。しかし、結果Filter処理は元データの1000件すべてに対して処理を行い、200件を返したためこの部分は委任処理ができているのだということがわかりました。

そのため②の処理では、Filterでは700件のデータが返ってきているが、委任できないSum関数で500件しか処理されないと理解するのが正しいでしょう。

まとめ

ドキュメントには詳しく記載されておらず、違った情報もネット上を調査してみるとみられました。こういう場合にしっかりと調査して検証することは大切だと改めて実感しました。

truestarではツールを限定せず、様々なデータ関連の課題を解決いたします。PowerAppsを利用した取り組みにご興味がありましたらお問い合わせください。