PowerApps|多対多関係で、どのレコードと紐づいてるか取得する方法|JavaScript,many to many

PowerAppsのレコードにおいて、
多対多の関係のテーブルが存在します。
モデル駆動型の組み込みJavaScriptで、多対多の関係のテーブルにおいて、特定のレコードがどのレコードと紐づいているのかを調べる方法はなかなか載っていません。
この記事では、JavaScriptにて、多対多関係でのレコードがどのレコードと紐づいているかを取得するコードを紹介します。

多対多の紐づくレコードの取得で当たる壁
- 検索型ではないので、RetrieveRecord関数を使用できない。
→検索型とは、1対Nなどの関係に使われる型の種類です。 - 関係テーブルもアクセスすることができないので、取得できない。
これらの壁を回避しながら実装していきます。

なるべくそのままコピペして使えるようにしてありますので、活用してみてください!
前準備
今回実装するのは、
モデル駆動型内でのJavaScriptを使用して、多対多関係のレコードに紐づくレコードを取得することです。
そのために、以下の情報が必要です。
必要な情報
- 現在のテーブルの論理名(例で言うと、テーブル1)
- 取得したいレコードがあるテーブルの論理名(例で言うと、テーブル2)
- 取得したいレコードがあるテーブルの論理名の複数形
→複数形は「セット名」とも言います。テーブルのツールからコピーできます。 - リレーションシップの論理名
- ①のテーブルのIDの論理名
- ②のテーブルのIDの論理名
- 取得したいフィールドの論理名
→IDフィールドやその他の取得したいフィールド
テーブルが2つありややこしいですが、
探したいレコードがあるテーブルが①
基準となるレコードがあるテーブルが④ です。
どちらがどっちのテーブルかを認識しておきましょう。
テーブルのIDとは、
テーブル名と同じ名前の列が存在しているはずで、それです。

これらの準備ができたら、実際に以下のコードに適用していきましょう。
コード例
前章の情報を準備できたら、コードを実装していきます。
このコードは、基準となるレコードが存在するテーブル(例で言うと、テーブル1)が表示されているフォーム内に設置することを想定しています。
function RetrieveRelatedRecords(executionContext) {
var primaryEntityId = Xrm.Page.data.entity.getId().replace(/[{}]/g,""); // 主エンティティのレコードID
//変数定義
var primaryEntityName = 'primaryEntityName'; // 現在のテーブルの論理名(主エンティティ名)
var relatedEntityName = 'relatedEntityName'; // 取得したいレコードがあるテーブルの論理名(関連エンティティ名)
var relatedEntityName_prural = 'relatedEntityNames';// 取得したいレコードがあるテーブルの論理名の複数形
var relationshipEntityName = 'relationshipEntityName'; // リレーションシップの論理名(関係エンティティ名(中間テーブル))
var primaryEntityIdFieldName = 'primaryEntityIdField'; // ①のテーブルのIDの論理名(主エンティティのIDフィールド名)
var relatedEntityIdFieldName = 'relatedEntityIdField'; // ②のテーブルのIDの論理名(関連エンティティのIDフィールド名)
var relatedEntitySearchField = 'relatedEntitySearchField'; // 取得したいフィールドの論理名(関連エンティティの検索フィールド)
var fetchXmlQuery = `<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
<entity name='${relatedEntityName}'>
<attribute name='${relatedEntitySearchField}' />
<order attribute='${relatedEntitySearchField}' descending='false' />
<link-entity name='${relationshipEntityName}' from='${relatedEntityIdFieldName}' to='${relatedEntityIdFieldName}' visible='false' intersect='true'>
<link-entity name='${primaryEntityName}' from='${primaryEntityIdFieldName}' to='${primaryEntityIdFieldName}' alias='primary'>
<filter type='and'>
<condition attribute='${primaryEntityIdFieldName}' operator='eq' value='${primaryEntityId}' />
</filter>
</link-entity>
</link-entity>
</entity>
</fetch>`;
var globalContext = Xrm.Utility.getGlobalContext();
var req = new XMLHttpRequest();
req.open(
"GET",
`${globalContext.getClientUrl()}/api/data/v9.2/${relatedEntityName_prural}?fetchXml=${encodeURIComponent(fetchXmlQuery)}`,
true
);
req.setRequestHeader("Prefer", 'odata.include-annotations="*"');
req.onreadystatechange = function() {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 200) {
var results = JSON.parse(this.response);
for (var i = 0; i < results.value.length; i++) {
console.log("Related Record Search Field Value: " + results.value[i][relatedEntitySearchField]);
}
} else {
alert(this.statusText);
}
}
};
req.send();
}
取得結果は、console.logで出力するようにしています。
配列に格納するなどして、その後の処理に活用してください。
コードの解説
コードの内容を簡単に紹介します。
主エンティティのIDを取得
現在のエンティティのレコードIDを取得します。このIDは、関連レコードを検索するための基点となります。
FetchXMLクエリの構築
関連エンティティから特定の情報を取得するために
FetchXMLクエリを動的に構築します。このクエリは以下の要素を含みます
entity name='${relatedEntityName}'
:検索対象となる関連エンティティの名前。attribute name='${relatedEntitySearchField}'
:取得したい関連エンティティのフィールド。order attribute='${relatedEntitySearchField}' descending='false'
:検索結果の並べ替えに使用するフィールドとその順序。link-entity
:N対Nの関係を表す中間エンティティを通じて、主エンティティと関連エンティティの間のリンクを定義します。ここで、from
とto
は中間エンティティにおける関連エンティティのIDフィールドを指定します。filter
:主エンティティのIDに基づいてフィルタリングを行い、指定された主エンティティレコードに関連付けられたレコードのみを取得します。
XMLHttpRequestを使用してWeb APIにクエリを送信
FetchXMLクエリを使用してDynamics 365 Web APIにリクエストを送信し、関連レコードのデータを取得します。
リクエストURLには、クライアントURL、APIバージョン、関連エンティティセット名、そしてエンコードされたFetchXMLクエリが含まれています。
レスポンスの処理
リクエストが完了した(readyState
が4)後、
ステータスコード200を確認し、成功した場合はレスポンスから関連レコードのデータを解析します。
取得したデータ(relatedEntitySearchField
で指定されたフィールド値)はコンソールに出力されます。
エラー処理
リクエストが失敗した場合は、ステータステキストをアラートで表示します。
まとめ
これで、多対多関係のレコード情報を取得することができるようになりました。
取得することができると、今度は設定することもしたくなります。
次回の記事では、多対多関係のレコードを紐づける方法についても紹介します。
以下から遷移できますので、ぜひ参考にしてみてください。
では、また。