Dynamics CRM 2016 SDK 新機能: Web API その 2: ビューを利用したレコードの取得

みなさん、こんにちは。

前回に引き続き、Dynamics CRM 2016 SDK の新機能として、正式版と
なった Web API について紹介します。

Web API は Microsoft Dynamics CRM Online 2015 Update 1 にて
プレビューとして公開されました。以下の操作はプレビューの時と
同様のコードで実行が可能です。

レコードの作成、読み取り、更新、削除
Upsert を使ったレコードの作成と更新
オプティミスティック同時実行制御
フォーマットされた値の取得
OData クエリの使用例

今回はプレビューから操作方法が変更になっているものとして、ビューを
利用したレコードの取得を紹介します。

概要

ビューを利用したレコードの取得は以下の流れでレコードを取得します。

1. 特定エンティティのビュー一覧を取得します。
2. 取得したビューの情報を利用してレコードの一覧を取得します。

では早速実装していきましょう。

特定エンティティのビュー一覧取得

まず取引先企業エンティティ用のビュー一覧を取得します。

プログラムの実装

1. 前回利用した Visual Studio ソリューションを開き、Program.cs
ファイルを開きます。新しく以下のメソッドを追加します。

public async Task RunViewQueries(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    }
}

2. Main メソッドの以下のコードを書き換えて、新しいメソッドを
呼ぶように変更します。

元)  
Task.WaitAll(Task.Run(async () => await app.Run(result.AccessToken)));

変更後)
Task.WaitAll(Task.Run(async () => await app.RunViewQueries(result.AccessToken)));

3. 新しく追加した RunViewQueries メソッド内に以下のコードを追加
して、取引先企業用のビュー一覧を取得します。

// 取引先企業ビューの一覧取得
HttpResponseMessage retrieveRes = await httpClient.GetAsync(serviceUrl + "savedqueries?$select=name&$filter=returnedtypecode eq 'account'");
JToken results = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];

// ビュー名の表示
foreach (JToken result in results)
{
    Console.WriteLine("ビュー名: {0}", result["name"]);
}

動作確認

1. F5 キーを押下してプログラムを実行します。

2. 認証ダイアログが表示されたらログインします。

image

3. ビューの一覧が表示されることを確認します。

image

4. Enter キーを押下してプログラムを終了します。

ビューを利用したレコードを一覧の取得

次に取得したビューを利用してレコードの一覧を取得します。

プログラムの実装

1. 上記に続いて、以下のコードを追加します。api/data/v8.0/accounts
アドレスに savedQuery=<savedQueryId> を渡すことで、該当の
ビュー定義を利用したレコードを取得出来ます。

// 取引先企業レコードの取得
retrieveRes = await httpClient.GetAsync(serviceUrl + "accounts?savedQuery=" + results[0]["savedqueryid"]);
JToken accounts = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];

2. 取得した結果を表示します。以下のコードを追加します。

// 取引先企業名の表示
foreach (JToken account in accounts)
{
    Console.WriteLine("取引先企業名: {0}", account["name"]);
}

動作確認

1. F5 キーを押下してプログラムを実行します。

2. 認証ダイアログが表示されたらログインします。

3. ビューの一覧と 1 つめのビュー定義を利用して取得された
取引先企業一覧が表示されることを確認します。

image

個人ビューの利用

上記の例ではシステムビューを取得して利用しましたが、個人ビューを利用
したい場合は savedqueriesを userqueries に、savedqueryid を userqueryid に、
accounts?savedQuery を accounts?userQuery に書き換えることで対応できます。

今回追加したメソッドを以下に示します。

public async Task RunViewQueries(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        // 取引先企業ビューの一覧取得
        HttpResponseMessage retrieveRes = await httpClient.GetAsync(serviceUrl + "savedqueries?$select=name&$filter=returnedtypecode eq 'account'");
        JToken results = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];

        // ビュー名の表示
        foreach (JToken result in results)
        {
            Console.WriteLine("ビュー名: {0}", result["name"]);
        }

        // 取引先企業レコードの取得
        retrieveRes = await httpClient.GetAsync(serviceUrl + "accounts?savedQuery=" + results[0]["savedqueryid"]);
        JToken accounts = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];

        // 取引先企業名の表示
        foreach (JToken account in accounts)
        {
            Console.WriteLine("取引先企業名: {0}", account["name"]);
        }
    }
}

まとめ

今回は Web API 固有の機能としてエンティティビューを利用したレコード
取得を紹介しました。是非お試しください!

- 中村 憲一郎

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります