リレーションがかかっているフィールドへのデータ登録でハマりがちな罠 【PowerAutomate】【Dataverse】

# 記事について
本記事は、PowerAutomateでDataverseの特定のテーブルのフィールドとリレーションされているフィールドにデータを登録・更新するときの入力形式について説明します。
私自身、やり方がわからず長い間沼にハマってしまったので、被害者が今後増えないように、こんなことで貴重な時間を費やしてほしくない、という一心で記事を作成しました。

PowerAutomate、Dataverseって何？って方は以下の公式ページをご覧ください。

[Microsoft PowerAutomateについて](https://learn.microsoft.com/ja-jp/power-automate/ "タイトル")
[Microsoft Dataverseについて](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/data-platform-intro "タイトル")


# 対象読者
- PowerAutomateとDataverseを駆使して、ゴリゴリにシステム開発をしているエンジニア
- PowerAutomateに慣れてきて調子に乗ってる中級者
- 英語が苦手で海外の文献を見てもエラーが解決できないエンジニア

# 私を長い間苦しめた意味不明なエラー
#### URL was not parsed due to an ODataUnrecognizedPathException. Resource not found for the segment provided in the URL.

### エラーの説明
調べてみると、他のテーブルとリレーションがかかっているフィールドにデータを登録・更新するときに起こるそうです。
また、適切な入力形式ではない、論理名が適切ではないときに発生するエラーの模様です。

##### うーん、よくわからない。

### エラーが発生したフィールド

>#### 画像1![AddressID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/13766183-8712-9227-72b8-742654adeafa.png)


取引先企業というテーブルにレコードを作成しようとしたときに発生しました。
レコード作成時に、AddressIDを入力データの一つとしており、そのフィールドはAddressというテーブルのAddressという一意識別子を参照しています。(ややこしい)
データの種類としては検索に当たります。
そして、AddressテーブルのAddressが合致するレコードのAddressIDがそのフィールドに入力されるわけです。

:::note info
エンティティについて
エンティティは巷でよく言われるテーブルというイメージでとらえてもらって構いません。エンティティはそれ自体でテーブルとしての機能を果たすだけではなく、
フォームやビューといった機能を自己完結的に提供する箱というイメージです。
:::

# 解決法
### 解決ポイント① 入力形式を理解できているか
Dataverseでは、リレーションがかかっているフィールドにおいて、そのままデータを入れるだけではうまくデータが格納されないように作られています。
画像1のように入力形式が決められています。
これを詳細に書くと、

 ##### 参照先テーブルの論理名の複数形(参照先テーブルのリレーションがかかっているフィールドのデータ)

この例で書き直すと、取引先企業のレコードを作成しようとしているので、

###### Addressテーブルの論理名の複数形![AddressID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/39cf5eca-36c4-fa07-ff9a-aea5e675bdd9.png)
(AddressテーブルのAddress)

となります。

複数形にするということがかなりのポイントです。脳死でsをつけてはいけません！！！

### 解決ポイント② テーブル(エンティティ)の論理名が分かっているか
解決ポイント①で 
##### 参照先テーブルの論理名の複数形
を示しました。

実際にテーブルの論理名を確認する手順をAddressテーブルで説明します。


1. PowerAppsからテーブルに移動します。

2. テーブルがずらっと出てくるので、論理名を知りたいテーブルをクリックします。

3. テーブルの概要がパッと見で見れるようになっています。
画像2はその画面に該当します。

4. テーブルプロパティのプロパティという部分をクリックします。
下にある'高度なオプション'というボタンを押すと、画像３のようなものが見れると思います。
画像3に表示されている論理名が今回入力するべきテーブルの論理名になります。

> ##### 画像2 ![table_address.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/81bb0bbe-a5cf-5f4a-ae17-ca0bb2ccf279.png)



> ##### 画像3 ![Address論理名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/9f7d008a-308f-379d-1904-e5d729304e40.png)

1つのテーブルには、テーブルの論理名と作成したフィールドごとに論理名が設定されます。

論理名を使うときには、どちらの論理名に該当するのかを考える必要があります。

最後に確認した論理名を複数形にする必要があります。そのため今回の場合では

##### 画像3の論理名　-> 画像3の論理名 + s

とすればよいです。

#### テーブルの論理名の複数形を別の方法で確認

~~~
https://組織のエンティティ名.dynamics.com/api/data/v9.1/EntityDefinitions(LogicalName='テーブルの論理名')?$select=EntitySetName
~~~

組織のエンティティ名は、PowerAppsのホームで右上の歯車マークをクリックし、詳細設定をクリックすると

タブが新規で開かれるのでそのURLを確認すると以下のように記述されているので
~~~
https://○○○○.dynamics.com/....
~~~

組織のエンティティ名が○○○○に該当します。

テーブルの論理名は先ほど説明したPowerAppsから見る方法なりで確認し、入力します。

アクセスすると、

~~~
{"@odata.context":"https://ノベルワークスの論理名.dynamics.com/api/data/v9.1/$metadata#EntityDefinitions(EntitySetName)/$entity","EntitySetName":"○○○○","MetadataId":"XXXXX"}
~~~

成功すると、上記のJSONデータが表示されます。

EntitySetNameのvalueである ○○○○ がテーブルの論理名の複数形に該当します。


# まとめ
リレーションがかかっているフィールドへのデータ登録は複雑になりがちです。私自身もさまざまなサイトを見てきましたが、明確に説明しているサイトはあまり見つけられませんでした。
(英語で書かれたものばかり)
この記事が皆さんのシステム開発でのエラーを助けるものであることを願います。