Dynamics CRM 2011 SDK: マッピングを利用した関連レコードの作成

みなさん、こんにちは。

今回は開発者の方向けの情報として InitializeFromRequest リクエストの
概要とその利用方法をサンプルを使用して紹介します。尚、本サンプルは
SDK 5.0.13 以降に含まれています。

InitializeFromRequest 概要

Microsoft Dynamics CRM ではエンティティ間の関連に対して、マッピング
機能を提供しています。例えば取引先企業から取引先担当者を作成
する場合、住所や電話番号が自動で引き継がれますが、これは関連に
マッピングが存在するためです。

InitializeFromRequest リクエストを利用してレコードを作成した場合、この
マッピング機能を利用してレコードを作成することが可能です。

サンプル紹介

サンプルは SampleCode 配下の以下の場所にあります。
CS\GeneralProgramming\EarlyBound\InitializeFrom.cs

では早速実行してみましょう。

1. Visual Studio 2010 を起動して、SampleCode\CS\GeneralProgramming\ EarlyBound\BasicOperations.csproj を開きます。

2. ソリューションエクスプローラーからプロジェクトを右クリックして、 プロパティをクリックします。

3. スタートアッププロジェクトで InitializeFrom を選択します。

image

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

コード解説

サンプルコードでは、まずサンプルレコードを作成しています。その
中で、元となる取引先企業レコードと潜在顧客レコードの情報を
クラスレベルで保持しています。

public void CreateRequiredRecords()
{
    _initialAccount = new Account()
    {
        Name = "Contoso, Ltd"
    };
    _initialAccount.Id = _serviceProxy.Create(_initialAccount);
    Console.WriteLine("  Created initial Account (Name={0})",
        _initialAccount.Name);

    _initialLead = new Lead()
    {
        Subject = "A Sample Lead",
        LastName = "Wilcox",
        FirstName = "Colin",
    };
    _initialLead.Id = _serviceProxy.Create(_initialLead);
    Console.WriteLine("  Created initial Lead (Subject={0}, Name={1} {2})",
        _initialLead.Subject,
        _initialLead.FirstName,
        _initialLead.LastName);
}

その後、InitializeFromRequest を作成し、元になる取引先企業を
EntityMoniker として設定。またその際 EntityReference に変換
しています。そして TargetEntityName に作成するエンティティ
を指定しています。

// Create the request object
InitializeFromRequest initialize = new InitializeFromRequest();

// Set the properties of the request object
initialize.TargetEntityName = Account.EntityLogicalName.ToString();

// Create the EntityMoniker
initialize.EntityMoniker = _initialAccount.ToEntityReference();

// Execute the request
InitializeFromResponse initialized =
    (InitializeFromResponse)_serviceProxy.Execute(initialize);

ここで Initialized にはマッピングされた情報を持つエンティティ
情報が返ってきます。その後返ってきたエンティティデータを
利用してレコードの作成が行えます。

少しコードを変更して動作を確認します。以下のコードを
93行目に挿入してください。

// レコードの作成
Account newAccount = (Account)initialized.Entity;
newAccount.Name = "Child Account";

_serviceProxy.Create(newAccount);

その結果以下のようにレコードが作成されます。

image

例えばダミーレコードに電話番号を設定した上で、そこから
取引先担当者を作成すると以下のようにレコードが作成
されます。

変更コード: 電話番号を追加

public void CreateRequiredRecords()
       {
           _initialAccount = new Account()
           {
               Name = "Contoso, Ltd",
               Telephone1 = "03-3333-3333"
           };

変更コード: 取引先担当者を作成するように変更

// Create the request object
InitializeFromRequest initialize = new InitializeFromRequest();

// Set the properties of the request object
initialize.TargetEntityName = Contact.EntityLogicalName.ToString();

// Create the EntityMoniker
initialize.EntityMoniker = _initialAccount.ToEntityReference();

// Execute the request
InitializeFromResponse initialized =
    (InitializeFromResponse)_serviceProxy.Execute(initialize);

if (initialized.Entity != null)
    Console.WriteLine("  New Account initialized successfully");
// レコードの作成
Contact newConatct = (Contact)initialized.Entity;
newConatct.LastName = "Child Contact";

_serviceProxy.Create(newConatct);

作成されたレコード: 電話番号と所属企業が自動反映

image

 

まとめ

プラグインを利用して関連レコードを作成する場合などに
活用できるメッセージだと思いますので、是非試してください。

- Dynamics CRM サポート 中村 憲一郎