需求:创建一个workflow ,每隔三个月执行一次对满足要求的CRM数据进行更新。
经过调查实践发现CRM系统中可自定义的workflow不能进行无限的循环,最多只能执行7次。
只能在VS创建自定义workflow实现无限循环,集成到CRM.
实现步骤:
- 创建自定义workflow activity ,实现对CRM数据更新。
- 创建自定义workflow,实现整个流程。
-
集成自定义workflow到CRM.
创建自定义workflow activity
- 启动 Microsoft Visual Studio 2010。
- 在"文件"菜单上,单击"新建",然后单击"项目"。
- 在"新建项目"对话框的"已安装的模板"窗格中,选择"Visual C#"下的"工作流",然后选择"活动库"。
- 指定解决方案的名称和位置,然后单击"确定"。
- 导航到"项目"菜单并选择"属性"。在"应用程序"选项卡上,指定".NET Framework 4"作为目标框架。
- 添加对 Microsoft.Xrm.Sdk.dll 和 Microsoft.Xrm.Workflow.dll 程序集的引用。
- 删除项目中的 Activity1.xaml 文件。
- 将类文件 (.cs) 添加到项目中。在解决方案资源管理器中,右键单击项目,选择"添加",然后单击"类"。在"添加新项"对话框中,键入类的名称,然后单击"添加"。
-
打开类文件,然后添加以下 using 指令:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
-
使该类继承自 CodeActivity 类:
public class SampleCustomActivity : CodeActivity
-
通过添加Execute方法为类添加功能:
protected override void Execute(CodeActivityContext context)
{
//Activity code
Update Data here
}
- 编译项目以创建程序集 (.dll)。
创建自定义workflow
若要使用在 Microsoft Dynamics CRM 之外创建或修改的 XAML 工作流,请确保:
- 您的用户帐户在 Microsoft Dynamics CRM 中具有 Deployment Administrator 权限。
在 Microsoft Dynamics CRM 服务器上启用了声明性工作流。 PowerShell($setting.AllowDeclarativeWorkflows="True")
- 在 Microsoft Visual Studio 中的"文件"菜单上,选择"新建",然后单击"项目"。
- 在"已安装模板"下展开"Visual C#",然后单击"工作流"。
- 单击"活动库",选择".NET Framework 4",为项目指定名称和位置,然后单击"确定"。
- 在"解决方案资源管理器"中,右键单击"活动库",然后单击"添加引用"。
- 单击"浏览",并找到 Microsoft.Xrm.Sdk.dll 和 Microsoft.Xrm.Sdk.Workflow.dll 文件。选择这些文件并将其添加到项目。
- 进行工作流的定制。
集成自定义workflow到CRM.
使用插件注册工具来注册自定义工作流活动程序集到CRM。
- 构建 Plug-in Registration 工具。您可在 SDK\Tools\PluginRegistration 文件夹中找到该工具的源代码。若要构建和使用插件注册工具,您必须首先安装 Windows Identity Foundation。
- 用户帐户必须具有系统定制员或系统管理员角色。
导入自定义的workflow
%TrainingKit%\Labs\WorkflowVS2010\Sources\Assets\WorkflowXamlTool.
打开 WorkflowXamlTool.sln, 修改workflow name and primaryentity ,执行solution.
var newWF = new Entity("workflow");
newWF.Attributes.Add("name", "On test 10311");
newWF.Attributes.Add("type", new OptionSetValue(1));
newWF.Attributes.Add("scope", new OptionSetValue(4));
newWF.Attributes.Add("category", new OptionSetValue(0));
newWF.Attributes.Add("primaryentity", "abc_dummy");
newWF.Attributes.Add("xaml", content2);
newWF.Attributes.Add("ondemand", true);
try
{
_serviceProxy.Create(newWF);
MessageBox.Show("Workflow successfully imported.", "Import", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (FaultException ex)
{
}
选择自定义xaml 文件,导入。
如何更新workflow activity dll
-
停止MSCRMAsyncService服务
-
执行iisreset – stop
-
替换dll 文件到C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly.
-
执行iisreset – start
-
开启MSCRMAsyncService服务
如何调试workflow activity
Attach 进程CrmAsyncService.exe,执行workflow.
Workflow activity如何更新数据
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(wfContext.UserId);
InfluencerContext context = new InfluencerContext(service);
context.ClearChanges();
context.Attach(influencer);
context.UpdateObject(influencer);
context.SaveChanges();