
今回はPoweAppsの委任について見ていきます。
初めてPowerAppsを触る人からすれば委任というのは初めての概念のため、いきなり出会うと面食らってしまうかもしれません。
実際、ここを理解しておかないとPowerAppsの挙動が遅くなったり予期せぬ動きをするかもしれないので注意が必要ですが、そんなに難しい概念でもないのでしっかりと理解しましょう。
PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

概要
委任がある理由
委任とはPowerAppsで外部データベースを扱う際に発生する考え方でPowerAppsを効率的に動作させるための作業となります。
PowerAppsでは外部のデータベース(SharePointのリストやSQLなど)を参照することが可能ですが、外部に保管されているデータベースの内容をPowerAppsの起動のたびに全データを持ってきてしまっては非常に非効率な挙動となってしまいます。
PowerAppsを作成する段階ではパソコンで作成したため外部データベースの全てを参照していても快適に動苦かもしれません。しかし実際の使用がスマホであった場合、スマホの方がパソコンより性能が落ちますから、毎回全データを取得していては挙動が遅くなってしまうということもあります。
これを回避するためPowerAppsではデータのレコード数(データベースにおける1行分のデータ)に対して制限(規定で500、設定で2000まで設定変更可能)をかけています。
しかしながら設定できるデータ以上のデータを扱いたい場合も当然あるということになります。これを解決してくれるのが委任ということになります。
委任の具体的な内容
では実際に委任が何をしているのかというと
データベースに対する指示(フィルターや検索など)をPowerAppsで行わずにデータベース側で行う
ということになります。
データベースの操作は思った以上に専門的な知識や環境、PC性能が必要なため膨大な量のデータベースをPowerAppsや通常のPCやスマホレベルの処理能力で行ってしまうとアプリの挙動が著しく下がってしまいます。そこでデータベースの操作をPowerApps内ではなく、その操作内容をデータベースに送りデータベース側で操作を行い、その結果のみを取得することでPowerAppsの挙動を快適にしデータベース間での通信量を下げるのが目的となります。

委任に関する警告
PowerAppsを使用していると"委任に関する警告"という警告文が出ます。
これは「この関数でデータベースを操作する場合は操作をデーベース側に委任することになるから、場合によっては予定していた挙動と違う動作をするかもしれないから気をつけて」ということになります。
エラーではないのでアプリは動きますが、委任について理解しておかないとアプリの挙動が予定と変わる可能性もありますので気をつけましょう。
委任を理解しないと起きる問題
実際に委任を理解せずに使用するとどのような問題が発生するかというと外部のデータベースの一部しか参照しないという問題が発生します。
PowerAppsで委任が発生する場合は基本的にキャンバスアプリになります。そのためPowerAppsではユーザーが使用するためのアプリを作ることが目的であり、データベースを操作するためのアプリは別に考えないといけません。
委任に対応していない関数もしくは対応していないデータベースでデータベースを操作しようとするとアプリの挙動が下がってしまうのでデータベースの一部のみを参照するようにPowerAppsでは制限(規定値が500件、設定で2000件まで増やすことが可能)をかけています。
この制限数以上のデータベースを処理しようとすると、PowerApps側でデータベースの処理を行うことになります。しかしながら制限値があるため全件を持ってくることができないので外部データベースの先頭から500件(もしくは設定した制限値)だけを持ってきてPowerAppsで処理することになります。関数によるデータベースの処理はこのPowerAppsに持ってきたデータだけに対して行われるため、一部のデータしかPowerAppsで使えなくなるという事態が発生します。

制限値を変更するにはファイルメニューから設定を開いて、詳細設定内の委任できないクエリのデータ行の制限で変更できます。
委任できるデータベース
では実際にPowerAppsで操作できるデータベースはどのようなものがあるかというとMicroSoftの公式では以下のように発表されています。
- SQLserver
- SharePoint
- CommonDataService
主要どころは抑えられていると考えて良さそうです。
委任と関数
実際に委任できる関数などについて見ていきましょう。
サポートしている関数
- Filter ※使用できる演算子、関数に制限があります
- Search ※使用できる演算子、関数に制限があります
- LookUp ※使用できる演算子、関数に制限があります
- Sort
- SortByColumns
- Sum
- Average
- Min
- Max
- 使える演算子と関数
- And , Or , Not
- && , || , !
- in
- =, <>, >=, <=, >, <
- +, -
- TrimEnds(スペースを削除する関数)
- IsBlank(空白を調べる関数)
- StartsWith、EndsWith(文字列の最初と最後を調べる関数)
- データベースに依存しない関数(Today関数など)
- 使えない演算子と関数
- If
- *, /, Mod
- Concatenate (& を含む)
- ExactIn
- 文字列操作関数: Lower, Upper, Left, Mid, Lenなど
- 端末の位置情報を取得する関数: Location, Acceleration, Compassなど
- 自動再計算される関数: Rand、...
- コレクション
一部サポートしている関数
一部サポートしている関数は引数内(関数の後ろにつける"()"内におけるのデータのこと)の関数については委任されます。
例えば
AddColumns(テーブル名1,新列名, LookUp(テーブル名2,条件).列名 )
とあった場合、処理内容は「テーブル名1に新しい列(列名は新列名)を作成し、テーブル名2の条件に合致する列の値を保管する」ということになります。
この時、Addcolumnsの引数であるLookUpは委任の対象となりますがAddColumnsは委任の対象となりません。そのためLookUpの対象であるテーブル名2は制限値以上のデータ数でも問題ありませんが、テーブル名1の方は制限値以下のデータ数である必要があります。
一部サポートしている関数は次のものがあります。
- AddColumns
- DropColumns
- RenameColumns
- ShowColumns
サポートされていそうでされていない関数
- First、FirstN、Last、LastN
- Choices
- Concat
- Collect、ClearCollect
- CountIf、RemoveIf、UpdateIf
- GroupBy、Ungroup