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の関係を表す中間エンティティを通じて、主エンティティと関連エンティティの間のリンクを定義します。ここで、fromtoは中間エンティティにおける関連エンティティのIDフィールドを指定します。
  • filter:主エンティティのIDに基づいてフィルタリングを行い、指定された主エンティティレコードに関連付けられたレコードのみを取得します。

XMLHttpRequestを使用してWeb APIにクエリを送信

FetchXMLクエリを使用してDynamics 365 Web APIにリクエストを送信し、関連レコードのデータを取得します。

リクエストURLには、クライアントURL、APIバージョン、関連エンティティセット名、そしてエンコードされたFetchXMLクエリが含まれています。

レスポンスの処理

リクエストが完了した(readyStateが4)後、
ステータスコード200を確認し、成功した場合はレスポンスから関連レコードのデータを解析します。

取得したデータ(relatedEntitySearchFieldで指定されたフィールド値)はコンソールに出力されます。

エラー処理

リクエストが失敗した場合は、ステータステキストをアラートで表示します。

まとめ

これで、多対多関係のレコード情報を取得することができるようになりました。

取得することができると、今度は設定することもしたくなります。

次回の記事では、多対多関係のレコードを紐づける方法についても紹介します。

以下から遷移できますので、ぜひ参考にしてみてください。

では、また。

(Visited 160 times, 1 visits today)