委任についてUnderstand delegation

PowerApps には、データのフィルター処理、並べ替え、およびテーブルの整形を行う強力な一連の関数が用意されています。たとえば、FilterSortAddColumns 関数があります。PowerApps includes a powerful set of functions for filtering, sorting, and shaping tables of data: Filter, Sort, and AddColumns functions to name just a few. これらの関数を使用すると、ユーザーが必要とする情報に絞り込んでアクセスするようにすることができます。With these functions, you can provide your users with focused access to the information they need. データベースに関する知識がある方にとっては、これらの関数の使用はデータベース クエリの記述に似ています。For those with a database background, using these functions is the equivalent of writing a database query.

効率的なアプリを構築する鍵は、デバイスに取り込む必要があるデータの量を最小限に抑えることにあります。The key to building efficient apps is to minimize the amount of data that needs to be brought to your device. おそらく、何百万件ものレコードがあっても必要なレコードはごく一部です。また、1 つの集計値で何千件ものレコードを表すことができます。Perhaps only a handful of records from a sea of millions are needed, or a single aggregate value can represent thousands of records. さらに、先頭のレコード セットのみを取得し、残りはユーザーが要求したときに取得することもできます。Or perhaps only the first set of records can be retrieved, and the rest brought in as the user gestures that they want more. レコードを絞り込むことで、アプリに必要な処理能力、メモリ、およびネットワーク帯域幅を大幅に削減できます。その結果、携帯ネットワークで接続している電話でも、ユーザーへの応答時間が短縮されます。Being focused can dramatically reduce the processing power, memory, and network bandwidth needed by your app, resulting in snappier response times for your users, even on phones connected via a cellular network.

委任では、PowerApps の数式の表現力により、ネットワーク経由で移動するデータを最小限に抑えるというニーズに対応できます。Delegation is where the expressiveness of PowerApps formulas meets the need to minimize data moving over the network. つまり、委任とは、PowerApps がデータをアプリに移動してローカルで処理せずに、データの処理をデータ ソースに委任することです。In short, it means that PowerApps will delegate the processing of data to the data source, rather than moving the data to the app for processing locally.

委任が複雑であり、この記事が存在する理由は、PowerApps の数式で表現できるすべての処理をすべてのデータ ソースに委任できるわけではないからです。Where this becomes complicated, and the reason this article exists, is because not everything that can be expressed in a PowerApps formula can be delegated to every data source. PowerApps 言語は Excel の数式言語によく似ており、さまざまな数値操作関数やテキスト操作関数を使用して、メモリ内のブック全体に完全かつ瞬時にアクセスできるように設計されています。The PowerApps language mimics Excel's formula language, designed with complete and instant access to a full workbook in memory, with a wide variety of numerical and text manipulation functions. そのため、SQL Server などの強力なデータベース エンジンを始め、ほとんどのデータ ソースよりも機能が充実しています。As a result, the PowerApps language is far richer than most data sources can support, including powerful database engines such as SQL Server.

大規模なデータ セットを操作するには、委任できるデータ ソースと数式を使用する必要があります。Working with large data sets requires using data sources and formulas that can be delegated. これが、アプリの高いパフォーマンスを維持し、ユーザーが必要とするすべての情報にアクセスできるようにする唯一の方法です。It is the only way to keep your app performing well and ensure users can access all the information they need. 委任できない箇所を示す青い点の修正候補に注意してください。Take heed of blue-dot suggestions that flag places where delegation is not possible. 小規模なデータ セット (500 件未満のレコード) を操作する場合は、数式を委任できなければ処理をローカルで実行できるため、どのデータ ソースと数式でも使用できます。If you're working with small data sets (less than 500 records), you can use any data source and formula as processing can be done locally if the formula cannot be delegated.

委任可能なデータ ソースDelegable data sources

委任をサポートしているソース データとサポート範囲の完全な一覧については、委任の一覧を参照してください。See the delegation list for the full list of which data sources support delegation and to what extent.

今後も既存のデータ ソースへの委任のサポートを追加するだけでなく、データ ソースも追加していきます。We are continuing to add delegation support to existing data sources, as well as add more data sources.

インポートされた Excel ブック ("静的データをアプリに追加します" データ ソースを使用)、コレクション、およびコンテキスト変数に格納されたテーブルには、委任が不要です。Imported Excel workbooks (using the "Add static data to your app" data source), collections, and tables stored in context variables don't require delegation. これらのデータはすべてメモリ内に既にあり、PowerApps 言語をすべて適用できます。All of this data is already in memory, and the full PowerApps language can be applied.

委任可能な関数Delegable functions

次の手順では、委任できる数式のみを使用します。The next step is to use only those formulas that can be delegated. ここに含まれるのは、委任できる数式の要素です。Included here are the formula elements that could be delegated. ただし、データ ソースはすべて異なっており、すべてのデータ ソースでこれらの要素がすべてサポートされているわけではありません。However, every data source is different, and not all of them support all of these elements. 数式を作成する際は、青い点の修正候補の有無を確認してください。Check for blue-dot suggestions in your particular formula.

この一覧は随時変更されます。These lists will change over time. より多くの関数と演算子で委任がサポートされるよう取り組んでいます。We're working to support more functions and operators with delegation.

フィルター関数Filter functions

FilterSearch、および LookUp は委任できます。Filter, Search, and LookUp can be delegated.

Filter 関数と LookUp 関数内では、以下をテーブルの列と組み合わせて使用して、適切なレコードを選択できます。Within the Filter and LookUp functions, the following can be used with columns of the table to select the appropriate records:

すべてのレコードで 1 つの定数値に評価される数式の一部を使用することもできます。Portions of your formula that evaluate to a constant value for all records can also be used. たとえば、Left( Language(), 2 ) は、レコードのどの列にも依存していないため、すべてのレコードに対して同じ値を返します。For example, Left( Language(), 2 ) does not depend on any columns of the record and therefore returns the same value for all records. 実質的には定数です。It is effectively a constant. コンテキスト変数、コレクション、および信号を使用した場合は、定数でない可能性があるため、Filter および LookUp は委任できなくなります。Use of context variables, collections, and signals may not be constant and therefore will prevent Filter and LookUp from being delegated.

上記の一覧に記載されていない重要な項目:Some notable items missing from the above list:

並べ替え関数Sorting functions

SortSortByColumns は委任できます。Sort and SortByColumns can be delegated.

Sort の数式には、1 つの列の名前のみを指定できます。他の演算子や関数を含めることはできません。In Sort, the formula can only be the name of a single column and can't include other operators or functions.

集計関数Aggregate functions

SumAverageMin、および Max を委任できます。Sum, Average, Min, and Max can be delegated. 現時点では、限定された数のデータ ソースがこの委任をサポートしています。詳細については、委任一覧に関するページをご覧ください。Only a limited number of data sources support this delegation at this time, check the delegation list for more details.

CountRowsCountA、および Count などのカウント関数は委任できません。Counting functions such as CountRows, CountA, and Count cannot be delegated.

StdevP および VarP などの他の集計関数についても委任できません。Other aggregate functions such as StdevP and VarP cannot be delegated.

その他の関数Other functions

以下の関数を含むその他すべての関数では、委任がサポートされません。All other functions do not support delegation, including these notable functions:

一般的なパターンでは、AddColumnsLookUp を使用して、1 つのテーブルの情報を別のテーブルにマージします。これは、データベース用語では一般に結合と呼ばれます。A common pattern is to use AddColumns and LookUp to merge information from one table into another, commonly referred to as a Join in database parlance. 例:For example:

AddColumns( Products, "Supplier Name", LookUp( Suppliers, Suppliers.ID = Product.SupplierID ).Name )AddColumns( Products, "Supplier Name", LookUp( Suppliers, Suppliers.ID = Product.SupplierID ).Name )

LookUp は委任可能な関数ですが、ProductsSuppliers が委任可能なデータ ソースであっても、AddColumns 関数は委任できません。Even though Products and Suppliers may be delegable data sources and LookUp is a delegable function, the AddColumns function is not delegable. 数式全体の結果は、Products データ ソースの先頭部分に制限されます。The result of the entire formula will be limited to the first portion of the Products data source.

LookUp とそのデータ ソースは委任可能なため、大規模でも、データ ソース内のどこかで Suppliers の一致が見つかる可能性があります。Since the LookUp and its data source are delegable, a match for Suppliers can be found anywhere in the data source, even if it is large. 潜在的な欠点は、LookUp により、Products の先頭の各レコードについて個別にデータ ソースへの呼び出しが行われるため、ネットワーク上でのやり取りが大量に発生することです。A potential downside is that LookUp will made separate calls to the data source for each of those first records in Products, causing a lot of chatter on the network. Suppliers が十分小さく、頻繁に変更されない場合は、代わりに、アプリの起動時に Collect 呼び出しを使用してデータ ソースをアプリにキャッシュし (最初の画面で OnVisible を使用します)、キャッシュに対して LookUp を実行します。If Suppliers is small enough and does not change often, you could cache the data source in your app with a Collect call when the app starts (using OnVisible on the opening screen) and do the LookUp to it instead.

委任できない場合の制限Non-delegable limits

委任できない数式は、ローカルで処理されます。Formulas that cannot be delegated will be processed locally. これにより、PowerApps の数式言語をすべて使用できます。This allows for the full breadth of the PowerApps formula language to be used. ただし、欠点があります。最初にすべてのデータをデバイスに取り込む必要があるため、ネットワーク経由で大量のデータを取得する可能性があります。But at a price: all the data must be brought to the device first, which could involve retrieving a large amount of data over the network. その処理には時間がかかり、アプリの動作が遅いとか、ハングしているかもしれないという印象を与える可能性があります。That can take time, giving the impression that your app is slow or possibly hung.

この問題を回避するために、PowerApps では、ローカルで処理可能なデータの量を 500 レコードに制限しています。To avoid this, PowerApps imposes a limit on the amount of data that can be processed locally: 500 records. この数字を選択したのは、小規模なデータ セットには変わらず完全にアクセスでき、大規模なデータ セットでは部分的な結果を確認して使い方を改善できるためです。We chose this number so that you would still have complete access to small data sets and you would be able to refine your use of large data sets by seeing partial results.

この機能は、ユーザーの混乱を招く可能性があるため、使用する際は当然注意が必要です。Obviously care must be taken when using this facility as it can be confusing for users. たとえば、100 万件のレコードがあるデータ ソースに対する、委任できない選択数式の Filter 関数があるとします。For example, consider a Filter function with a selection formula that cannot be delegated, over a million record data source. フィルター処理はローカルで実行されるため、100 万件のレコードのうち先頭の 500 件だけがスキャンされます。Since the filtering will be done locally, only the first 500 records of the million records will be scanned. 目的のレコードがレコード 501 または 500,001 の場合、Filter では考慮されず、返されません。If the desired record is record 501, or 500,001, it will not be considered or returned by Filter.

また、集計関数でも混乱を招く可能性があります。Another place where this can be confusing is aggregate functions. 100 万件のレコードがある同じデータ ソースの 1 つの列の平均を計算します。Take Average over a column of that same million record data source. Average はまだ委任できないため、先頭の 500 件のレコードのみの平均が計算されます。Since Average cannot yet be delegated, only the first 500 records will be averaged. 注意が必要です。アプリのユーザーが部分的な回答を完全な回答と誤解する可能性があります。Care must be taken or a partial answer could be misconstrued as a complete answer by a user of your app.

青い点の修正候補Blue dot suggestions

委任されるかどうかを簡単に確認できるように、作成時に数式に委任できないものが含まれている場合に青い点の修正候補が表示されます。To make it easier to know what is and is not being delegated, the authoring experience provides blue dot suggestions when a formula contains something that cannot be delegated.

青い点は、委任可能なデータ ソースを操作する数式にのみ表示されます。Blue dots are only shown on formulas that operate on delegable data sources. 青い点が表示されないものの、数式が適切に委任されていないと思われる場合は、上記の委任可能なデータ ソースの一覧でデータ ソースの種類を確認してください。If you don't see a blue dot and you believe your formula is not being properly delegated, check the type of data source against the list of delegable data sources above.

Examples

この例では、商品 (具体的には果物) を含む [dbo].[Products] という名前の SQL Server テーブルを使用します。In this example, we will use a SQL Server table that contains products, in particular fruits, names [dbo].[Products]. PowerApps では、[新しい画面] でこのデータ ソースに接続する 3 つの画面から成る基本的なアプリを作成できます。On the New screen, PowerApps can create a basic three screen app connected to this data source:

3 画面アプリ

ギャラリーの Items プロパティの数式に注目してください。Note the formula for the Gallery's Items property. SortByColumns 関数と Search 関数を使用しています。どちらも委任できます。It is using SortByColumns and Search functions, both of which can be delegated.

検索テキスト入力コントロールに「Apple」と入力します。Let's type "Apple" into the search text-input control. 注意して見ると、新しい検索の新しいエントリの処理中に、少しの間、画面の上部で点が動いているのがわかります。If we are very observant, we will momentarily see marching dots on the top of the screen while the new entry in the new search is processed. 点が動いているのは、SQL Server と通信していることを示しています。The marching dots indicate that we are communicating with the SQL Server:

検索テキスト入力コントロール

これはすべて委任できるため、[dbo].[Products] テーブルに何百万件ものレコードが含まれていても、すべてが検索されます。ユーザーが結果をスクロールすると、ギャラリー内のページが移動します。Because this is all delegable, even if the [dbo].[Products] table contains millions of records, we will still find them all, paging through them in the gallery as the user scrolls through the results.

ご覧のように、"Apple" と "Pineapple" の両方に一致しています。You will notice that we are seeing a match for both "Apple" and "Pineapple". Search 関数では、テキスト列内全体から検索語句を探します。The Search function will find a search term anywhere in a text column. それでは、代わりに、果物の名前の先頭のみで検索語句を検索してみましょう。If instead, let's say we wanted to only find the search term at the beginning of the fruit's name. 別の委任可能な関数である Filter を使用すると、より複雑な検索語句を指定できます (わかりやすくするために、SortByColumns 呼び出しを削除します)。We can use another delegable function, Filter, with a more complicated search term (for simplicity we'll remove the SortByColumns call):

SortByColumns 呼び出しを削除する

これは正常に機能しているようで、"Apples" だけ表示され、"Pineapple" は表示されていません。This appears to be working, only "Apples" is correctly showing now and "Pineapple" is not. ただし、ギャラリーの横に青い点が表示され、数式の一部分の下に青い波線があります。However, there is a blue dot showing next to the gallery and there is a blue wavy line under a portion of the formula. 画面上のサムネイルにも青い点が表示されています。There is even a blue dot showing in the screen thumbnail. ギャラリーの横にある青い点をポイントすると、次のメッセージが表示されます。If we hover over the blue dot next to the gallery, we see the following:

青い点をポイントする

委任可能なデータ ソースである SQL Server と委任可能な Filter 関数を使用しているものの、Filter 内で使用した数式は委任可能ではありません。Although we are using Filter which is a delegable function, with SQL Server which is a delegable data source, the formula we used within Filter is not delegable. MidLen はどのデータ ソースにも委任できません。Mid and Len cannot be delegated to any data source.

それでも、一応But it worked, didn't it? 機能しています。Well, kind of. これが、注意を促す黄色のアイコンや赤色の波線エラーではなく、青い点が表示される理由です。And that is why this is a blue dot instead of a yellow hazard icon and red wavy error. [dbo].[Products] テーブルに含まれているレコードは 500 件未満なので、問題なく機能しました。If the [dbo].[Products] table contains less than 500 records, then yes, this worked perfectly. すべてのレコードがデバイスに取り込まれ、Filter がローカルで適用されました。All records were brought to the device and the Filter was applied locally.

このテーブルに含まれているレコードが 500 件を超える場合は、"テーブルの 500 件の先頭レコード内の" "Apple" で始まる果物だけがギャラリーに表示されます。If instead this table contains more than 500 records, then only fruit which begin with "Apple" in the first 500 records of the table will be displayed in the gallery. レコード 501 または 500,001 に "Apple, Fuji" という名前が含まれていても、見つかりません。If "Apple, Fuji" appears as a name in record 501 or 500,001 it will not be found.