MS FlowでDynamics 365のN:N関連を読み込む

#D365コネクターについて
D365コネクターは非推奨になりました。
D365コネクターでなくCDSコネクターをお使いください。

#概要
Power AutomateでN:Nの関連付けを取得しようとしても、アクションに該当するものはなく、工夫しないと取得できません。
レコードの一覧取得を使って取得できるのですが、デフォルトでプルダウンに表示されるエンティティ名には、N:Nの関連付けに該当するエンティティはありません。
そこで、WebAPIによりN:Nの関連付けを管理するエンティティに対してselectをかけられることを利用します。create,updateは試していません。

N:Nの関連付けを利用する例として、Contact（取引先担当者）とadx_webrole（WEBロール）の関連を取得する場合をあげます。
これによって、ポータルアドオンを使用しているときにMS Flowによってできることの幅が広がりました。
WEBロールはポータルアドオンで使用するエンティティで、セキュリティロールのような役割をポータルアドオンで果たすものです。セキュリティロールと違い、カスタムエンティティとして存在しています。

下図はデフォルトで表示されるエンティティ名を見ているところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/83d14f8d-43a2-ab25-b2d3-f7a64c48d70b.png)

本記事は下記を参考に作成しています。
https://www.sikich.com/insight/how-to-find-n-n-relationships-with-dynamics-365-logic-apps-and-flow/

ポータルアドオンについては下記吉田さんのサイトを参照
https://memo.tyoshida.me/powerapps/what-is-powerapps-portal/

私もポータルアドオンの概要について記事を書いています。読みにくいかもしれませんが。。
https://qiita.com/dinok/items/f007eac57f0acd0cb5af

#N:Nの関連付けを使ったPower Automateを組む
##N:Nの関連付けをWebAPIで読み込む
`https://[組織名].api.crm7.dynamics.com/api/data/v9.1/`

上記のURLをブラウザで打つと、エンティティのリストが出ます。
Contact（取引先担当者）とadx_webrole（WEBロール）の関連はエンティティ名(contactなど）で検索していくとそれっぽいものが見つかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/f2a62827-406e-2978-41d2-3e1473c6eb51.png)

このadx_webrole_contactsetをURLのお尻につけると、エンティティのレコードも取得できます。
adx_webroleid（MS Flowで言う一意の識別子、レコードごとに割り振られるGUID）とcontactidのペアが取得できていて、N:Nの関連っぽいということが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/ce4cf816-499c-c95f-1249-ac8268785095.png)


MS Flowのエンティティ名に入れると「一致する値がありません」と出ますが、気にせずに「カスタム値の入力」を押して"adx_webrole_contactset"を入力することで、N:Nの関連付けを取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/dab60093-82d4-03a4-f968-99717f5cf9b6.png)

##Contactごとに付与されているWEBロールを確認する
その際にはこのようなMS Flowになります。
ポータルユーザーはContact（デフォルト名：取引先担当者）のことで、エンティティ名を変えています。
このMS Flowだと、ポータルユーザーの取得でフィルタークエリが空白なので、Contactを全取得しています。
取得したポータルユーザーに対して「Apply_to_each」を実行して、1つずつ順にみていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/9dd5e628-2a29-57b0-039b-3848dfa47aa0.png)

##N:N関連の取得条件でポータルユーザーのGUIDを使う
adx_webrole_contactsetのうち、contactidがApply_for_eachでループしているポータルユーザーのGUIDに一致するレコード（＝ループ中のポータルユーザーについてのN:N関連付け）のみ取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/8fec049d-0a69-4b49-8715-40051f66ce43.png)

##取得したN:N関係を条件判定に使う

ここでもう一つ問題に当たります。
取得したadx_webrole_contactsetのadx_webroleidを条件に使って、特定のWEBロールがポータルユーザーに付与されているかを確認したいのですが、動的なコンテンツにadx_webroleidが出てきません。

そこで、式を選択し、
`items('Apply_to_each_2')?['adx_webroleid']`
を入力し「OK」ボタンを押すと（OK押し忘れると消えるので注意）、値を使うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/43ec9905-1447-a524-e19d-0255488f9ec2.png)


「次の値に等しい」の右側は条件として使用したいWEBロールのGUIDになります。下図では適当に"aaaa"と入れていますが、実際はWEBロールのGUIDを入れてください。
下図では空欄ですが、入力したWEBロールがポータルユーザーに付与されていた場合に行う処理を、条件分岐の「はい」に入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/ec7cb434-2b0c-a2ce-7d34-ff7631eed395.png)


下図は、全体図を入れるのが難しいので一部ですが、テストをすると動いたところです。
dx_webrole_contactsetへのレコード取得が成功していることが確認できます。
ちなみに、Dynamics 365のレコード作成のような、テストするときにトリガーを起こすのが面倒な場合は、「テスト」ボタンから前回の実施結果を利用して簡単にMS Flowを実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/9d728039-4ab8-6405-68e9-cd030c794cd3.png)

##全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190486/d58d6b1f-9f4c-372e-be3b-369334409c52.png)


#補足
Dynamics 365 ＝ PowerApps モデル駆動型アプリと読み替えていただいて大丈夫です。