データの読み込みにおける戦略

完了

Power Apps を使用すると、ユーザーはビジネスのデータとプロセスを効率的に処理できます。 アプリは、コネクタを使用してデータにアクセスできます。 通常、アプリが起動したり新しい画面が表示されたりすると、いくらかの情報が初期表示用に取得されます。 画面のコントロールは、多くの場合コネクタに直接バインドされており、ユーザーに対して画面がレンダリングされるとデータが取得されます。 別の画面に移動したときに、データが再取得されることもあります。 最適化されていない場合、このプロセスによりユーザー エクスペリエンスが通常より低下したり、追加処理が発生したりすることがあります。 ユーザーのニーズとデータの読み込み方法を評価することにより、パフォーマンスの向上につながる戦略を立てることができます。

アプリを評価する際には、以下の重要な質問について考慮します。

  • ユーザーには役に立つ初期データが表示されていますか。 多くの場合、アプリの作成者はユーザーが画面に到達したときにデータを表示したいと思っています。 この動作によって、アプリを魅力的なものにでき、デモも表示できます。ただし、初期リストが規則に従って使用されなければ効率が低下します。 その場合、ユーザーがフィルター処理されていないレコードを大量に事前読み込みすると、アプリの速度が意図せず低下する可能性があります。

  • アプリには適切なデータ フィルターが用意されていますか。 表示される行数を減らす条件をユーザーが入力できるようにコントロールを追加すると、ユーザーの生産性とパフォーマンスを高めることができます。

  • 関連データを表示するためにオーバーヘッドが発生していますか。 リレーショナル データへのアクセスを提供するデータ ソースを使用しており、ギャラリーで関連する値を使用している場合、表示される行ごとにアプリがルックアップ クエリを実行している可能性があります。 この問題を特定するには、モニターを使用してアプリを実行し、結果を確認します。 代わりに関連データをコレクションに事前読み込みしてから、コレクションから検索した方が効率が向上する可能性があります。

  • 静的なデータと頻繁に更新されるデータを把握していますか。 データの事前読み込みを検討する前に、データが頻繁に更新されるかどうかを把握するようにしてください。 ほとんど変更されないデータや静的なデータをキャッシュすると、画面が表示される前にデータを準備できるため、アプリケーションのパフォーマンスを高めることができます。 頻繁に変更されるデータをキャッシュすると、アプリケーションのパフォーマンスに悪影響を与えたり、ユーザーに古いデータが表示されたりする可能性があります。

  • ユーザーに読み込みインジケーターを表示しますか。 コネクタからコントロールにデータを直接バインドする場合、コレクションにデータをキャッシュした場合と同様、読み込みインジケーターの表示と非表示を選択するオプションはありません。

  • データ ソースからはどの程度の量のデータが読み込まれますか。 キャッシュを検討している場合、キャッシュするデータ ソースの行数が、アプリ設定のデータ行制限で構成されている行数より多くならないようにしてください。

  • 列を計算したり、読み込んだデータを操作したりする必要がありますか。 必要な計算がデータ ソースでサポートされており、複数のアプリ間で列を活用できる場合は、それらの列をデータ ソースに実装してみてください。 たとえば、Microsoft Dataverse には計算列およびロールアップ列の機能が用意されています。

  • 他のアプリまたは自動化によって追加/変更されたデータを、どの程度の頻度で表示する必要がありますか。 データをコレクションに事前読み込みしている場合、コレクションを再読み込みすると更新された情報だけが表示されます。

直接データ ソース バインド

表形式コネクタのテーブルにギャラリーの Items プロパティを設定する場合や、テーブルに基づく Filter() 関数のような式を使用する場合は、直接データ ソース バインドを行います。 次の式は、Desks テーブルに直接バインドされます。

SortByColumns(Filter([@Desks], StartsWith(Title, TextSearchBox1.Text)), "Title", If(SortDescending1, Descending, Ascending))

この方法は、データ読み込みの最も基本的な方法です。 フィルターの条件が変更されると、データがコネクタから直接取得されます。 この方法は、Power Apps ランタイムがデータの読み込みと更新を決定できる、宣言によってデータを読み込む方法です。 そのため、ユーザーに読み込みインジケーターを表示するオプションはありません。

データが読み込まれたら、毎回データ ソースから取得しなくてもコントロールが使用できます。 Refresh(tableName) を使用すると、データ ソースからデータを手動で更新できます。 コントロールに表示されるデータは、アプリの別の場所でデータが変更されると自動的に更新されます。

直接バインドのもう 1 つの大きな利点は、コネクタでデリゲートがサポートされる場合、データ行の制限アプリ設定の制限を受けないという点があります。 たとえば、Microsoft Dataverse に 100,000 件の連絡先行があり、ギャラリーをテーブルに直接バインドした場合、ギャラリーは初期項目セットを読み込んだ後、ユーザーがスクロールするにつれてさらに多くの項目を読み込みます。 次のスクリーンショットは、初期データを読み込む getRows 呼び出しの後、ユーザーがギャラリーをスクロールするにつれて複数の getMoreRows 呼び出しが行われているモニター イベントを示しています。 これらの呼び出しは Power Apps によって自動的に行われるため、アプリはデータのページングを処理する必要がありません。

3 列のモニター イベントを示すスクリーンショット。

前述のように、ユーザーに 100,000 行を表示しようとは思わないでしょう。 代わりに、デリゲートをサポートするデータ ソースを使用してフィルターを追加することにより、コネクタがフィルター条件を処理して、一致する行のみを返すようにすることができます。

コレクションへのデータの事前読み込み

データをコレクションに事前読み込みすることにより、App.OnStart プロパティまたは OnVisible プロパティでデータの読み込みを制御できます。 複数の画面に同じデータが必要な場合、App.OnStart でデータを事前読み込みすることをお勧めします。 または、OnVisible からデータを事前読み込みすることにより、画面が使用されるまで読み込みを延期できます。 どちらのオプションを使用しても、データの読み込み中に読み込みインジケーターを表示できます。

次の式により、colDesks コレクションがクリアされ、データ行の制限アプリ設定に到達するまですべての Desks テーブル行が読み込まれます。

ClearCollect(colDesks,Desks)

事前読み込みされたデータを使用するには、関連する数式を変更してコレクションを使用します。

更新された式が強調表示された、[ツリー ビュー] > [画面] メニューのスクリーンショット。

コレクションに事前読み込みされたデータを使用する場合、ClearCollect() 関数を再度使用して最新のデータが取り込まれない限りデータは更新されません。 このシナリオは、更新が Power Apps によって自動的に管理される直接データ ソース バインドとは異なります。

この方法のもう 1 つの利点は、データ ソースを使用して各行を保存しなくても、ユーザーが移動しながら複数の行を変更および確認できる点です。 変更が完了したら、単一の Patch() 関数呼び出しを使用してデータ ソースにコミットし直すことができます。 コミット前にすべての変更を取り消す場合、コレクションを更新できます。 次の例は、Patch() 関数を使用して、colDesks コレクション内の変更を Dataverse 内の Desks テーブルにコミットし直すプロセスを示しています。

Patch(Desks,colDesks)

永続ストレージからの読み込み

シンプルな事前読み込み方法のバリエーションとして、まずデバイスのローカル ストレージからデータを読み込んだ後、データ ソースから直接読み込む方法があります。 この戦略は、データ ソースが遅い場合や断続的に使用できなくなる場合に役立ちます。 このパターンを実装するには、次の手順を実行します。

  1. LoadData() 関数を使用して、デバイスのローカル ストレージからデータ (存在する場合) を読み込みます。 この時点で、コレクションにバインドされているコントロールにデータが表示されます。

  2. データ ソース コネクタから同じコレクションにデータを直接読み込みます。 この時点で、コレクションにバインドされているコントロールには、コネクタから読み込まれた、更新されたデータが表示されます。

  3. SaveData() 機能を使用して、デバイスのローカル ストレージに最新のデータを保存します。

式は次のようになります。

LoadData(colDesks,"LocalDesks",true);

ClearCollect(colDesks,Desks);

SaveData(colDesks,"LocalDesks");

ユーザーがときどき接続されていないことがある場合、新しいデータの読み込みを行う前に接続されているかどうかの条件付きチェックを追加できます。 変更された式は次のようになります。

LoadData(colDesks,"LocalDesks", true);

If (Connection.Connected,

ClearCollect(colDesks,Desks);

SaveData(colDesks,"LocalDesks")

)

変数への事前読み込み

Office 365 ユーザーなど、表形式ではないコネクタを使用する場合、関数呼び出しの結果を変数に保存することでパフォーマンスを高めることができます。 次の例では、式が関数を 3 回呼び出してプロファイルから情報を取得しています。

Set(profileDisplayName,Office365Users.MyProfileV2().displayName);

Set(profileHireDate,Office365Users.MyProfileV2().hireDate);

Set(profileCity,Office365Users.MyProfileV2().city);

次の式は、コネクタを 1 回呼び出すだけで 3 つの変数に入力できるため、より効率的です。

Set(profile,Office365Users.MyProfileV2());

Set(profileDisplayName,profile.displayName);

Set(profileHireDate,profile.hireDate);

Set(profileCity,profile.city);

また、さらに簡略化して Profile という 1 つの変数にした後、ドット表記を使用し、必要に応じてプロパティにアクセスできます。たとえば、profileHireDate 変数の代わりに profile.hireDate プロパティを使用できます。 これを行うには、App.OnStart で次の式だけを使用します。

Set(profile,Office365Users.MyProfileV2());

次に、個々の変数を使用してコントロールの色を設定する If(IsBlank(profileHireDate),Red,Green) 式を使用する代わりに、ドット表記の profile.hireDate を使用する If(IsBlank(profile.hireDate),Red,Green) 式を使用します。

データの同時読み込み

コネクタからデータを事前読み込みする場合で、キャッシュする項目が複数ある場合、既定では順番に 1 つずつ実行されます。 次の例は、2 つのテーブルとユーザー プロファイルをコレクションおよびグローバル変数に読み込むプロセスを示しています。

ClearCollect(colDesks,Desks);

ClearCollect(colDeskFeatures,'Desk Features');

Set(userProfile, Office365Users.MyProfileV2())

各テーブルに個別にデータが事前読み込みされる場合、Concurrent() 関数を使用して並列して実行できます。

Concurrent(

ClearCollect( colDesks,Desks ),

ClearCollect( colDeskFeatures, 'Desk Features' ),

Set( userProfile, Office365Users.MyProfileV2() )

)

1 回限りのデータ読み込み

App.OnStart でデータを事前読み込みする場合、アプリの起動時に一度だけ実行されます。 代わりに OnVisible プロパティを使用して延期した場合、画面が初めて使用されたときに事前読み込みされ、画面内の移動するたびに OnVisible が実行されます。 この方法では、コレクションが頻繁に更新される可能性があります。 この状況を回避するには、ClearCollect() 関数を実行する代わりに、データを既に読み込んでいるかどうかをまずチェックする必要があります。

ClearCollect(colDesks,Desks) 関数呼び出しを、コレクションが空であるかどうかのチェックが含まれる If(IsEmpty(colDesks),ClearCollect(colDesks,Desks)) 式に置き換えます。

アプリ設定とデータ読み込み

前述のように、アプリ設定はアプリのパフォーマンスと動作に影響を与える可能性があります。 コレクションを使用してデータを事前読み込みする場合、データ行の制限が適用されるため、大きいデータセットは事前読み込みに適さない可能性があります。

他に注意が必要な設定は、遅延読み込みです。 この設定により、画面での式呼び出しの実行が必要になるまで遅延され、オンデマンドで実行されます。 この設定は、すべての新しいアプリに対して既定で有効になり、古いアプリには手動で有効にできます。

アプリのデータの読み込みの最適化は、各アプリに固有です。 このトピックでは、ユーザーおよびアプリのニーズを評価して、パフォーマンスとユーザー エクスペリエンスをできる限り最適化するデータ読み込み戦略をカスタマイズする方法について説明しました。 最適化は一度限りではなく、アプリの利用が終了するまで行う必要があります。 さらに、データ読み込みを最適化する新しいプラットフォーム機能が利用可能になった場合はそれらの機能も活用できます。