【问题标题】:Updating opportunity when opportunity is won赢得机会时更新机会
【发布时间】:2016-04-13 06:51:08
【问题描述】:

我的任务是为从 cm 2013 迁移到 2016 的系统更新 CRM 插件。插件失败,因为它试图将机会状态设置为赢,只需更新字段即可。您需要使用 WinOpporunityRequest 来执行此操作。

逻辑如下:

  1. 赢得机会后,插件会在机会关闭实体上执行和运行
  2. 插件创建一个新的自定义实体记录(项目)并更新其他几条记录。
  3. 通过opportunityclose实体的opportunityid获取当前机会
  4. 它通过引用新创建的项目记录来更新机会上的字段。
  5. 更新是通过 Update() 方法完成的。

在 5 时它失败了,因为在 3 时它获得了当前机会,它已经处于获胜状态。如果您尝试使用新状态更新记录,则会失败。

我的问题是,我如何在对机会关闭实体采取行动并仅更新一个字段时获得机会。我不需要设置状态,因为这是在标准 CRM 流程中完成的。

--编辑 获取机会的代码行:

Xrm.Opportunity currentOpportunityObjectToUpdate = serviceContext.CreateQuery<Xrm.Opportunity>().First(x => x.Id == entityRef.Id);

【问题讨论】:

    标签: dynamics-crm


    【解决方案1】:

    该平台允许您更新已关闭的机会,我只是尝试验证。你得到什么错误?

    在第 5 步中,确保您只发送您尝试更新的属性(opportunityid 和项目查找)。因此,当您发布更新时,请勿使用您检索或创建的任何预先存在的机会对象...这样做会发送对象上的所有属性,并且平台将处理每个属性,就好像它正在被更改一样,即使值不变。相反,创建一个仅指定 id 和 project 的新机会对象,如下所示:

    context.AddObject(new Opportunity() { 
        Id = idOfOpportunity,            // you may have to specify id both here...
        OpportunityId = idOfOpportunity, // ...and here, can never remember. Doesn't hurt to specify in both places.
        new_ProjectId = idOfProject
    }); 
    context.SaveChanges();
    

    如果您遇到困难,您总是有一个简单的解决方法选择:从 #4 中获取逻辑并将其移动到创建项目时的异步插件(即使工作流程也应该工作)。

    【讨论】:

    • 我已经添加了获得机会的代码行。这里它的状态是赢了。我正在研究如何只更新一个属性。我有点卡住了。据我所知,我需要从 CRM 获取记录,更新单个属性并更新记录。由于从 CRM 获取记录的状态设置为 won,因此它也会更新该属性
    • 这是所处的阶段造成的吗?即PostOperation?
    • 我更新了我的答案。在不知道具体错误是什么的情况下,我无法确定它是否与处于 PostOperation 中有关。
    • 错误提示我需要使用 WinOpporunityRequest 来关闭机会。但是您提供的样品正是我正在寻找的。我不确定这是否可能,因为我能找到的所有示例都是检索记录表 CRM。
    • 您需要在您的上下文中设置合并选项。查看Do you understand MergOptions? 以获得非常清晰的解释。
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多