我想确定Microsoft CRM 2011中工作流的启动方式(后台/异步)或(实时/按需)?在两个OOB工作流条件和自定义工作流活动中?
基于以下链接,我可以看到Microsoft在CRM 2013 SDK中引入了一个新属性( IWorkflowContext.WorkflowMode )来公开它。我想在CRM 2011中获得相同的信息。
答案 0 :(得分:2)
我认为在工作流设计器中区分按需和触发的工作流是不可能的。
在自定义工作流活动中,如果工作流由触发器启动,则只有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包含哪些属性。
答案 1 :(得分:1)
您在CRM 2011中不存在您所寻求的功能.CRM 2011中的所有工作流程都是异步运行的,因此不需要IWorkflowContext.WorkflowMode
。
您无法使CRM 2011同步运行OOTB工作流程。如果要在事务期间执行代码(CRM 2013可以使用同步工作流的方式),则必须在插件中对逻辑进行编码。
答案 2 :(得分:0)
我认为您可以通过在实体上添加“隐藏”字段并创建一对“处理程序”工作流来实现您的目标,这些工作流填充此字段然后激活您的“实际”工作流程。
第1步。 在实体上创建一个字段以保存指示启动器的值
第2步。 将“实际”工作流程创建为子流程
第3步。
创建按需(仅)工作流程:
一个。在“启动器”字段中设置实体的值,指示工作流程是手动运行的
湾调用子工作流程
第4步。
创建一个按需未选择的工作流程:
一个。在“启动器”字段中设置实体的值,指示工作流程已自动化
湾调用子工作流程
步骤5.显示结果
一个。创建一个显示此值和/或的“管理”表单
湾使字段隐藏在用户表单上,并根据需要通过js和/或显示
C。创建一个包含显示此字段和/或的视图
d。创建包含此字段和/或的报告
即检查代码中此字段的值
除非有特定值,否则此字段不会包含在用户表单或视图中。
通过使用自定义字段并通过“处理程序”工作流填充它,您将能够实现您的OOB目标。 (即如果您考虑使用Web GUI创建自定义字段和工作流“OOB”。)
通过以编程方式检查此字段的值,您将实现自定义工作流目标。