赢得机会时更新机会

Updating opportunity when opportunity is won

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

逻辑如下:

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

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

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

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

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

平台可以更新已关闭的商机,我刚刚试了一下验证。你得到的错误是什么?

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

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 中获取逻辑并将其移动到创建项目时的异步插件(即使是工作流也应该有效)。