【问题标题】:Workflows/Processes triggered when updating the record in CRM 2011更新 CRM 2011 中的记录时触发的工作流/流程
【发布时间】:2013-07-07 13:02:10
【问题描述】:

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

我在 CRM 2011 中设计了一个工作流,它应该触发应用程序的单个字段更改(应用程序阶段),因为我检查了 开始时间下的 应用程序阶段字段:“记录字段改变”

现在的问题是工作流触发了两次,也许是通过 JavaScript 代码触发的一次:

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

另一个通过更新插件在同一实体上执行以响应上面的 JavaScript 代码。

我设计的工作流/过程是一种主工作流,它具有基于它们各自的应用程序阶段启动的其他子过程。现在在子进程中,我创建了一个与应用程序阶段相关的活动并执行其他操作,但由于工作流启动两次,它正在创建活动并多次执行其他任务。

应对这种情况的可行解决方案是什么?

【问题讨论】:

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


    【解决方案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. 插件能否触发工作流?也许这可以从配置记录中读取?

    【讨论】:

      【解决方案2】:

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

      关于 Javascript.. 我认为所有字段都被发送到上下文,所以就像所有字段都有更新,所以工作流程会触发。

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

      例如:

      • 如果(标志 == 假)

        • 按我的逻辑…………
      • 设置标志 = true

      你怎么看?

      干杯,

      马里奥

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 2021-03-18
        • 2015-12-04
        相关资源
        最近更新 更多