Dynamics CRM 4.0 では、CRMに標準で用意されているアクティビティーをDynamics CRMで用意されているワークフローデザイナ上で組み合わせてワークフローを作成することができます。標準で用意されているアクティビティーで機能が不足している場合は、カスタムアクティビティーを作成して、Dynamics CRM 上のワークフローで使用することができます。

ちなみに、Dynamics CRM でサポートされるアクティビティーや型の一覧は次のページに掲載されています。

Supported Types for Workflow
http://msdn.microsoft.com/en-us/library/bb955336.aspx

以下の記事では日付データの書式文字列を任意に指定できるカスタムアクティビティーの作成と、実際にワークフローを作成する作業を行ってみます。より詳細なカスタムアクティビティーの作成方法は Dynamics CRM SDK のヘルプを参照してください。

動作確認環境は Windows Server 2003 R2 上に構築した Dynamics CRM 4.0のオールインワン環境で行っています。

1.カスタムアクティビティーの作成

Visual Studio 2008 を起動してソリューションを新規作成します。プロジェクトテンプレートにからのワークフロー、ターゲットの.NET Framekwork を 3.0 以上にします。今回はプロジェクト名を FormatActivity という名前で作成した前提で説明を記載します。

プロジェクトを作成した後は参照の追加を行います。 ソリューションエクスプローラからプロジェクトを右クリック→参照の追加でdllの参照を追加します。追加するのはDynamics CRM SDK に付属する microsoft.crm.sdk.dll, microsoft.crm.sdk.typeproxy.dll です(下図参照)。ワークフローではなくクラスライブラリをプロジェクトのテンプレートに選択した場合は、 System.Workflow.Activities.dll, System.Workflow.ComponentModel.dll も参照に追加します。

 作成するカスタムアクティビティーをDynamicsで使用するためにアセンブリを署名します。ソリューションエクスプローラ上でプロジェクトを右クリック→プロパティでプロパティ画面を表示し、下図のように署名タブを選択しアセンブリの署名の設定を行います。

既存のキーファイルではなく、新規にキーファイルを作成して、署名を行うにはアセンブリの署名欄で新規作成を選択し、厳密な名前キーの作成ダイアログを表示します。ダイアログ上でキーファイル名を指定します。キーファイルをパスワードで保護するチェックボックスはクリアしてOKボタンをクリックします。

アセンブリの署名設定をした後はアクティビティーを作成してみます。ソリューションエクスプローラ上でプロジェクトを右クリック→新しい項目の追加で、テンプレートに下図のようにアクティビティを選択してアイテムを追加します。ファイル名は DateTimeFormatActivity としました。ちなみに、コード分離付きと記載されいているテンプレートでは、xomlファイルにカスタムアクティビティ(シーケンシャルワークフローを継承したクラスなど)をxml形式で宣言的に定義し、csファイルをコードビハインドファイルとして使用してカスタムアクティビティを定義します。

作成されたファイル DateTimeFormatActivity.cs を編集します。既定ではベースクラスは SequenceActivity になりますが、Activityに変更しているので注意してください。

Dynamics CRM 上でカスタムアクティビティーを使用できるようにするための基本事項として次の点があります。

  • カスタムアクティビティーに CrmWorkflowActivity 属性を付与する
  • 入出力に使用するプロパティは依存プロパティ(Dependency Property)として定義する
  • 入出力に使用するプロパティに 入力の場合は CrmInput, 出力の場合は CrmOutput 属性を付与する

カスタムアクティビティーを作成するうえでより詳細な情報は Dynamics CRM SDK のヘルプを参照してください。

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.Crm.Workflow;
using Microsoft.Crm.Sdk;

namespace FormatActivity
{
    [CrmWorkflowActivity("Format DateTime", "Sample Activities")]
    public partial class DateTimeFormatActivity : Activity
	{
		public DateTimeFormatActivity()
		{
			InitializeComponent();
		}
        /// <summary>値</summary>
        [CrmInput("DateTime Value")]
        public CrmDateTime DateTime
        {
            get { return (CrmDateTime)GetValue(DateTimeProperty); }
            set { SetValue(DateTimeProperty, value); }
        }

        public static readonly DependencyProperty DateTimeProperty =
            DependencyProperty.Register("DateTime", typeof(CrmDateTime), typeof(DateTimeFormatActivity));

        /// <summary>書式</summary>
        [CrmDefault("")]
        [CrmInput("Format")]
        public String Format
        {
            get { return (String)GetValue(FormatProperty); }
            set { SetValue(FormatProperty, value); }
        }

        public static readonly DependencyProperty FormatProperty =
            DependencyProperty.Register("Format", typeof(String), typeof(DateTimeFormatActivity));

        /// <summary>書式化された文字列</summary>
        [CrmOutput("Formatted DateTime String")]
        public String FormattedString
        {
            get { return (String)GetValue(FormattedStringProperty); }
            set { SetValue(FormattedStringProperty, value); }
        }

        public static readonly DependencyProperty FormattedStringProperty =
            DependencyProperty.Register("FormattedString", typeof(String), typeof(DateTimeFormatActivity));

        /// <summary>
        /// 書式設定した文字列を作成
        /// </summary>
        /// <param name="executionContext"></param>
        /// <returns></returns>
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            if (this.DateTime != null && !this.DateTime.IsNull)
            {
                if (!string.IsNullOrEmpty(this.Format))
                {
                    this.FormattedString = this.DateTime.UserTime.ToString(this.Format);
                }
                else
                {
                    this.FormattedString = this.DateTime.UserTime.ToString();
                }
            }
            return ActivityExecutionStatus.Closed;
        }
	}
}

ビルドを実行し、ビルドエラーが発生しないことを確認します。

2. アセンブリの登録とワークフローの作成

Plugin Registration Tool を使用して作成した署名済みのアセンブリを登録します(下図参照)。Plugin Registration Tool という名前ですが Workflow 用のカスタムアクティビティのdllも同ツールで登録できます。

Plugin Registration Toolの使い方については[DynamicsCRM] Microsoft Dynamics CRM 4.0 Audit Plugin の紹介と使い方 を参照してください。ただし、プラグインの場合と違いアセンブリの登録さえ行えればOKです。

アセンブリを登録すれば、Dynamics CRM に標準のワークフローデザイナを使用してカスタムアクティビティーを使用できます。

下図では、エンティティを取引先企業とするワークフローの新規作成画面し、ワークフローのステップの追加ボタンを押した画面です。CrmWorkflowActivity 属性のコントラクタで指定したグループ名が表示されていることが確認できます。

Sample Activities にカーソルを合わせると Format DateTime という、同じく CrmWorkflowActivity 属性に指定したワークフロー名が表示されます。Format DateTime をクリックします。

カスタムアクティビティのステップが追加されます。次に入力値をワークフローのエンティティの属性と関連付けるためにプロパティの設定ボタンをクリックします。

カスタム ステップ入力プロパティの設定画面が表示されます。 DateTime ValueとFormatプロパティが入力項目として表示されます。

DateTime Value の日付項目のテキストボックスをクリックします。するとフォームアシスタントが日付に日付項目設定用の項目に変わります。検索のドロップダウンに取引先企業、その下のドロップダウンに属性 作成日を選択します。追加ボタンをクリックしてOKボタンをクリックすると下図のようにDateTime Value の入力値が取引先企業エンティティの作成日属性になります。

次に、Format の値に書式指定したい日付のフォーマットを設定します。下図では yyyy/MM/dd としています。

ここまでで入力設定は完了です。次のカスタムアクティビティの結果を取引先エンティティの説明欄に設定してみます。ワークフローデザイナのステップの追加でレコードの更新を選択します。

取引先企業の更新設定用画面が表示されます。詳細タブの説明をクリックして、フォームアシスタントの検索欄にローカル値の作成日から書式指定された文字列(カスタムアクティビティーのステップの説明の文字列です)を選択します。

あとはフォームアシスタント上で、カスタムアクティビティーのCrmOutput属性を設定したプロパティ Formatted Date Time String を説明に設定する値に指定して下図のように前後に文字列を追加します。

あとは、ワークフローを保存して公開すれば完了です。

実際に取引先企業を作成すると作成時にワークフローが動作して下図のように取引先企業エンティティの説明欄に日付が書式指定された文字列通りに書式化されて文字列が設定されることが確認できます。

3. まとめ

今回の説明は以上です。誤り、指摘点などありましたらご連絡ください。

Dynamics CRM では、Dynamics CRM標準のワークフローデザイナで作成したワークフローは実際にはxoml形式で保持されています。そして、サポートされているすべてのアクティビティーをDynamics CRM上のワークフローデザイナで使うことができません。そのため、Dynamics CRM標準のワークフローデザイナでは作成できないワークフローはVisual Studio に付属するワークフローデザイナからxomlファイルを生成することで作成することができるようです。時間と元気があればそちらも試してみたいと思います。