Dynamics CRM Online 2015 Update 1 新機能: Web API 開発者プレビュー その 14


みなさん、こんにちは。

前回に引き続き Dynamics CRM Online 2015 Update 1 で提供される
Web API 開発者プレビューを T4 テンプレートで作成したクライアント
で利用する方法について紹介します。連載記事になるため以下の記事を
事前にご覧ください。

Web API 開発者プレビュー その 1
Web API 開発者プレビュー その 2
Web API 開発者プレビュー その 10
Web API 開発者プレビュー その 11
Web API 開発者プレビュー その 12
Web API 開発者プレビュー その 13

今回はクライアントを利用したトランザクション処理を紹介します。

トランザクションの利用

トランザクションはレコード間の整合性を取るために重要な機能
です。今回は複数の取引先企業レコードをトランザクションで作成
してみます。

プログラムの実装

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

public void RunTransaction(string accessToken)
{
    // クライアントの作成
    CrmODataClient client = new CrmODataClient(new Uri(serverUrl + "/api/data/"));
    client.SendingRequest2 += (s, e) => { e.RequestMessage.SetHeader("Authorization", "Bearer " + accessToken); };
}

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

元)  
app.RunActions(result.AccessToken);

変更後)
app.RunTransaction(result.AccessToken);

3. 追加した RunTransactionメソッドに以下のコードを追加します。
作成する取引先企業レコードを保持するコレクションを作ります。

// 取引先企業のコレクションを作成
DataServiceCollection<Account> accounts = new DataServiceCollection<Account>(client);

4. 取引先企業オブジェクトを 5 件作成してコレクションに追加します。
以下のコードを追加します。

// レコードの追加
for (int i = 0; i < 5; i++)
{
    Account account = new Account();
    accounts.Add(account);
    account.Accountid = Guid.NewGuid();
    account.Name = "テスト取引先企業 " + i;
    account.Accountnumber = "TestAccountNumber" + i;
}

5. 最後にレコードの作成を行います。SaveChangesOption として
PostOnlySetProperties と一緒に BatchWithSingleChangeset を指定
してトランザクションにします。

// レコードの作成
client.SaveChanges(SaveChangesOptions.PostOnlySetProperties | SaveChangesOptions.BatchWithSingleChangeset);

動作確認

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

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

image

3. 処理が完了したらブラウザで結果を確認します。

image

4. 作成したテストレコードは一旦削除します。

次にトランザクションの途中で処理に失敗した場合、
ロールバックされるか確認します。

プログラムの実装

上記で実装したレコードの追加のプログラムを以下のように
書き換えます。4件目のレコードに存在しない取引先企業を
親として指定して失敗するようにしています。

// レコードの追加
for (int i = 0; i < 5; i++)
{
    Account account = new Account();
    accounts.Add(account);
    account.Accountid = Guid.NewGuid();
    account.Name = "テスト取引先企業 " + i;
    account.Accountnumber = "TestAccountNumber" + i;

    // 処理に失敗するよう存在しない ID を指定
    if (i == 3)
        account.Parentaccountid = new Guid("5B38C9B2-F9AE-4514-AB49-06312815C8E7");
}

動作確認

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

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

3. 画面にエラーが出たら、ブラウザからレコードが 1 件も
作成されていないことを確認します。

image

バッチ処理の利用

トランザクションは不要だが一括処理したい場合には、バッチ
処理機能を利用できます。この場合処理の一部が失敗しても
他の処理は実行されます。

プログラムの実装

上記で追加した RunTransaction メソッドの最後のコードの
SaveChangesOption.BatchWithSingleChangeset をバッチ処理用
である BatchWithIndependentOperations に変更します。

client.SaveChanges(SaveChangesOptions.PostOnlySetProperties | SaveChangesOptions.BatchWithIndependentOperations);

動作確認

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

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

3. 先ほどを違い、画面にエラーが出ないことを確認します。また
ブラウザで作成されたレコードを確認します。処理に失敗した
「テスト取引先企業 3」だけ存在しません。

image

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

public void RunTransaction(string accessToken)
{
    // クライアントの作成
    CrmODataClient client = new CrmODataClient(new Uri(serverUrl + "/api/data/"));
    client.SendingRequest2 += (s, e) => { e.RequestMessage.SetHeader("Authorization", "Bearer " + accessToken); };

    // 取引先企業のコレクションを作成
    DataServiceCollection<Account> accounts = new DataServiceCollection<Account>(client);

    // レコードの追加
    for (int i = 0; i < 5; i++)
    {
        Account account = new Account();
        accounts.Add(account);
        account.Accountid = Guid.NewGuid();
        account.Name = "テスト取引先企業 " + i;
        account.Accountnumber = "TestAccountNumber" + i;

        // 処理に失敗するよう存在しない ID を指定
        if (i == 3)
            account.Parentaccountid = new Guid("5B38C9B2-F9AE-4514-AB49-06312815C8E7");
    }

    // 以下はシナリオによって使い分けてください
    // レコードの作成 (トランザクションの場合)
    client.SaveChanges(SaveChangesOptions.PostOnlySetProperties | SaveChangesOptions.BatchWithSingleChangeset);
    // レコードの作成 (バッチの場合)
    client.SaveChanges(SaveChangesOptions.PostOnlySetProperties | SaveChangesOptions.BatchWithIndependentOperations);
}

まとめ

トランザクションやバッチ処理の利用も、クライアントを利用
すれば容易に実装が行えます。

今回で Web API の紹介は最後です。まだプレビュー版も機能で
今後正式版になった場合に変更が入る可能性がございますが、
基本的な概念は変わりません。色々なシナリオで利用可能です
ので、是非お試しください!

- 中村 憲一郎

Skip to main content