Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 4

みなさん、こんにちは。

今回は新規に入出力パラメータを利用する操作を作成し、SDK
から利用する方法を紹介します。前回までの内容を把握している
ことが前提となりますのでご注意ください。

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 1
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 2
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 3

シナリオ

作成後 1 か月以上週間経過したサポート案件に対して以下の
プロセスでエスカレーションを実施します。

- エスカレーション担当者にサポート案件をアサインする
- 担当者のウォールにエスカレーションされた旨を投稿する
- 元担当者のウォールにエスカレーションされた旨を投稿する

操作の作成

シナリオを満たせるよう、エスカレーション担当者を入力
パラメータとして受け取れる操作を作成します。また出力
パラメータのサンプルとしてすべての操作の最後に作業が
完了した旨を記した文字列を返すこととします。

1. 設定モジュールよりプロセスをクリックします。

2. 新規ボタンをクリックして、以下の様に操作を作成します。

image

3. OK をクリックします。

4. 一意の名前として new_escalateIncident と入力します。

5. プロセスの引数で [+] ボタンをクリックします。

image

6. 名前、種類、エンティティなど以下の様に指定します。
※必須出席者と表示されているのは表示バグであり、本来は
”必須” です。この入力パラメータが必須であるか指定します。

image

7. ステップの追加よりレコードの作成を追加します。

8. 作成から投稿を選択して、以下の様にプロパティを設定します。
動的な値で入力パラメーターで指定した値が利用できることを
確認します。

[ステップ]
image

[動的な値]
image

[投稿レコードのプロパティ]
image

9. もう一つ投稿作成ステップを追加します。

image

image

10. レコードの割り当てステップを追加します。動的な値で
入力パラメータで指定したユーザーに割り当てます。

image

11. 次に出力パラメータを追加します。プロセスの引数で
[+] ボタンをクリックして、以下の様に設定します。

image

12. ステップの追加より値の割り当てを追加します。

image

13. プロパティの設定をクリックし、以下の様に設定します。

image

出力パラメータが複数ある場合、ドロップダウンより任意の
ものを選択できます。

14. 操作を保存して、アクティブ化します。

SDK からの呼び出し

1. こちらの記事と同じ手順で SDK の準備を行います。

2. 以下のコードを Program.cs に貼り付けます。

using Microsoft.Crm.Sdk.Samples;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomActionSample
{
    class Program
    {
        static void Main(string[] args)
         {
            // ヘルパーを利用してサービスプロキシの生成
            ServerConnection serverConnect = new ServerConnection();
            ServerConnection.Configuration config = serverConnect.GetServerConfiguration();

            using (OrganizationServiceProxy _serviceProxy = ServerConnection.GetOrganizationProxy(config))
             {
                // 事前バインドの利用
                _serviceProxy.EnableProxyTypes();
               
                // エスカレーション担当者の GUID を取得するロジックをここに記述
                // 結果として GUID を取得したと想定
                Guid escalationEngineer = new Guid("F5D307DA-E434-E311-904F-D89D676560BC");
                // 1 か月以上前に作成され、エスカレーション担当者が所有者でないサポート案件
                string fetch = String.Format(@"<fetch version='1.0' output-format='xml-platform'
                    mapping='logical' distinct='false'>
                     <entity name='incident'>
                    <attribute name='title' />
                    <attribute name='ticketnumber' />
                    <attribute name='createdon' />
                    <attribute name='incidentid' />
                     <order attribute='title' descending='false' />
                     <filter type='and'>
                        <condition attribute='createdon' operator='olderthan-x-months' value='1' />
                        <condition attribute='ownerid' operator='ne' uiname=''
                        uitype='systemuser' value='{0}' />
                    </filter>
                     </entity>
                </fetch>", escalationEngineer.ToString());

                EntityCollection results =
                     _serviceProxy.RetrieveMultiple(new FetchExpression(fetch));

                // 取得したレコードに対してカスタムアクションを実行
                foreach (Incident incident in results.Entities)
                 {
                    // 操作に紐づく要求の作成
                    new_escalateIncidentRequest request = new new_escalateIncidentRequest();
                    // アクションのターゲットとして取得したサポート案件を指定
                    request.Target = new EntityReference(Incident.EntityLogicalName, incident.Id);
                    // 要求の入力パラメータとして EscalationEngineer を設定
                    request.EscalationEngineer = new EntityReference(SystemUser.EntityLogicalName, escalationEngineer);
                    // 操作に紐づく応答の取得
                    new_escalateIncidentResponse response =
                        (new_escalateIncidentResponse)_serviceProxy.Execute(request);

                    // 応答のパラメータとして Result を表示
                    Console.WriteLine(response.Result);
                }
            }
        }
     }
}

3. プログラムを実行します。画面に設定した出力パラメータ
の文字列が表示されることを確認します。

4. 実際のレコードがエスカレーション担当者に割り当てられ、
それぞれのユーザーウォールに投稿が作成されていることを
確認します。

image

次回はユーザー定義アクションをプラグインやスクリプト
から呼び出す方法を紹介します。

- 中村 憲一郎