我面临一个奇怪的问题,我无法在网上找到合适的解决方案 . 虽然在这个link下的Microsoft Dynamics CRM论坛上提出了类似的问题,但是如何处理这种情况并没有在那里提到 .
我在CRM 2011中设计了一个工作流程,它应该在应用程序的单个字段更改(应用程序阶段)上触发,因为我在Start:"Record fields change"下检查了应用程序阶段字段 .
现在问题是工作流通过JavaScript代码触发两次:
Xrm.Page.data.entity.save();
另一个是通过同一实体上的Update插件,它是为响应上面的JavaScript代码而执行的 .
我设计的工作流程/流程是一种主工作流程,其具有基于其各自的应用程序阶段启动的其他子流程 . 现在在子进程中,我创建了一个与Application Stage相关的活动并执行其他操作,但由于工作流启动两次,它创建活动并多次执行其他任务 .
在这种情况下,什么是可行的解决方案?
2 回答
JavaScript肯定会触发一次工作流程 - 它与用户只需单击“保存”没有什么不同 .
执行更新的插件(例如
service.Update(...)
)也将触发工作流,这是所有预期的行为 .我首先看一下你的插件,主要是它是否必须执行更新调用?如果你可以避免双重更新,应该解决你的问题 .
您是否知道插件可以通过更新调用进行数据更改?如果您的插件是同步注册的,并且在事件前,那么您对目标实体对象所做的任何更改都会反映在记录中,这不会触发其他更新 - 它是原始消息的一部分 .
例如,如果在事件前同步插件上注册了以下代码,则
'new_field'
将填充"My new value",并且不需要其他更新调用 .如果不这样做可能值得研究其他选择:
如果插件正在设置应用程序阶段,为什么JavaScript也会设置它?
甚至需要一个插件,是否只需要进入工作流程?
你可以看看使用
do not run workflow
字段,该字段是由插件/ JavaScript设置的,然后当工作流运行时,如果该字段设置它什么都不做,但清除字段(不是真正推荐的选项) .插件可以触发工作流程吗?也许这可以从配置记录中读取?
关于插件,当它在Update上触发时,上下文将只包含已更改的字段 .
关于Javascript ..我认为所有字段都被发送到上下文所以它就像所有字段都有一个udpate,因此工作流程将会触发 .
最简单的解决方案是在记录上设置一个标志,因此它只触发一次 . 例如,该字段可以是名为“flag”的布尔值 . 在工作流程的开头,您可以检查值并根据它继续 .
例如:
if(flag == false)
做我的逻辑...........
set flag = true
你怎么看?
干杯,
马里奥