首页 文章

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

提问于
浏览
1

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

我在CRM 2011中设计了一个工作流程,它应该在应用程序的单个字段更改(应用程序阶段)上触发,因为我在Start:"Record fields change"下检查了应用程序阶段字段 .

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

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

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

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

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

2 回答

  • 1

    JavaScript肯定会触发一次工作流程 - 它与用户只需单击“保存”没有什么不同 .

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

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

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

    例如,如果在事件前同步插件上注册了以下代码,则 '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也会设置它?

    • 甚至需要一个插件,是否只需要进入工作流程?

    • 你可以看看使用 do not run workflow 字段,该字段是由插件/ JavaScript设置的,然后当工作流运行时,如果该字段设置它什么都不做,但清除字段(不是真正推荐的选项) .

    • 插件可以触发工作流程吗?也许这可以从配置记录中读取?

  • 0

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

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

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

    例如:

    • if(flag == false)

    • 做我的逻辑...........

    • set flag = true

    你怎么看?

    干杯,

    马里奥

相关问题