Power AutomateでのDataverseのリレーションシップの使い方【後編】


今回は、Power AutomateでDataverseテーブルに対して、
OdataクエリやFetchXMLを使用した、関連レコードの扱いについてご紹介します。


一般的にDataverseの操作で扱うことの多い以下のトリガー・アクションでの設定方法をお見せします。

**トリガー：行が追加、変更、または削除された場合**
**アクション：新しい行を追加する、行を更新する、行を一覧にする**

# 目次
[検索列への値の挿入](https://qiita.com/skuramoto/items/11f1111a8eba7673714c#%E6%A4%9C%E7%B4%A2%E5%88%97%E3%81%B8%E3%81%AE%E5%80%A4%E3%81%AE%E6%8C%BF%E5%85%A5)
[行のフィルター](https://qiita.com/skuramoto/items/11f1111a8eba7673714c#%E8%A1%8C%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC)
[クエリの展開](https://qiita.com/skuramoto/items/11f1111a8eba7673714c#%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E5%B1%95%E9%96%8B)
[FetchXML](https://qiita.com/skuramoto/items/11f1111a8eba7673714c#fetchxml)
# 検索列への値の挿入
データの追加や更新をする際、普通の列はそのまま値を入れることができますが、検索列に値を入れるときにはコツがいります。
検索列：リレーション関係を保存する列

使用するアクション
- 新しい行を追加する
- 行を更新する


## 具体例
子テーブル、販売注文テーブルの行の更新をします。
販売注文テーブルの検索列、「製品情報」列に保存する親レコードのIDを設定したいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/25709428-bf4b-a01e-0af4-cb2a9381888d.png" width=70%>


行が作成された際に、検索列の値を更新するアクションを設定します。
今回は、行を更新するアクションの「製品情報(製品)」が検索列にあたります。
接続先は製品テーブルです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/066b73a1-93be-7ffa-bc0b-19ba34c8e54a.png" width=70%>

別タブでPower Appsを開き、テーブル一覧から製品テーブル(親テーブル)を選択し、詳細画面を表示します。
情報をとりたいテーブルのセット名をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/43594a2a-1494-1da1-36e6-d4455afbb5d9.png)

Power Automateの画面に戻り、検索列の項目に張り付けます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/046ab387-5022-84b8-d068-712b424d612d.png" width=70%>

セット名の後ろに半角の「()」をいれ、その間にGUIDになる値を入れます。
GUIDはテーブル名と同じ列に保存されてます。

:::note  warn
編集不可の列でわかりづらいですが、この列の各レコードをダブルクリックし、Ctrl＋Cで値をコピーすることができます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e7e5bc3c-c685-8212-34c4-91d191edc521.png)

Power Automateのセット名の後ろに「()」を入れ、そのカッコの間にGUIDを入れます。
GUIDを動的なコンテンツで設定する場合も同様にカッコの間に入れて設定できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/6ae191bf-bae6-47fc-43d4-2752c6e8dd81.png" width=70%>

これで検索列の値を設定することができます。

# 行のフィルター
検索列の値を使って行のフィルタリングをします。
Odataクエリでの検索列の扱い方ですね。関連づいている親のレコードによって、子レコードをフィルタリングをすることもできます。

使用するトリガー: 行が追加、変更、または削除された場合
使用するアクション: 行を一覧にする

## 具体例
子テーブル、販売注文テーブルの行に紐づけられた製品テーブルの値を扱ってフィルタリングをします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ef71ecd3-c4d3-971f-11f7-0947295ce1ec.png)

フィルタリングのために、販売注文テーブルの検索列、「製品情報」列の倫理名を取得します。
Odataクエリで検索列は以下のように指定します。
_`NAME`_value

該当テーブルの詳細画面で[列]を開き列一覧にて、該当の検索列「製品情報」を選択します。
NAMEに列の詳細の[論理名]を入力します。以下からコピーして使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/03d93922-698c-df25-8e85-cee37d3f82ce.png)

今回の場合は以下のように設定します。
_`crd83_products`_value

次にフィルター値として、親テーブルのGUIDを設定します。
動的なコンテンツの場合はそのままeqの後ろに設定し、静的な値の場合は「''」の間に設定します。
例1:動的なコンテンツ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f466eaa9-62c5-bab1-1953-97c1aa6a8d08.png)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d4730094-c3c1-6506-52ee-cfe94e990588.png" width=80%>


例2:静的な値
```
_crd83_products_value eq '0a2efff2-e74e-ed11-bba2-000d3aa0943a'
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e8263ddd-c34a-4132-ac7c-8f0c7da9c59b.png" width=80%>

# クエリの展開
「クエリの展開」は、関連レコードも一度にまとめて取得する際に利用する項目です。（アクション数の削減に有効）

これができるアクションはいくつかあります。
- ＩＤで行を取得する
- 行を一覧にする

## 具体例
今回、「行を一覧にする」アクションでクエリの展開を使用します。（IDで行を取得するアクションでも同じように使えます。）
子テーブルの販売注文テーブルの情報と一緒に、親テーブルの製品テーブルの情報も取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/adcaca60-e326-67d1-c619-a0cb8dc04a4c.png)

販売注文テーブルの検索列の論理名をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ab8c1187-d27f-e4d1-d89d-94687d35cc08.png)

親テーブルである製品テーブルで取得したい列の論理名をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c03adcc5-2940-6596-3b82-aa1a4b92b978.png)

Power Automateを開き、「行を一覧にする」アクションの「クエリの展開」にコピーした値を以下のように入れます。
「$select」はSQLクエリのSELECT文　と同じイメージですね。列名を指定して、とってくる情報を制御します。
親テーブルの列はカンマ区切りで複数列並べられます。

`子テーブルの検索列の論理名`（$select=`親テーブルの取得したい列の論理名`）
```
crd83_products($select=crd83_qiita_productname, crd83_qiita_cost)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/15b461e7-8cf0-80c3-e3c6-dc848ae45876.png" width=80%>


すると、その後の動的なコンテンツで「製品情報 製品名」と「製品情報 原価」というのが使えるようになっています。
「`子テーブルの検索列名` `親テーブルの列`」という名前のコンテンツです。
このように、クエリの展開を使うことで関連テーブルの特定の列を取ってこれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7adfc416-da95-2337-7e97-4ef7c10cb083.png)

関連テーブルの特定の列の情報だけが必要な場合は、このクエリの展開を使用することによってアクション数の削減ができるので、うまく使いたいですね。

# FetchXML
こちらは複雑な検索条件でのレコードの取得に便利に使えます。
Dataverseでは、Power Appsの通常の関数(Power Fx)やPower AutomateのOdataクエリでは表現が難しいような検索条件に対し、FetchXMLというクエリ言語（SQLのようなもの）を提供しています。

[FetchXMLをノーコードで編集する方法](https://qiita.com/skuramoto/items/918efc8b56ef953ff59d)も解説しているので参考にしてください。
上の方法でUIベースで編集することが多いですので、以下に実際のFetchXMLコードをお見せしますが、概要としてご参考いただければと思います！

## 具体例
FetchXMLを使った簡単な例を以下に記します。

まず、基本的な例です。
以下のコードで「crd83_qiita_order」テーブルのすべてのデータを取得します。
attributeで取得する列を指定しています。1つも指定しない場合はすべての列を取得できます。
ここで指定しないと、その後の動的なコンテンツでは値が入りません。

```xml
<fetch mapping='logical'>   
   <entity name='crd83_qiita_order'>  
      <attribute name='crd83_orderid'/>   
      <attribute name='crd83_products'/>   
   </entity>  
</fetch>  
```

上のxmlをSQL文で書くと以下のようになります。
SQLに慣れている方はこちら見ていただくとイメージつけやすいかと思います。

```sql
SELECT crd83_orderid,
       crd83_products
FROM crd83_qiita_order
```

リレーションを活用したFetchXMLの例を以下にあげます。
関連付けをFetchXMLで行うと以下のようになります。この処理はテーブルの行が多いと時間がかかります。
accountテーブルのすべての列を取得し、primarycontactidとcontactidをリンクさせて内部結合したcontactテーブルのfullname列を取得してます。
そして、contactテーブルの「所有ユーザーの姓」列が 'Kuramoto'に等しいすべての行を取得します。

```xml
<fetch>
  <entity name="account">
    <link-entity name="contact" to="primarycontactid" from="contactid" alias="c" link-type="inner">
      <attribute name="fullname" />     
    </link-entity>
    <filter type='and'>   
    <condition entityname="c" attribute='lastname' operator='eq' value='Kuramoto' />   
    </filter> 
  </entity>
</fetch>
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/30b15822-c4b6-989f-0395-2bcbfd6b96eb.png" width=70%>


上のxmlをSQL文で書くと以下のようなイメージです。

```sql
SELECT a.*,
       c.fullname
FROM account AS a
     INNER JOIN
     contact AS c
     ON a.primarycontactid = c.contactid
WHERE  c.lastname = 'Kuramoto';
```


ちなみにFetchXMLは集計にも対応してます。

https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/use-fetchxml-aggregation

１例をご紹介しましたが、より細かいクエリができますのでいろんな使い方をしてみて下さい。


# まとめ
今回はOdataクエリやFetchXMLを使用した関連レコードの扱い方についてご紹介しました。
リレーションを使用してデータをより便利に扱っていきましょう！