キャンバスアプリでリレーションシップを使いこなす

# キャンバスアプリでのリレーションシップ・検索列の扱い
Power Appsのキャンバスアプリでリレーションシップ・検索列を扱う際、他の列より少し特殊になります。つまづきポイントになってるので要注意です！


## 呼び出し方
普通の列だと「テーブル.列名」で1つのフィールドに特定することができるのですが、
検索列の中に入っているのは関連テーブルのキーなので、検索列に保存してあるのは、関連テーブルの行ごとです。

実は検索列の場合「テーブル.列名」までだとその先の関連テーブルに格納されている列まで特定されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/b623b029-df35-b8d3-4bd7-bf77f1698822.png)

ただ、リレーションを張らず、ほかのテーブルからデータを取ってくる操作を行おうとするとFilter関数やLookUp関数を利用する必要が出てきます。そうするとデータの整合性をとれなくなったり、関数処理が増えるので、アプリが重くなったりします。
そのため、別テーブルから情報を取ってくる際、直接取得できるという点でリレーションは効果的です。

## ギャラリーでの使い方
ギャラリーコントロールを表示させたいテーブルとつなげます。（今回は販売注文テーブル）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7da868fd-3592-d40f-5461-ccd3d3eef95b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/74db2e25-16d2-9080-3808-c210bf64b703.png)

販売注文テーブル（子テーブル）に関連付けられてる製品テーブル（親テーブル）に保存されてる製品の画像を表示させましょう。
販売注文テーブルの検索列（列名：製品情報）から情報を取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/3a57364b-d6a0-162e-9936-7d01483e563a.png)

Image1コントロールを選択すると上のプロパティにImageプロパティが表示されて数式バーに「SampleImage」が入ってることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/da73c53a-bcd2-8589-e0b6-9fff73d9a1c5.png)
Imageプロパティに以下の関数を入力します。

```
ThisItem.製品情報.画像
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7fe4e867-3437-d14e-0ec4-51f8392bfbdc.png)

`ThsiItem`はギャラリーの各行でテーブルの各行を取ってくるもの。つまり、販売注文テーブルの1行には絞ります。
`製品情報`は販売注文テーブル（子テーブル）においての1列を絞ります。
普通の列だとここまででいいのですが、検索列の特性として、「親テーブルの1行までしか絞らない」ので、実はこの状態では、製品テーブル（親テーブル）の1行までしか定まってません。
そのため、その中の1列を特定するために最後`画像`を付けると、ようやく一つのデータに絞ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ae583d17-d966-f031-af38-5f622d708c13.png)



## フォームでの使い方
Formコントロールを販売注文テーブルとつなげます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/0d6319e4-86ad-40f5-0445-09cb7ad6d7f0.png)
[フィールドの編集]＞[フィールドの追加]
で表示させたい列を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/86db45ae-2b47-216e-4100-6089fbd06bdd.png)


検索列はFormコントロールの中では、ドロップダウンメニューで表示されますね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/55019e93-37a7-c362-b2d6-0382dee9150f.png" width=60%>

Altキーを押しながらマウス操作でドロップダウンメニューを表示させると文字列が、、、、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7e07a50b-b8ea-2464-1e66-6105e30b64d5.png" width=65%>


ここに何が表示されてるかを確認するには製品情報のDataCardValue（入力ボックス自体）を選択した状態で右の[フィールドの編集]をクリックすると[主要なテキスト]と［SearchField］が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/bc1504d5-8b18-928d-12a5-c768301fdfce.png)
検索列は1行ごそっと持っている列なので、親テーブル（今回の製品テーブル）のどの列を表示させるのかここで決められます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e3abbb4d-d387-1b75-40e9-bc79bc19f4c3.png" width=50%>

今回はわかりやすく製品名にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f7caf418-fa82-8a63-a602-c76b163f3dc5.png" width=50%>

※フォームのロック解除を忘れず
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/edf16c54-b1f8-1da8-b37b-e6fef2dedbee.png" width=60%>

すると、ドロップダウンメニューで製品名が表示されてわかりやすくなりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8cd9d82d-60ea-5d9d-6bf4-df8b1f68eea0.png" width=55%>

## 関連レコードを含めたデータの登録方法
リレーションを持つレコードに対して、キャンバスアプリから、関連テーブルとレコードを紐づけながらデータを更新できます。ここで使うのが、Patch関数です。
Patch関数はレコード作成・更新の関数で、一般的な使い方は以下です。

    Patch(テーブル名, 更新するレコード, {列名：更新後のレコードの値})

Patch関数の第三引数において、検索列を指定することができます。
そして、`更新後のレコードの値`として、「リレーションシップを設定したい行」自体を設定することで、関連を設定できるようになります。

例えば、Patch関数で、関連テーブルの行を指定して１行追加したいときは以下のように関数を書きます。

    Patch(子テーブル名, Defaults(子テーブル名), {子テーブルの検索列名: LookUp(親テーブル名, 親テーブルの任意列名="指定したい値")})

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/16216328-062e-4d95-84b7-1c45016f6062.png)

上の関数の意味について、詳しく解説します。
この例において、販売注文テーブルが子テーブル、製品テーブルが親テーブルです。
子テーブルである販売注文テーブルの新しい行を作成します。（一行を追加する場合、Defaults関数を使ってデータ入力フォームを事前設定します。）
新しい行の中身として、製品情報という列を指定します。製品情報列を、製品テーブル（親テーブル）の製品名列が"Surface Laptop"に等しい行を設定するということができます。
（LookUp関数の出力値は行です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/46853ddb-2968-3685-c402-b396ab9bf824.png)

この関数を実行した時にどうなるのか、実際のデータを確認してみましょう。
キャンバスアプリにおいて、この関数を実行すると、販売注文テーブルに新しい行が追加されます。
モデル駆動型アプリのフォームでデータの確認を行うと、以下の画像のようになっています。
製品情報列が「AT-120」となっていて、下のサブグリッドを確認すると製品名が「Surface Pro」である行と紐づいていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e4638901-c978-c810-c4bc-44aeeb6eacde.png)


今回は、LookUp関数で「リレーションシップを設定したい行」を設定しましたが、やり方はいくつかあります。
他にも例えば、親レコードが一覧になっているときのギャラリーやドロップダウンにおいて、Gallery.selectedやDropdown.selectedを指定しても「リレーションシップを設定したい行」を設定することができます。
ここを使いこなせると、いろいろなことができるようになりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/aec20759-37aa-237b-e50b-3ff946e00cd0.png)

(2024/2/1 追記)
子レコードと親レコードを同時に新規追加したい場合の方法は以下の記事にまとめました。

https://qiita.com/skuramoto/items/cab7418829354d22f310

他にも既存レコードと関連付ける場合は以下の関数が使えます。
- Relate関数
- UnRelate関数

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-relate-unrelate

# まとめ
キャンバスアプリでのリレーションについて、主な操作をまとめました。
ギャラリーやフォームでの基本操作やPatch関数での操作など、知っているとリレーションを最大限生かしたアプリを作ることができます。ぜひご活用ください！