Power Apps でリレーションシップを使用する

完了

実際に Power Apps は、アプリでリレーションシップを確立して利用するためにカスタマイズされた、豊富な機能とコントロールのセットを提供します。 リレーションシップには、通常、ほとんどのアプリで 2 つの主要なアプリケーションがあります。

まず前述したように、複数のテーブルにデータを保存し、このデータをリレーションシップを利用してシームレスに接続します。 このユニットでは、顧客や請求書などのテーブルを接続する方法を解説し、テーブル間に意味のあるアソシエーションを構築する方法を示します。

次に、子レコードに直接アクセスする際は、親レコードから情報をフェッチするためにリレーションシップがよく使用されます。 この場合、請求書レコードのコンテキストで作業し、顧客の名前を取得する方法を学習します。 この機能を使用すると、関連レコードから関連情報を効率的に利用および表示して、アプリの使いやすさとわかりやすさを改善できます。

Power Apps で親テーブルと子テーブルを接続する

この例では、Power Apps フィルターと LookUp 関数を使用し、親子リレーションシップを参照する方法を見ていきます。

Customer テーブルは、この関係の親であり、1 人の顧客が複数の請求書を持てることを意味します。 Customer テーブルには Invoice テーブルの参照がありません。 この例では、このテーブルのデータ ソース名は CustomerTable です。 テーブルは次のようになります。

ID 顧客名 顧客の電話番号
1 Contoso 513-555-1212
2 Fabrikam 206-555-1313
3 Tailspin Toys 404-555-1414

Invoice テーブルはこのリレーションシップの子です。 この例では、このテーブルのデータ ソース名は InvoiceTable です。 テーブルは次のようになります。

ID 請求書の日付 請求書の説明 InvoiceAmount CustomerID
1 5/16/2020 パーツ 412.33 1
2 5/1/2020 サービス 205.44 3
3 5/6/2020 出張 132.98 1
4 5/31/2020 パーツ 75.55 2

Power Apps で、これらのテーブルをデータ ソースとして作成した場合は、ギャラリー コントロールを使用して顧客テーブルの内容を表示できます。 次の手順でギャラリー コントロールを使用します。

  1. ギャラリー コントロールをキャンバスに挿入します。

  2. Items プロパティを CustomerTable に設定します。

このギャラリーはテーブルが含む顧客レコードをすべて一覧表示します。 これは Gallery1 です。

InvoiceTable のすべての内容を表示するには、次の手順に従います。

  1. ギャラリー コントロールをキャンバスに挿入します。

  2. Items プロパティは InvoiceTable に設定できます。

このギャラリーはテーブルが含む請求書レコードをすべて一覧表示します。 これは Gallery2 です。

Gallery1 で選択されている顧客の請求書のみを表示するには、Gallery2 の Items プロパティを次のように変更する必要があります。

Filter(InvoiceTable, CustomerID = Gallery1.Selected.ID)

この式では次のことが行われます。

式の引数 式の入力 メモ
ソース InvoiceTable
logical_test CustomerID = Gallery1.Selected.ID CustomerID は InvoiceTable の列名です。 Gallery1.Selected. ID は、ギャラリーで選択されているレコードの ID 列の値です。

この式により、Gallery2 には Gallery1 で選択されている顧客の請求書レコードのみが表示されます。

親に格納されている情報を子から検索する

場合によっては、子レコードから関連する親レコードまで、上方向または "ボトムアップ" に移動する必要が生じます。 たとえば ID が 2 の請求書レコードの詳細を検証しており、ID が 3 の顧客とのアソシエーションが判明したシナリオでは、親テーブルから詳細をさらに抽出できます。

この場合は、テーブル間のリレーションシップを使用して、親テーブルが含む関連レコードを参照し、名前や電話番号など、顧客に関連する情報を取得できます。 この手法を使用すると、子レコードで利用できる情報に基づいて親テーブルが含むリンクされたレコードから関連する詳細を収集し、包括的なビューを提供して関連するデータ間の相互参照が容易になります。 Power Apps では、LookUp 関数を使用してこれを行うことができます。

LookUp 関数では、データ ソースに対してクエリを実行して、評価基準に一致する単一レコードを見つけることができます。 次の例では、前の例と同じテーブルを使用しますが、混乱を避けるために何もない画面から始めます。

InvoiceTable のすべての内容を表示するには、次の手順に従います。

  1. ギャラリー コントロールをキャンバスに挿入します。

  2. Items プロパティを InvoiceTable に設定します。

  3. レイアウトをタイトル、サブタイトル、本文に設定します。

  4. データ ウィンドウで、タイトルInvoiceDateに、サブタイトルInvoiceAmountに、本文 CustomerID に設定します。

このギャラリーはテーブルが含む請求書レコードをすべて一覧表示します。 日付フィールドを下の画像のように表示する場合は、タイトル フィールドを Text(ThisItem.InvoiceDate,DateTimeFormat.ShortDate) これは Gallery3 に変更します。

すべての請求書レコードの一覧を含むギャラリーのスクリーンショット。

顧客ごとの ID 値を表示しても、アプリ ユーザーは大した情報は得られません。 そこで、ID ではなく、顧客の名前を表示するには、次の手順に従います。

Gallery3本文のラベルを選択し、Text プロパティを次のように設定します。

LookUp(CustomerTable, ID = ThisItem.CustomerID, CustomerName)

この式では次のことが行われます。

式の引数 式の入力 メモ
ソース CustomerTable
logical_test ID = ThisItem.CustomerID ID は CustomerTable の列名です。 ThisItem.CustomerID は、ギャラリーで現在選択されているレコードの CustomerID 列の値です。
結果 CustomerName これは logical_test に一致したレコードに返される列です。

その変更を行った後、Gallery3 から仕入先名がわかるようになります。

ユーザー フレンドリーな請求書レコードの一覧ギャラリーのスクリーンショット。

パフォーマンス上の注意点

ギャラリー内で子レコードから親レコードへのルックアップを実行すると、パフォーマンスに重大な影響を及ぼす可能性があります。 デモで紹介されたシナリオでは、ギャラリー内で LookUp 関数を利用してデータ ソース クエリが複数回 (InvoiceTable のレコードごとに 1 回) トリガーされます。

考慮事項: InvoiceTable に数百ものレコードが含まれている場合、LookUp 関数が同じ回数だけ実行されます。 つまり、潜在的に個別のデータ ソース呼び出しが数百回も発生する可能性があります。 その結果、ネットワーク トラフィックの増大と処理時間の延長が発生し、最終的にアプリのパフォーマンスに影響を与える可能性があります。

特に複数のレコードが処理されるギャラリーでは、データ ソースの呼び出しを実装する前に、パフォーマンスのトレードオフを比較検討することが重要です。 データのキャッシュや、反復的な呼び出しを最小限に抑えるロジックの再構築により、これらのクエリを最適化することは、アプリの最適なパフォーマンスを維持するうえで不可欠です。 このような操作をギャラリーのコンテキストで実装する場合は、データの規模とパフォーマンスへの潜在的な影響を常に考慮してください。

このシナリオでは、コレクションやその他の手段ですべての顧客レコードにクエリを実行し、格納してから、コレクションに対して検索を行うことをお勧めします。 データ パフォーマンスについての詳細は、「Power Apps のパフォーマンス上の考慮事項」のブログ記事で確認してください。

次のユニットでは、Microsoft Dataverse で自動的にドリルダウンし、リレーショナル データに関連するすべての問題を取り除くしくみを学習します。