Javascript 在CRM 2011中更新记录时触发的工作流/流程
我正面临一个奇怪的问题,我在网上找不到合适的解决办法。虽然在微软Dynamics CRM论坛上也有类似的问题,但如何处理这种情况却没有提到 我在CRM 2011中设计了一个工作流,该工作流应在应用程序的单个字段更改(应用程序阶段)时触发,因为我在“开始”下检查了“记录字段更改”下的应用程序阶段字段 现在的问题是工作流触发了两次,一次是通过JavaScript代码触发的:Javascript 在CRM 2011中更新记录时触发的工作流/流程,javascript,process,dynamics-crm-2011,workflow,dynamics-crm,Javascript,Process,Dynamics Crm 2011,Workflow,Dynamics Crm,我正面临一个奇怪的问题,我在网上找不到合适的解决办法。虽然在微软Dynamics CRM论坛上也有类似的问题,但如何处理这种情况却没有提到 我在CRM 2011中设计了一个工作流,该工作流应在应用程序的单个字段更改(应用程序阶段)时触发,因为我在“开始”下检查了“记录字段更改”下的应用程序阶段字段 现在的问题是工作流触发了两次,一次是通过JavaScript代码触发的: Xrm.Page.data.entity.save(); 另一个是通过更新同一实体上的插件,该插件是响应上面的JavaS
Xrm.Page.data.entity.save();
另一个是通过更新同一实体上的插件,该插件是响应上面的JavaScript代码而执行的
我设计的工作流/流程是一种主工作流,它有其他子流程,这些子流程根据各自的应用阶段启动。现在,在子流程中,我创建了一个与应用程序阶段相关的活动,并执行了其他工作,但由于工作流启动了两次,它正在多次创建活动和执行其他任务
在这种情况下,什么是可行的解决方案呢?JavaScript肯定会触发工作流一次,这与用户只需单击“保存”没有什么不同 执行更新的插件(例如,
service.update(…)
)也将触发工作流,这是所有预期行为
我会先看看你的插件,主要是它是否需要执行更新调用?如果您可以避免双重更新,那么应该可以解决您的问题
你知道插件可以通过更新调用来更改数据吗?如果您的插件是同步注册的,并且是在pre事件上注册的,那么您对目标实体对象所做的任何更改都会反映在记录上,这不会触发额外的更新—它是原始消息的一部分
例如,如果在pre事件上注册了以下代码,则'new_field'
将填充“My new value”,并且不需要额外的更新调用
//get the entity
Entity entity = (Entity)context.InputParameters["Target"];
//set new field
entity["new_field"] = "My new value";
//end of plugin
如果不能做到这一点,可能值得研究其他选项:
不运行工作流
字段查看,该字段由插件/JavaScript设置,然后当工作流运行时,如果设置该字段,则不执行任何操作,但清除该字段(实际上不是推荐的选项)JavaScript肯定会触发工作流一次,这与用户单击save没有什么不同 执行更新的插件(例如,
service.update(…)
)也将触发工作流,这是所有预期行为
我会先看看你的插件,主要是它是否需要执行更新调用?如果您可以避免双重更新,那么应该可以解决您的问题
你知道插件可以通过更新调用来更改数据吗?如果您的插件是同步注册的,并且是在pre事件上注册的,那么您对目标实体对象所做的任何更改都会反映在记录上,这不会触发额外的更新—它是原始消息的一部分
例如,如果在pre事件上注册了以下代码,则'new_field'
将填充“My new value”,并且不需要额外的更新调用
//get the entity
Entity entity = (Entity)context.InputParameters["Target"];
//set new field
entity["new_field"] = "My new value";
//end of plugin
如果不能做到这一点,可能值得研究其他选项:
不运行工作流
字段查看,该字段由插件/JavaScript设置,然后当工作流运行时,如果设置该字段,则不执行任何操作,但清除该字段(实际上不是推荐的选项)关于插件,当它在更新时触发时,上下文将只包含已更改的字段 关于Javascript。。我认为所有字段都会被发送到上下文中,因此就好像所有字段上都有一个udpate,因此工作流将启动 最简单的解决方案是在记录上设置一个标志,这样它只会触发一次。例如,此字段可以是名为“flag”的布尔值。在工作流开始时,您可以检查该值,并根据该值让其继续 例如:
- 如果(标志==false)
- 做我的逻辑
- 设置标志=真
Mario关于插件,当它在更新时触发时,上下文将只包含已更改的字段 关于Javascript。。我认为所有字段都会被发送到上下文中,因此就好像所有字段上都有一个udpate,因此工作流将启动 最简单的解决方案是在记录上设置一个标志,这样它只会触发一次。例如,此字段可以是名为“flag”的布尔值。在工作流开始时,您可以检查该值,并根据该值让其继续 例如:
- 如果(标志==false)
- 做我的逻辑
- 设置标志=真