更新CRM 2011中的记录时触发的工作流程/进程

时间:2013-07-07 13:02:10

标签: javascript process dynamics-crm-2011 workflow dynamics-crm

我面临一个奇怪的问题,我无法在网上找到合适的解决方案。虽然在link下的Microsoft Dynamics CRM论坛上提出了类似的问题,但是在那里没有提到如何处理这种情况。

我在CRM 2011中设计了一个工作流,它应该在应用程序的单个字段更改(应用程序阶段)上触发,因为我在启动时检查了 Application Stage 字段:“记录字段变化“

现在问题是工作流通过JavaScript代码触发了两次:

Xrm.Page.data.entity.save();  

另一个通过同一实体上的Update插件,该插件是为响应上面的JavaScript代码而执行的。

我设计的工作流程/流程是一种主工作流程,其中包含基于各自 Application Stage 启动的其他子流程。现在在子进程中,我创建了一个与Application Stage相关的活动并执行其他操作,但由于工作流启动两次,它创建活动并多次执行其他任务。

在这种情况下,什么是可行的解决方案?

2 个答案:

答案 0 :(得分:1)

JavaScript肯定会触发一次工作流程 - 它与用户只需单击“保存”没有区别。

执行更新的插件(例如service.Update(...))也会触发工作流程,这是所有预期的行为。

我首先看看你的插件,主要是它是否必须执行更新调用?如果您可以避免应该解决问题的双重更新。

您是否知道插件可以通过更新调用进行数据更改?如果您的插件是同步注册的,并且在事件前,那么您对目标实体对象所做的任何更改都会反映在记录中,这不会触发其他更新 - 它是原始消息的一部分。

例如,如果在事件前同步插件上注册了以下代码,则'new_field'将填充“我的新值”,并且不需要其他更新调用。

//get the entity 
Entity entity = (Entity)context.InputParameters["Target"];

//set new field
entity["new_field"] = "My new value";

//end of plugin

否则可能值得研究其他选择:

  1. 如果插件正在设置应用程序阶段,为什么JavaScript也会设置它?
  2. 即使需要插件,是否只需要进入工作流程?
  3. 你可以看看使用do not run workflow字段,该字段是由插件/ JavaScript设置的,然后当工作流运行时如果该字段设置它什么都不做,但清除字段(不是真正推荐的选项) )。
  4. 插件可以触发工作流吗?也许这可以从配置记录中读取出来?

答案 1 :(得分:0)

关于插件,当它在Update上触发时,上下文将只包含已更改的字段。

关于Javascript ..我认为所有字段都被发送到上下文,所以它就像所有字段都有一个udpate,因此工作流程将会触发。

最简单的解决方案是在记录上设置一个标志,因此它只触发一次。例如,该字段可以是名为“flag”的布尔值。在工作流程的开头,您可以检查值并根据它继续。

例如:

  • if(flag == false)

    • 做我的逻辑...........
  • set flag = true

您怎么看?

干杯,

马里奥