こんにちは!ファンリピートの加藤です。
今回はMicrosoftが提供するPower Appsでリレーションシップを扱う際に知っておくべき情報をまとめました。初めてPower Appsを触る方に取ってここが最初の関門と言っても良いと思います。
具体的な数式を交えて解説しているので、ぜひ参考にしてみてください!
PowerAppsとは
概要
Power AppsはPower Platformの一部で、エンドユーザーが自分でビジネスアプリケーションを作成できるツールです。直感的なドラッグ&ドロップのインターフェースと、Excelのような式言語を使用してアプリケーションを作成します。これにより、開発者でなくても独自のビジネスアプリケーションを作成することが可能になります。しかし、各機能の実装には関数やコードへの理解が必要なため勉強や慣れが必要になります。
ライセンス
ライセンスの体系にはいくつかあり、ユーザー単位、アプリ単位、またはデータ使用量に応じた従量課金性など様々なプランが存在します。自分の団体に必要なものを吟味した上でご購入されることをおすすめします。
こちらも以下のリンクからライセンスガイドを参照していただければと思います。料金体系は都度変更があるので最新版をご参照ください。
https://learn.microsoft.com/ja-jp/power-platform/admin/powerapps-flow-licensing-faq
リレーションシップの簡単な解説
Power Appsでのリレーションシップ
まず前提としてテーブルを理解していなければいけません。テーブルは持たせたいデータの最小単位とも言いますが、例えば以下のように学校で生徒の名簿を見たことがあると思います。

まさに赤枠で囲んでいる所がテーブルを指します。
次にリレーションですが、各テーブルの関係を表しています。1:多や多:多などの言葉を聞いたことがあるかもしれません。Power Appsで設定する際には1:多、多:1、多:多でのリレーションのみ設定可能ですので、それらの解説を次にご紹介したいと思います。
1:多、多:1の関係

1:多と多:1について理解するために例としてスマートフォンの買取を行う際に必要なテーブルとリレーションをER図にしてみました。図の通り、皆さんがスマートフォンの買取をお願いするときに皆さんの「氏名」、「住所」、「電話番号」などの情報に加えて、買取に出す商品は1つ以上であることからそれぞれの「デバイス名」、「容量(GB)」、「査定ランク」などのレコードという値が必要になります。つまり、一つの「買取情報」に対していくつかの「商品情報」が関連しているということがまさにこの関係を表しています。
ちなみに二つのエンティティ(テーブルが書かれている箱)をつなぐ線の先が変な形をしていますが、それぞれ買取情報側を1とし、商品情報側のトリの足のようなものを多として表記しています。
トリの足に〇がついている場合は存在しないことも含みます。つまり、依頼者が買取情報のみ登録し、商品情報を入力していない場合に商品情報が存在しないことがありえるということです。
また、後で大変重要になるのですが、多から1はデータ直接参照できますが、1から多へは直接参照ができません。特にデータの保存処理をForAll関数を使って行おうとするとできないという事象にあたるかもしれません。それを頭に入れながらデータベースの設計をしてみてください!(1:1の設定がないため、その変わりに1:多や多:1としてリレーションを設計することがありますが、そこでもこの情報は要注意!)
多:多の関係

多:多の関係は上図の例のように「製品情報」と「カテゴリ」のリレーションで考えられます。製品は複数のカテゴリを持つ可能性があり、カテゴリ自体も複数の製品情報をもつことがあります。
この関係で問題になるのは、それぞれの側からみていくつかの相手情報を持っている場合を考えるので、それぞれのテーブルに空のデータを抱えてしまうことがあります。そこで中間テーブルを扱うといった方法が良く挙げられますが、本記事の趣旨とは外れるため省略します。
気になる方はご自分で調べてみるのも良いかもしれません。
実際にDB(データベース)を作ってみる!
DBの設計
DBを作る前に設計、具体的にどんなテーブルやリレーションを作るのかER図などに書くことをおすすめします。ノーコード・ローコードツールはDBの作成においても柔軟ですが、実装する際にここがあやふやだと非常に困ることになります。

今回は「Purchase_info(買取情報)」と「Product_info(商品情報)」を例にして買取情報からみて1:多の関係にあるリレーションについて扱ってみます。
PKとFK
上記でリレーションを解説したときのER図には無かったPKとFKというものがあります。先ほどはリレーションの関係というもの自体を理解しやすいために記述していなかったのですが、これもDB設計時には非常に重要なものになります。
PK(主キー/Primary key)はテーブルそれぞれがもつ重複しない一意の識別子のことで、FK(外部キー/Foreign key)はテーブルのある列に、別のテーブルの特定の列に含まれる項目しか入力できないようにする制約。また、その際に指定する列の事です。
さて、何いってるか分からないですね。
ここで簡単に説明するとPKはまさにほしい買取情報が一つに指定できるということですね。なぜなら先ほど記述した通り、重複しない一意の識別子だからです。
FKですが、FKに設定したテーブルを子として設定元のPKを持つテーブルを親として親子関係から様々な制約をすることができます。
Power Apps上でテーブルを作成
それでは早速作成していきます。

Power Appsのホームから画面左の「テーブル」タブを選択します。

次に「新しいテーブル」か「空白のテーブルから開始する」を選択し、テーブル作成画面へと遷移します。ここでは「空白のテーブルから開始する」から始めることとします。
それでは先ほど作ったER図に沿ってテーブルの列を埋めていきます。ここで注意してほしいのはデータの値を日本語で持たせたい場合でも、はじめは英語で列名を設定することです。理由は次の画像を見てもらえば分かりますが、「表示名」に日本語で「依頼者」と入力した場合、「高度なオプション」をクリックして現れる「スキーマ名」が空になってしまいます。

プログラミングを普段からしている方は関数やデータ名は必ず英語で命名していると思いますが、初学者の方がPower Appsから触れた場合中々気づかないかもしれません。
どうしても日本語で列名やテーブル名を設定したい人はまず英語で「表示名」を設定した後に日本語に直してみてください。すると、「スキーマ名」には英語で設定した列名が入っていると思います。最初に「表示名」と「スキーマ名」を別々に設定できないので二度手間ですが、Power Appsの仕様なのであきらめるしかないです…
なんでそんなに日本語入力について解説するかというと、必ずしもエンジニアにしか設定できないものにしてしまうとせっかくのMicrosoftのローコードツールなのにもったいないという思いがあるからです。修正箇所があれば誰でも直せるようなものになっていれば優しいかもしれませんね。しかし、本記事では英語のまま進めていきます。
また、ここではPKやらFKやらは一旦無視してください。リレーションは後で設定していきます。

すべて入力できたら画面右下の「作成」ボタンをクリックします。これで「Purchase_info(買取情報)」テーブルは作成完了です。

同様に「Product_info(商品情報)」も作ります。
では、リレーションの設定に移っていきます。

Purchase_infoかProduct_infoのテーブル画面で「スキーマ」の「リレーションシップ」をクリックしてください。(ここではProduct_infoの画面)
左上の「+新しいリレーションシップ」を選択し、「多対一」を選びます(Purchase_infoから見た場合は「一対多」を選択)。関連(1)テーブルにはPurchase_infoを選んで「ルックアップ列の表示名」をFKにあたる「Purchase_id(買取情報ID)」としてください。ここについては後ほど説明します。
リレーションシップでルックアップ列をデフォルトの名前と変えたのはテーブル名とリレーションシップを指定する名前が同じになるのを避けたいからです。
アプリをでデータから自動生成

それではPower Appsの「ホーム」に戻ってから、「データで開始する」を選びます。

次に「既存のテーブルを選択する」をクリック。そこで「Purchase_info」を選択します。

すると、UIの調整をせずとも簡単にデモアプリを作成してくれます。素晴らしい!
アプリ上でデータを取ってみる

現在、このアプリに連携しているテーブルはPurchase_infoだけなので「+データの追加」からProduct_infoも追加します。

それでは二つのテーブルに適当にデータを入れます。ここで注意してほしいのはProduct_infoのテーブルで「その他の19件」をクリック後にPurhase_idを選択してください。そうしないと紐づくPurchase_infoを編集画面から追加できません。
以下は例です。
Purchase_info

Product_info

アプリ例

ではこれを前提にアプリの下半分が空白だと思うのでそこに関連するProduct_infoを表示させる実装を行いましょう。

ここで私のこだわりが入ります。「データテーブル」は今回は選びません。理由はこれを扱うとライセンスが「プレミアム」になるからです。
プレミアムライセンスで無ければ使えない機能というのはこれ以外にも様々ありますが、Power Appsの導入企業がどのライセンスを扱っているかによってライセンスの問題でアプリ自体が使えないことがあります。本記事ではそれを避けていきます。問題ない方はこちらを使えば簡単なのでぜひ利用してみてください。
それでは「垂直ギャラリー」をMainContainer1に格納します。おそらくGallery1というエレメントが入ったと思います。その中にProduct_infoで表示させたいレコードの分だけLabelを格納します。今回は4つですね。

次にGallery1のItemsの数式を以下のようにしてください。
Filter(Product_info, Purchase_id.Purchase_info = RecordsGallery1.Selected.Purchase_info)
これです。そんなの簡単だと思ったあなたはもう大丈夫ですね。
Filter関数というのはPower Apps独自の関数で条件に一意する一連のレコードを検索するものです。
公式のドキュメントから構文を引っ張ってきましたが、
Filter(Table*, Formula1 [, *Formula2*, … ] )
参照:https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-filter-lookup
- Table – 必須。 検索するテーブル。
- Formula(s) – 必須。 テーブルの各レコードが評価される数式。 関数は、結果が true のすべてのレコードを返します。 テーブル内の列を参照することができます。 複数の数式を指定した場合、すべての数式の結果は And 関数を使用して組み合わせられます。
というモノです。
今回の場合に当てはめて簡単に書くと
Filter(検索したいテーブル, リレーションシップ(多から1).多にあたるテーブル = 現在選択しているテーブル)
です。
Galleryを使用したデータ検索はもうできるようになりましたね。
まとめ
今回はリレーションシップに関する基本知識について解説しましたが、各設定方法などを覚えて実装が進むことを祈っています!
読んでいただきありがとうございました!