Dynamics CRM Online 2015 Update 1 SDK 新機能: 複数組織要求のトランザクション処理

※2015 年 6 月 11 日 内容修正
サンプルと解説が ExecuteMultiple リクエストのものとなっておりました。お詫びいたします。
正しい ExecuteTransaction のサンプルと解説に差し替えました。

みなさん、こんにちは。

今回は Dynamics CRM Online 2015 Update 1 で提供されるプラット
フォームと SDK の新機能より、トランザクション機能を紹介します。

概要

これまでも Microsoft Dynamics CRM でトランザクション処理が必要
な場合、同期プラグインのステージ 20/40 に処理を行ったり、操作を
使ったり、DataContext を利用する方法がありましたが、複数の組織
サービスを呼ぶ場合にはトランザクションが利用できませんでした。

今回のリリースでは、ExecuteTransactionRequest 要求に複数の組織
要求を入れることにより、トランザクションをサポートします。

動作確認

今回は 10 件の取引先企業作成をトランザクションとして実行します。

1. Visual Studio を起動します。新しいプロジェクトをクリック
して、Visual C# | Windows デスクトップ | コンソールアプリ
ケーションを選択します。.NET Framework 4.5.2 を指定します。
任意の名前を付けて、「OK」をクリックします。

image

2. ソリューションエクスプローラーより作成したプロジェクトを
右クリックして、NuGet パッケージの管理をクリックします。

image

3. 左ペインで「オンライン」を選択後、右上の検索ボックスにて
crmsdk を検索します。一覧より Microsoft Dynamics CRM 2015
SDK client and portal assemblies を選択して、「インストール」を
クリックします。

image

4. インストールが完了したら「閉じる」で NuGet パッケージの
管理を閉じます。

5. Main メソッドに以下のコードを追加します。これで Dynamics
CRM 組織への接続が作成できます。接続文字は適宜変更します。

CrmConnection conn = CrmConnection.Parse("Url=https://contoso.crm.dynamics.com; Username=someone@contoso.onmicrosoft.com; Password=password;");
OrganizationService service = new OrganizationService(conn);

6. 以下のコードでトランザクション全体の要求作成します。

ExecuteTransactionRequest request= new ExecuteTransactionRequest()
{
    Requests =  new OrganizationRequestCollection()
};

7. 以下のコードで取引先企業の作成要求をトランザクションに
追加します。

// 10 件の要求を作成
for (int i = 0; i < 10; i++)
{
    Entity account = new Entity("account");
    account["name"] = "サンプル取引先企業 " + i;

    CreateRequest createRequest = new CreateRequest()
    {
        Target = account,
    };

    // トランザクションに追加
    request.Requests.Add(createRequest);
}

8. 以下のコードでトランザクション要求を実行し、結果を
確認します。

try
{
    ExecuteTransactionResponse response = (ExecuteTransactionResponse)service.Execute(request);

    // 結果の表示
    foreach (var result in response.Responses)
    {                    
        if (result != null)
            Console.WriteLine("レコード {0} が作成されました。", result.Results["id"]);
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
    Console.WriteLine("エラーが発生したため、処理はロールバックされました。");
}

Console.Read();

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

image

トランザクション処理の結果

ExecuteTransactionResponse の Responses には OrganizationResponse
型の結果が返ってきます。今回は全て CreateRequest を実行したため
CreateResponse が返ってくる前提で Results プロパティより id を
取得しました。複数の型が応答で返ってくる場合は、以下の例の様に
型で判定して処理を変更してください。

if (result is CreateResponse)

まとめ

待望のトランザクション処理が実装されたことはとても嬉しいです。
ただしトランザクション実行中は必要に応じてロックが発生します
ので、使いどころは慎重にご検討ください。

- 中村 憲一郎