Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在CRM 2011中更新记录时触发的工作流/流程_Javascript_Process_Dynamics Crm 2011_Workflow_Dynamics Crm - Fatal编程技术网

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

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

我正面临一个奇怪的问题,我在网上找不到合适的解决办法。虽然在微软Dynamics CRM论坛上也有类似的问题,但如何处理这种情况却没有提到

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

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

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设置,然后当工作流运行时,如果设置该字段,则不执行任何操作,但清除该字段(实际上不是推荐的选项)
  • 插件能触发工作流吗?也许这可以从配置记录中读取

  • 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设置,然后当工作流运行时,如果设置该字段,则不执行任何操作,但清除该字段(实际上不是推荐的选项)
  • 插件能触发工作流吗?也许这可以从配置记录中读取

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

    关于Javascript。。我认为所有字段都会被发送到上下文中,因此就好像所有字段上都有一个udpate,因此工作流将启动

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

    例如:

    • 如果(标志==false)

      • 做我的逻辑
    • 设置标志=真

    你觉得怎么样

    干杯


    Mario

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

    关于Javascript。。我认为所有字段都会被发送到上下文中,因此就好像所有字段上都有一个udpate,因此工作流将启动

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

    例如:

    • 如果(标志==false)

      • 做我的逻辑
    • 设置标志=真

    你觉得怎么样

    干杯

    马里奥