Dynamics CRM 2011 Developer Toolkit (ベータ版) の紹介 - カスタムワークフローアクティビティ開発

みなさん、こんにちは。

今回も引き続き Developer Toolkit for Microsoft Dynamics CRM での開発を
紹介します。今回はカスタムワークフローアクティビティです。

Developert Toolkit for Microsoft Dynamics CRM の概要と導入はこちらから。

※カスタムワークフローアクティビティは設置型のみサポートしています。

ソリューションの作成

開発を始めるにあたり、以下の手順でソリューションを作成します。

Dynamics CRM 2011 上のソリューション
※既定のソリューションで開発を行う場合には、この手順は不要です。

1. Internet Explorer で Dynamics CRM 2011 設置型に接続します。

2. 設定 | カスタマイズ | ソリューション を開きます。

3. 新規をクリックして、新しいソリューションを作成します。ここでは
Toolkit Sample Solution としました。

Visual Studio 2010 上のソリューション

1. ツールキットインストール後に、Visual Studio 2010 を起動します。

2. 新しいプロジェクトを選択します。

3. New Visual Studio Solution Template for Dynamics CRM 2011 を
選択します。

image

4. ここでは既定の名前を利用しました。

5. OK をクリックすると、Dynamics CRM サーバーへの接続作成ダイアログが
表示されます。今回は Dynamics CRM 設置型を接続先に選択しています。

探索サービスのサーバー名、ポートおよびプロトコルを選択して Connect をクリックします。

image

6. Authentication Details 欄が有効になるので認証の入力を行い、Logon を
クリックします。組織が取得されるので、接続先の組織、および作成したソリューションを
選択して、OK をクリックします。

image

7. 今回選択したテンプレートには、Silverlight 開発プロジェクトも含まれるため、
ASP.NET ホストを作成するか聞かれますが、今回は必要ないため、キャンセルを
クリックします。

8. 表示メニューより CRM Explorer をクリックします。

image

9. 以下のように情報が取得できていれば、準備完了です。

image

ワークフロープロジェクト

ソリューションエクスプローラーより、ワークフロープロジェクトを確認します。
開発に必要な参照設定は全て完了しています。

image

アセンブリの署名

アセンブリは署名されている必要があるため、以下の手順でプロジェクトの
プロパティを変更してください。

1. ワークフロープロジェクトを右クリックし、プロパティをクリックします。

2. 左のタブより、署名タブをクリックします。

3. アセンブリの署名にチェックを入れて、厳密な名前のキーファイルの
選択から、新規をクリックします。
※既存のキーを利用する場合には、参照を選択してください。

4. 今回は以下のようにキーを設定しました。必要に応じて変更してください。

image

以上でプロジェクトの署名は完了です。

カスタムワークフローアクティビティの開発

1. プロジェクトを右クリックして、追加 | 新しい項目をクリックします。

2. 新しい項目の追加ダイアログで、Dynamics CRM を選択し、右の画面より
Workflow Activity Class を選択します。任意の名前を付けて追加をクリックします。
今回は MyCustomActivity.cs としました。

image

3. 追加した MyCustomActivity.cs を開きます。既にインターフェースの継承や、
トレーシングサービス、コンテキスト、組織サービスの作成の記述があります。

4. try 句にある // TODO: Implement your custom Workflow business logic.
配下に実際に実行するコードを記述します。今回も事前バインドを利用したいので
CRM Explorer の Entities を右クリック して、Generate Wrapper をクリックします。

image

5. 生成ファイルの保存先として、Workflow プロジェクトを指定し、Generate ボタンを
クリックします。完了まで少し時間がかかります。

image

6. 実行するコードは以下の通りです。SDK にあるサンプルのコメントを日本語化
したものです。

// TODO: Implement your custom Workflow business logic.

// 取引先企業を作成
Account entity = new Account();
// インプットパラメーターより、名前を取得
entity.Name = AccountName.Get<string>(executionContext);

// Create メソッドでレコードを作成
Guid entityId = service.Create(entity);

tracingService.Trace("取引先企業が、Id {0} で作成されました。", entityId.ToString());

tracingService.Trace("取引先企業にタスクを作成します。");

// 取引先企業にタスクを追加
// タスクを作成
Task newTask = new Task();
// インプットパラメーターより、件名を取得
newTask.Subject = TaskSubject.Get<string>(executionContext);
// 関連を設定
newTask.RegardingObjectId = new EntityReference(Account.EntityLogicalName, entityId);

// Create メソッドでレコードを作成
Guid taskId = service.Create(newTask);

tracingService.Trace("タスクが作成されました。");

tracingService.Trace("QueryByAttribute を使用して、タスクを取得します。");

// QueryByAttribute を利用して関連 ID で、タスクを検索
QueryByAttribute query = new QueryByAttribute();
query.Attributes.AddRange(new string[] { "regardingobjectid" });
query.ColumnSet = new ColumnSet(new string[] { "subject" });
query.EntityName = Task.EntityLogicalName;
query.Values.AddRange(new object[] { entityId });

tracingService.Trace("エンティティ {0} に対して検索を実行。", query.EntityName);

//RetrieveMultiple に作成した QeuryByAttribute を渡して実行
RetrieveMultipleRequest request = new RetrieveMultipleRequest();
request.Query = query;
Collection<Entity> entityList = ((RetrieveMultipleResponse)service.Execute(request)).EntityCollection.Entities;
                               
tracingService.Trace("WhoAmIRequest を実行");
// WhoAmI を実行
service.Execute(new WhoAmIRequest());

// 取得した結果を確認
if (1 != entityList.Count)
{
    tracingService.Trace("取得結果が多すぎます。");
    throw new InvalidPluginExecutionException("クエリが正しく実行されませんでした。");
}
else
{
    tracingService.Trace("取得した結果をタスクにキャストします。");

    // 取得結果をタスクエンティティにキャスト
    Task retrievedTask = (Task)entityList[0];

    // 取得した結果をタスク ID で確認
    if (retrievedTask.ActivityId != taskId)
    {
        throw new InvalidPluginExecutionException("異なるタスクを取得しました。");
    }

    tracingService.Trace("Retrie メソッドでレコードを取得します。");

    // Retrieve を利用してタスクを取得
    retrievedTask = (Task)service.Retrieve(Task.EntityLogicalName, retrievedTask.Id, new ColumnSet("subject"));

    // 取得した結果を件名で確認
    if (!string.Equals(newTask.Subject, retrievedTask.Subject, StringComparison.Ordinal))
    {
        throw new InvalidPluginExecutionException("タスクの件名が一致しませんでした。");
    }

    // 取得したタスクを Update で更新
    // インプットパラメーターより更新用件名取得
    retrievedTask.Subject = UpdatedTaskSubject.Get<string>(executionContext);
    service.Update(retrievedTask);
}

7. Account や Task 等が解決されていないので、該当箇所にマウスをあて、
下に出たメニューより、解決を追加します。

image

解決されたことを確認します。

image

8. 他にも QueryByAttribute や Collection が解決されていないので、同様の
手順で解決します。

image

image

結果、以下の using 句が追加されます。

using CrmVSSolution2.Workflow.Entities;
using Microsoft.Xrm.Sdk.Query;
using System.Collections.ObjectModel;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Crm.Sdk.Messages;

9. 今回のカスタムワークフローアクティビティでは、パラメーターを
利用しているので、クラス配下に以下のパラメーター定義を追加します。

[Input("Account Name")]
[Default("テストアカウントt: {575A8B41-F8D7-4DCE-B2EA-3FFDE936AB1B}")]
public InArgument<string> AccountName { get; set; }

[Input("Task Subject")]
[Default("取引先企業用タスク {575A8B41-F8D7-4DCE-B2EA-3FFDE936AB1B}")]
public InArgument<string> TaskSubject { get; set; }

[Input("Updated Task Subject")]
[Default("更新: 取引先企業用タスク {575A8B41-F8D7-4DCE-B2EA-3FFDE936AB1B}")]
public InArgument<string> UpdatedTaskSubject { get; set; }

10. ビルドよりソリューションをビルドします。エラーが無ければ完了です。

カスタムワークフローアクティビティの展開と動作確認

開発したアセンブリを展開するには、以下の手順が必要です。

1. CrmPackage プロジェクト内の RegisterFile.crmregister を
開きます。

2. Solution 配下に以下のように定義を追加します。

image

3. CrmPackage プロジェクトを右クリックして、配置をクリックします。

4. Internet Explorer で Dynamics CRM 2011 に接続し、設定 | プロセスセンター |
プロセスをクリックします。

5. 新規をクリックします。

6. カテゴリーにワークフローを選択し、後は任意の値を入力後
OK をクリックします。

7. ステップの追加に Sample Group | Sample Workflow があることを確認して
クリックします。

image

8. プロパティの設定をクリックします。

image

9. パラメーターが存在することを確認します。

image

まとめ

カスタムワークフローアクティビティの開発と展開は、手動で登録情報を
追加必要必要があるため、プラグインに比べると多少面倒ではありますが
テンプレートとして十分な機能があると思います。

最終回である次回は、 Web リソースの開発を紹介します。

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