如何确定CRM 2011中的工作流模式



我想确定如何在Microsoft CRM 2011中启动工作流(后台/异步)或(实时/按需)?在OOB工作流条件和自定义工作流活动中?

基于以下链接,我可以看到微软在CRM 2013 SDK中引入了一个新属性(IWorkflowContext.WorkflowMode)来公开它。我想要CRM 2011中的相同信息。

http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.workflow.iworkflowcontext.workflowmode(v=crm.6).aspx

我认为在工作流设计器中无法区分按需工作流和触发工作流。

在自定义工作流活动中,只有当工作流由触发器启动时,才会有目标输入参数:

var context = activityContext.GetExtension<IWorkflowContext>();
if (context.InputParameters.Contains("Target"))
{
// Started by a trigger
}
else
{
// Started on demand
}

除此之外,您还可以通过Target的类型来确定启动工作流的触发器类型。上下文中也提供了此信息。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将包含(用户输入的)所有字段。为了确定工作流是由字段更新触发的,可以使用上下文。MessageName,同时检查Target包含哪些属性。

您寻求的功能在CRM 2011中不存在。CRM 2011中的所有工作流都异步运行,因此不需要IWorkflowContext.WorkflowMode

您无法使CRM 2011同步运行OOTB工作流。如果你想在交易期间执行代码,就像CRM 2013可以使用同步工作流一样,你必须在插件中对逻辑进行编码。

我认为您可以通过在实体上添加一个"隐藏"字段并创建几个填充该字段的"处理程序"工作流来实现目标,然后启动"实际"工作流。

步骤1。在您的实体上创建一个字段,以保存指示发起方的值

步骤2。创建"实际"工作流作为子进程

步骤3。创建一个按需(仅)工作流,该工作流:
a。在"启动器"字段中为实体设置一个值,指示工作流是手动运行的
b。调用子工作流

步骤4。创建一个未选择按需工作流:
a。在"启动器"字段中为实体设置一个值,指示工作流已自动化。
b.调用子工作流

步骤5。显示结果
a。创建一个显示此值和/或
b的"admin"表单。将该字段隐藏在用户表单上,并根据需要通过js和/或
c显示。创建一个包含显示此字段和/或
d的视图。创建包含此字段和/或
e的报告。检查代码中此字段的值

除非有特定的值,否则该字段不会包含在用户窗体或视图中。

通过使用自定义字段并通过"处理程序"工作流填充它,您将能够实现OOB目标。(也就是说,如果您考虑使用web GUI来创建自定义字段和工作流"OOB"。)

通过以编程方式检查此字段的值,您将实现自定义工作流的目标。

最新更新