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. 新規ボタンをクリックして、以下の様に操作を作成します。
3. OK をクリックします。
4. 一意の名前として new_escalateIncident と入力します。
5. プロセスの引数で [+] ボタンをクリックします。
6. 名前、種類、エンティティなど以下の様に指定します。
※必須出席者と表示されているのは表示バグであり、本来は
”必須” です。この入力パラメータが必須であるか指定します。
7. ステップの追加よりレコードの作成を追加します。
8. 作成から投稿を選択して、以下の様にプロパティを設定します。
動的な値で入力パラメーターで指定した値が利用できることを
確認します。
9. もう一つ投稿作成ステップを追加します。
10. レコードの割り当てステップを追加します。動的な値で
入力パラメータで指定したユーザーに割り当てます。
11. 次に出力パラメータを追加します。プロセスの引数で
[+] ボタンをクリックして、以下の様に設定します。
12. ステップの追加より値の割り当てを追加します。
13. プロパティの設定をクリックし、以下の様に設定します。
出力パラメータが複数ある場合、ドロップダウンより任意の
ものを選択できます。
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. 実際のレコードがエスカレーション担当者に割り当てられ、
それぞれのユーザーウォールに投稿が作成されていることを
確認します。
次回はユーザー定義アクションをプラグインやスクリプト
から呼び出す方法を紹介します。
- 中村 憲一郎