[英]How to determine the Workflow Mode in the CRM 2011?
我想确定在Microsoft CRM 2011中如何启动(后台/异步)或(实时/按需)工作流? 在OOB工作流程条件中还是在自定义工作流程活动中?
基于以下链接,我可以看到Microsoft在CRM 2013 SDK中引入了新属性( IWorkflowContext.WorkflowMode )来公开该属性。 我想要CRM 2011中的相同信息。
我认为无法在工作流设计器中区分按需工作流和触发工作流。
在自定义工作流程活动中,如果工作流程是由触发器启动的,则只有Target输入参数:
var context = activityContext.GetExtension<IWorkflowContext>();
if (context.InputParameters.Contains("Target"))
{
// Started by a trigger
}
else
{
// Started on demand
}
除此之外,您还可以通过Target的类型确定哪种触发器启动了工作流程。 此信息在context.MessageName中也可用,如果有更新消息,则包含字符串“ Update”。
if (context.MessageName == "Update")
// this is an update message
var context = activityContext.GetExtension<IWorkflowContext>();
if (context.InputParameters.Contains("Target"))
{
if (context.InputParameters["Target"].GetType() == typeof(Entity))
{
// create and update are Entity
}
else if (context.InputParameters["Target"].GetType() == typeof(EntityReference))
{
// delete and some other operations are EntityReference
}
}
else
{
// Started on demand
}
可以通过Target包含哪些属性来确定更新了哪些特定字段。
这可用于确定哪个字段触发了工作流。
如果创建消息触发了工作流程,则Target将包含所有字段(用户输入的字段)。 要确定工作流是由字段更新触发的,可以将context.MessageName与检查Target包含的属性结合使用。
您寻求的功能在CRM 2011中不存在IWorkflowContext.WorkflowMode
所有工作流都是异步运行的,因此不需要IWorkflowContext.WorkflowMode
。
您不能使CRM 2011同步运行OOTB工作流。 如果要在交易过程中执行代码(CRM 2013可以使用同步工作流执行的方式),则必须在插件中编写逻辑代码。
我认为您可以通过在实体上添加“隐藏”字段并创建几个填充该字段的“处理程序”工作流,然后触发“实际”工作流来实现您的目标。
步骤1.在您的实体上创建一个字段以保存一个值,该值指示发起者
步骤2.将“实际”工作流程创建为子流程
步骤3.创建一个按需(仅)工作流:
一种。 在“启动器”字段中的实体上设置一个值,指示工作流是手动运行的。
b。 调用子工作流程
步骤4.创建一个未选择按需选择的工作流:
一种。 在“启动器”字段中的实体上设置一个值,以指示工作流程已自动化。
b。 调用子工作流程
步骤5.显示结果
一种。 创建一个显示该值的“管理员”表单和/或,
b。 将字段隐藏在用户表单上,并根据需要通过js显示和/或,
C。 创建一个包含显示此字段的视图和/或,
d。 创建包含此字段的报告和/或,
e。 检查代码中此字段的值
除非有特定值,否则该字段将不会包含在用户表单或视图中。
通过使用自定义字段并通过“处理程序”工作流填充它,您将能够实现OOB目标。 (也就是说,如果您考虑使用Web GUI创建自定义字段和工作流程“ OOB”。)
通过以编程方式检查此字段的值,您将实现您的“自定义工作流”目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.