我面临一个奇怪的问题,我无法在网上找到合适的解决方案。虽然在link下的Microsoft Dynamics CRM论坛上提出了类似的问题,但是在那里没有提到如何处理这种情况。
我在CRM 2011中设计了一个工作流,它应该在应用程序的单个字段更改(应用程序阶段)上触发,因为我在启动时检查了 Application Stage 字段:“记录字段变化“。
现在问题是工作流通过JavaScript代码触发了两次:
Xrm.Page.data.entity.save();
另一个通过同一实体上的Update插件,该插件是为响应上面的JavaScript代码而执行的。
我设计的工作流程/流程是一种主工作流程,其中包含基于各自 Application Stage 启动的其他子流程。现在在子进程中,我创建了一个与Application Stage相关的活动并执行其他操作,但由于工作流启动两次,它创建活动并多次执行其他任务。
在这种情况下,什么是可行的解决方案?
答案 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
否则可能值得研究其他选择:
do not run workflow
字段,该字段是由插件/ JavaScript设置的,然后当工作流运行时如果该字段设置它什么都不做,但清除字段(不是真正推荐的选项) )。答案 1 :(得分:0)
关于插件,当它在Update上触发时,上下文将只包含已更改的字段。
关于Javascript ..我认为所有字段都被发送到上下文,所以它就像所有字段都有一个udpate,因此工作流程将会触发。
最简单的解决方案是在记录上设置一个标志,因此它只触发一次。例如,该字段可以是名为“flag”的布尔值。在工作流程的开头,您可以检查值并根据它继续。
例如:
if(flag == false)
set flag = true
您怎么看?
干杯,
马里奥