CRM插件“更新”错误地触发记录创建“创建”

时间:2013-12-05 15:25:01

标签: plugins vbscript dynamics-crm-2011 crm

我为CRM Dynamics 2011编写了两个插件。一个配置为在创建商机产品期间触发(步骤添加消息设置为“创建”)。另一个配置为在更新商机产品期间触发(步骤添加消息设置为“更新”)。两个插件都将CRM数据写入外部SQL数据库(在一种情况下插入,在另一种情况下更新)。

第一个插件单独效果很好(预操作)。它仅在机会产品创建期间调用,并且数据已成功写入我的外部数据库。

一旦我激活第二个插件(后期操作+前映像),如果我编辑机会产品,它也可以很好地工作。但是,当我创建一个新插件时,也会调用插件...我真的不明白它来自何处,因为我确定了以下内容: - 两个插件完全分开。我有两个不同的组件,每个组件只有一个步骤。 - 在每个插件中,我都有一个条件在运行代码之前检查context.MessageName值(创建或更新)。

你们是否知道这是从哪里来的?

编辑1(2013年12月18日):我相信更新插件会在创建时调用,因为“保存时”工作流实际更新了商机产品中的某些字段。我的目标是使用SharedVariables来防止在首先运行Create插件时执行Update插件。这是用于在两个插件之间共享变量的代码。 Update插件中的SharedVariables.Contains检查始终为false。为了测试这一点,我在调试Update插件的同时创建了一个全新的Opportunity产品。

创建插件

Dim setFlag As Boolean = True
  context.SharedVariables.Add("NewSFR", setFlag)

更新插件

If context.SharedVariables.Contains("NewSFR") Then
  Dim receivedFlag As Boolean = context.SharedVariables("NewSFR")
  If receivedFlag Then
    Return
  End If
End If

4 个答案:

答案 0 :(得分:1)

我找到了一个解决方案来解决这个问题。

我在opportunityproduct表中创建了一个自定义字段,用作标志。然后在OnLoad oppportunityproduct表单上使用Javascript,我将字段设置为0或1,关于加载什么类型的表单(创建或更新)。这样做的javascript代码是:

var FormType = Xrm.Page.ui.getFormType();

如果FormType = 1,那么它是一个创建表单类型,我将我的标志设置为1.如果FormType = 2,那么它是一个更新表单类型,我将我的标志设置为0.

然后我检查我的Update插件中的标志值,如果等于1则退出。

答案 1 :(得分:0)

如果您尝试在实体上调用service.Update(),或者工作流正在更新字段,则会发生这种情况

答案 2 :(得分:0)

如果确实没有其他插件调用更新,那么这可能是设计的,即crm正在更新实体以将其包含在其计算中。

要解决此问题,您可以:

  1. 检查Context.Depth是否正确,如果它不是1,您可以用适当的条件包装更新

  2. 在预创建中添加SharedVariable,并在帖子更新中检查它是否存在。 e.g。

    context.SharedVariables.Add("key", (Object)value); // create shared var
    

    您可以在此处详细了解SharedVariable http://msdn.microsoft.com/en-us/library/gg328579.aspx

  3. 最后,由于您处于创建之前,您可能会在目标中包含一个标记属性,并检查目标是否包含此标记在发布事件中。

答案 3 :(得分:0)

这是Dynamics CRM中的一个错误,其中Update是在Create上触发的。在我所做的所有实现中,我也遇到过这种情况。方法是在Plugin代码中提供一个检查,如果MessageName是'Update',然后提供实际代码的输入。