PowerApps委任の問題(2000件問題)と闘ってみた!

【はじめに】委任って何だ?

そもそも、PowerAppsでの「委任」とは、関数を使った計算や絞り込み、並べ替えなどをする際に、PowerAppsでは行わず、データベース側で処理を行ってから結果を取得することを指します。

 

委任の問題(2000件問題)って何だろう?

委任の問題とはPowerAppsでときどき見られるこの警告のことです。

左上の「!」マーク

これは、PowerAppsが大量データを取得しようとした際に、デバイスや通信のパフォーマンスが低下するのを回避するために、処理可能なデータの件数をデフォルトで500件にしているためです。
この500件というのは、デフォルトで設定されています。この値は最大で2000件まで引き上げることができます。しかし、それ以上は設定できないため、俗にこの委任の問題を「2000件問題」と呼ぶこともあります。
 
ちなみにアプリの利用時はこの警告は表示されず、さらにエラーではないので、処理が正常に動くこともあるため、見逃しがちです。

 

何が問題なのか?

「!」マークの詳細を開くとこんな表示が。

ではこれの何が問題なんでしょうか。もちろんデフォルトで500件までというのも問題ではありますが、仮に10000件のレコードの入ったデータベースから、コレクション(※)を作ってみるとします。該当するデータベースから、単純にコレクションをつくってみました。
※コレクションとは…PowerAppsの変数の1つで、アプリで管理できるデータをこの中に格納できます。このデータはテーブル構造になっています。

コレクションを作っている様子。

『テーブル: 2000行』との表示が!

これは、10000件のデータが入っているデータベースから「col_Number1-10000」という名前のコレクションを作成した様子なのですが、左の画像を見ると、col_Number1-10000の中には2000件のレコードしか入っていないことが分かります。

2001件目以降のレコードは切り捨てられてしまっているので、作成したコレクションの中からその分のレコードを表示させようとしても、表示できないということになります。

 

【検証】委任の問題を回避するには?

どうしたら委任の問題を回避することができるのか…!検証スタート!

【用意するもの】

・2000件を超えるデータベース(今回はNumber1-30000という名前の、3万件のレコードが入ったデータベースを準備しました。)
・コレクションを表示させるリストボックス
・絞り込みの値を設定したコンボボックス
・処理を実行するボタン

 

データベースの作り方
データベースはExcelで1から30000まで入力し、ファイルを作成します。(↓こんな感じ)

データベース

Excelファイルを作成したら、テーブルを作成するページに移動し、「Excelファイルをアップロード」というところから、作成したファイルを選択してアップロードすると、テーブルが作成されます。

テーブルの作成

作成されたテーブル

 

リストボックス

リストボックスは、表示できるレコードが最大500件のコントロールです。
500件を超えるデータベースやコレクションを表示させようとすると、「アイテムの最大数に達しました」と表示されます。

リストボックス(デフォルト)

500件を超えるレコードを表示させようとしたリストボックス

 

コンボボックス

コンボボックスとは選択肢を表示、選択できるコントロールです。

矢印をクリックすると、選択肢が表示される

選択肢を表示させた状態

選択肢をクリックした状態

 

ボタン
ボタンは、記述した処理を実行するコントロールです。OnSelectという箇所に、実行したい処理を記述し、ボタンを押下すると処理が実行されます。
今回は、コレクションの作成と絞り込みの処理に使用します。

 

リストボックスに表示させるコレクションをつくる

何も考えずにつくると委任の問題になっちゃう

前述の通り、普通にテーブルをそのままコレクションに入れると、2001件目以降のレコードはコレクションの中に入りません。
そして、そもそもリストボックスは500件までしか表示できないのでテーブルを絞ってあげる必要があります。
しかし、このDBをフィルターするところでも委任の問題が!!!(青い二重線すべて)

回避のコツ

調べてみたところ、どうやら、委任できる関数とできない関数があるらしいことが分かりました。

Microsoftの公式ドキュメント(キャンバス アプリでの委任について)を読むと…

 

「委任可能な関数」と「委任できない関数」という項目が目次に書いてあります!どうやらここにヒントがありそうです。

もっと調べてみると、「委任可能な関数」は、計算や絞り込み、並べ替えなどをデータベース側で行い、その処理結果をPowerAppsで取得することができる関数だということが分かりました。

Filter関数(データベース/テーブルを絞りこむ関数)は委任可能な関数と紹介されているので、これを使ってあげれば委任の問題を回避できそうです!

さらに検証を重ねていったところ、該当する処理を、全て委任できる関数で書く必要があることが分かりました。
というわけで、先ほどのコードを委任できる関数のみ(Valueを外して)で記述してみました↓

これで、500件以内に絞り込めるようにコンボボックスの値を調節して、ボタンをクリックします!

 

リストボックス表示用に絞り込みできた~

上記の書き方で、リストボックス表示用コレクションが完成!試しに2000から2500の値で絞り込んでみます。すると…

2001件目以降のレコードが表示されている様子

きちんとリストボックスにも表示できました!

アイテムの上限に引っ掛かってない!

これでなんとか2000件問題を回避!おめでとうございます~

[補足] 2000件以上のレコードを表示させる方法として、ギャラリーというコントロールを使う、という方法があります。ギャラリーでは、スクロールをするたびに、データベースからレコードを取得し直して表示するので、データベースを絞り込まずとも2001件目以降のレコードを表示できます。

ギャラリーを使って表示させた様子

 

【まとめ】委任の問題を回避する

今回はPowerAppsの委任の問題について調べ、検証していきました。
デフォルトの設定だと500件、拡張しても2000件になってしまうので、2000件を超えるデータベースを扱う場合には、委任の問題に注意が必要です。また、委任の問題になってしまう処理については、該当する処理で用いているすべての関数を、委任可能な関数にしなければなりません。少し手間になってしまいますが、正しく処理が動かないリスクを回避するために、この方法を活用してみてください。

 

最新情報をお届けします!

RPAに関する最新コラムやイベント情報をメールで配信中です。
RPA領域でお仕事されている方に役立つナレッジになりますので、ぜび登録してください!

最新情報を受け取る方はこちら

もっと知りたい方はこちら


ページトップ