一対多のリレーションシップの使用

完了

一対多のリレーションシップは、Dataverse で最もよく使用するリレーションシップです。 このユニットでは、Contoso 社の共有ワークスペース (ホット デスク機能) ソリューションのシナリオについて引き続き見ていきます。 キャンバス アプリでリレーションシップを使用する方法を説明するために、以下の例では場所テーブルとデスク テーブルの間のリレーションシップを使用します。 次の図は、リレーションシップとそれに対応するデータを示しています。

一の側に場所レコード、多の側に複数のデスク レコードが示されている一対多のリレーションシップの図。

ユーザーが場所を選択してその場所のデスクを下のギャラリーに表示できるようにするには、次のような画面を作成します。

ボックスの一覧で場所 1 が選択され、その下に選択した場所のデスクの一覧が表示されている UI の例のスクリーンショット。

ほとんどのデータ ソースと同様に、Filter() 関数を使用すると、選択した場所のデスクのみを表示することができます。 この式は、次の例のようになります。

上記の例のデータ ソースを設定している式のスクリーンショット。

Dataverse で一対多のリレーションシップを使用する場合は、代わりに次の式に示すようなドット表記 (Control.Selected.Desks) を使用して、場所のデスクを参照することができます。

デスク ギャラリーの Items プロパティの別の式のスクリーンショット。

この例では、どちらの式でも、選択した場所に関連付けられている同じデスクの一覧が表示されます。 ドット表記を使用するほうが、Filter() 関数を使用するよりも簡単かつ簡潔です。

ドット表記構文を使用して一対多のリレーションシップをナビゲートすると、既定では関連付けられているすべてのレコードが取得されます。 フィルターを使用すると、関連付けられている行にさらに条件を適用できます。 次の式は、一対多のリレーションシップを使用して、その結果を状態がアクティブなものでフィルター処理します。

Filter(FilterLocation_1.Selected.Desks, Status= 'Status (Desks)'.Active)

また、デスクの行からリレーションシップを使用することもできます。 たとえば、ギャラリーの各デスクに場所の住所を表示するとします。 検索を使用して場所レコードを取得し、プロパティとしてその住所列にアクセスすることができます。

コントロールの Text プロパティに割り当てられた式のスクリーンショット。

Lookup() の式を使用する代わりに、ドット表記を使用して ThisItem.Location.Address を参照できます。

デスクの場所の住所を割り当てる簡単な式のスクリーンショット。

リレーションシップのナビゲーションは、1 つの階層に限定されていません。 たとえば、場所に関連付けられている基本連絡先があり、その氏名列を表示する場合は、次の式を使用できます。

ThisItem.Location.'Primary Contact'.'Full Name'

ドット表記を使用することにより、リレーションシップのどちらからかに関係なく、関連付けられているデータを簡単に含めることができます。

一対多のリレーションシップを定義する最も簡単な方法は、編集フォームを使用して関連付けられた行を作成または更新することです。 フォームに検索列を追加すると、Choices() 関数を使用して選択可能な値がユーザーに表示されます。 以下に、デスクの行を追加して、フォームに場所の検索列を追加するプロセスの例を示します。

ドロップダウン コントロールで場所の検索が表示されているデスク レコードの編集フォームのスクリーンショット。

このドロップダウン コントロールの詳細プロパティには、Items プロパティがどのように設定されているかが示されています。

場所の検索列に使用するドロップダウン コントロールの詳細プロパティのスクリーンショット。

Choices() 関数を使用することで、別のデータ ソースとして検索テーブルを追加する必要がなくなります。 Choices() 関数の結果はテーブルであるため、次のようにフィルター処理や並べ替えを追加できます。

Filter(Choices([@Desks].contoso_Location), Status='Status (Locations)'.Active)

設定する検索値が既にある場合 ([場所] の画面からデスク レコードを作成する場合など) は、データ カードの値の DefaultSelectedItems プロパティを設定して、フォームのフィールドの Visible プロパティをオフに設定できます。 この設定により、SubmitForm() 関数が呼び出されたときに既定値を渡すことができます。

場所のボックスの一覧の既定値を設定する式のスクリーンショット。

Patch() 関数を使用して検索列を設定する場合は、列の値に主テーブルのレコードを設定します。 次の例は、デスクの行と場所のボックスの一覧で現在選択されているプライマリの場所の行の間のリレーションシップの定義を示しています。

Patch(Desks, ThisItem, {Location:FilterLocation_1.Selected})

Relate() 関数を使用して同じ結果を得ることもできます。 1 つ目のパラメーターはプライマリの行 (場所) に関連付けられている行 (デスク) の一覧で、2 つ目のパラメーターはその一覧に追加または関連付ける行 (デスク) です。

Relate(FilterLocation_1.Selected.Desks,ThisItem)

同様に、Unrelate() 関数を使用して行の関連付けを解除できます。たとえば、選択されている場所の FilterLocation_1.Selected に関連付けられているデスクから ThisItem (デスク) の関連付けを解除します。

Unrelate(FilterLocation_1.Selected.Desks,ThisItem)

Unrelate() 関数を使用する場合は、関連付けられているレコードのプライマリの検索の値がなし (null) に設定されることに注意してください。 アプリではプライマリの関連付けがない行を表示できない場合があるため、孤立した行がないようにしてください。 この Contoso 社の例では、デスクの一覧が場所に関連付けられているときにのみ表示される場合、場所のないデスクは孤立することになり、アプリでアクセスできなくなります。 この状況は、リレーションシップの動作プロパティで関連付けられている行へのリンクを削除するように設定されている場合にプライマリの行を削除したときにも、副作用として発生する可能性があります。