欲しいアプリは自分で作る!

Power Platform や Azure などを利用して作成した業務アプリや趣味アプリなどをご紹介します。

N:Nのテーブルのレコードを紐づける方法

この記事は、Power Apps Advent Calendar 2024 シリーズ2 12/23 担当分の記事です。

qiita.com



世の中には、リレーションというものが存在します(急に何


例として経費申請を考えてみます。
1つの申請に対して、移動費や宿泊費など複数の明細がありますよね。

それらをデータとして管理する場合、申請テーブルと明細テーブルに分け、申請テーブル 1:N 明細テーブルという関係になると思います。
申請テーブルのレコード1個に対して、明細テーブルのレコードがN個紐づいている形になります。

1:Nの1の方のテーブルを親、Nの方のテーブルを子と呼ぶことが多いです。


では、1:Nではなく、N:Nのケースについて考えてみましょう。


例として、プロジェクトと社員を考えてみます。
1つのプロジェクトには、複数の社員が参画しますよね。
で、1人の社員は、複数のプロジェクトに参画する場合がありますよね。

それらをデータとして管理する場合、プロジェクトテーブルと社員テーブルに分け、プロジェクトテーブル N:N 社員テーブルという関係になると思います。
プロジェクトテーブルのレコード1個に対して社員テーブルのレコードがN個紐づいたり、社員テーブルのレコード1個に対してプロジェクトテーブルのレコードがN個紐づいたりしている形になります。


Dataverse では、これら1:NやN:Nの設定をテーブル同士に対して設定することが可能です。


で、今日の主題は、このN:Nのレコードをキャンバスアプリを用いて紐づけてみよう、という内容となります。


1:Nの場合の紐づけ方

本題に入る前に、まずは1:Nの場合を考えてみましょう。

Dataverse では、テーブル同士を1:Nでリレーション設定すると、子テーブルの列の中に「親テーブルを参照する検索列」が1つ追加されます。


その列に対して、親のレコードそのもの(レコード型)を指定してあげることで、親子のレコードを紐づけることができます。



N:Nの場合の紐づけ方

続いて、N:Nの場合を考えてみましょう。

テーブル同士をN:Nでリレーション設定しても、どちらのテーブルの列にも参照列は追加表示されません。


で、やりたいことは、こういうことですよね。

下図の画面の左側のプロジェクトの1つのレコードと、右側の社員の1つのレコードを紐づけたい。
(左右のギャラリーコントロールのitemsは、ただのプロジェクトテーブルと社員テーブルの名前を書いているだけで、それぞれ全件表示しています)

これを紐づけたい分だけ操作すれば、N:Nの紐づけができます。


ということで、結論から。
Relate 関数を使用します。

Relate および Unrelate 関数 - Power Platform | Microsoft Learn

式を言葉で書くと、「プロジェクトの選択されたレコードに紐づく社員(第一引数)として、社員の選択されたレコード(第二引数)を紐づける」という意味になります。
これを実行すると、Apps開発PJTに小玉純一を参加させることになります。


注目すべきは第一引数です。


Dataverseの列の一覧には表示されませんが、互いに紐づくテーブルは、上記のように指定することでアクセスが可能です。
試しに、一旦上記で「Apps開発PJT」と「小玉純一」を紐づけたうえで、「プロジェクトの選択されたレコードに紐づく社員」を表示してみましょう。
右側のギャラリーコントロールの items を、「左側のギャラリーで選択されたレコードに紐づく社員」としてみました。

先ほど紐づけた小玉だけが表示されました。


もう一度、Relate 関数の使い方を見てみましょう。

第一引数である「プロジェクトの選択されたレコードに紐づく社員」には、複数レコードが入りますよね。なので、テーブル型です。
一方、第二引数である「社員の選択されたレコード」は、社員1名=1レコードなので、レコード型です。

ここまで整理したところで、Learn を読んでみましょう。
第一引数はテーブル型、第二引数はレコード型を指定するよう指示がありますよね。そういうことです。

Relate および Unrelate 関数 - Power Platform | Microsoft Learn



N:Nの場合の紐づけの解除のしかた

ここまでくればピンと来るかなと思います。
紐づけを解除するには、Unrelate 関数を使用します。引数の考え方は同じです。


式を言葉で書くと、「プロジェクトの選択されたレコードに紐づく社員(第一引数)から、社員の選択されたレコード(第二引数)を紐づけ解除する」という意味になります。
これを実行すると、Apps開発PJTから小玉純一を離脱させることになります。


実行してみましょう。
galプロジェクト.Selected.社員 から小玉純一が消えたことが確認できます。



何に応用できるのか

Dataverse には、N:Nでリレーション設定された標準テーブルがたくさんあります。
代表格として、「セキュリティロール ⇔ ユーザー」を取り上げてみましょう。

1つのセキュリティロールには複数のユーザーを紐づけられますし、1人のユーザーには複数のセキュリティロールを紐づけられます。
よって、N:Nの関係です。


で、この紐づけ/紐づけ解除の操作って、意外と手間がかかるんですよね。

例えば、1つのセキュリティロールに対して、複数のユーザーを一括で削除してみます。
ユーザーを複数選択して一気に削除ボタンが押せればよいのですが、なぜかユーザーは単一選択しかできないため、1人選んでは削除、を繰り替えさなければなりません。


そんなあなたに、キャンバスアプリの Relate / Unrelate 関数です。


例えば以下のように、左側にはセキュリティロール一覧、右側には選択されたセキュリティロールに紐づくユーザーの一覧を表示しておき、


右側でチェックを付けた全ユーザーを一括で該当のセキュリティロールから削除(紐づけ解除)することができます。


また、一括追加したいユーザーのメールアドレスの一覧などあれば、一括追加することも可能です。



おわりに

先々月まで担当していたプロジェクトで「チームとユーザーの紐づけを効率的に行いたい」という課題があったり、お客様から「セキュリティロールからユーザーを一括削除したい」というご相談をいただいたりすることがあったので、記事にしてみました。


闇雲にアプリ化すればいいという話でもないのでケースバイケースではありますが、最終的にプラスになるのであれば、お試しいただく価値はあるかなと思います。



欲しいアプリは欲しい人が作る時代へ。
何かのご参考になれば幸いです。