【问题标题】:Microsoft CRM: How to reopen an opportunity by code? SetStateRequest deprecated, Update not workingMicrosoft CRM:如何通过代码重新打开机会? SetStateRequest 已弃用,更新不起作用
【发布时间】:2019-04-16 10:46:08
【问题描述】:

如何通过 Dynamics CRM 中的 C# 代码重新打开已关闭(赢得或失去)的机会? SetStateRequest 已弃用(请参阅 documentation),当我尝试通过 Update 执行相同操作时,我收到此错误:

元素“http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType”包含映射到名称“Microsoft.Crm.Common.ObjectModel:ActivityState”的类型的数据。反序列化器不知道映射到此名称的任何类型。考虑更改 DataContractResolver 上的 ResolveName 方法的实现,以返回名称“ActivityState”和命名空间“Microsoft.Crm.Common.ObjectModel”的非空值。

代码如下:

Entity updateTarget = new Entity("opportunity", opportunityId);
updateTarget["statecode"] = new OptionSetValue(0); // 0 = Open
updateTarget["statuscode"] = new OptionSetValue(1); // 1 = In Progress
orgSvc.Update(updateTarget); // Raises exception

执行 REST PATCH 请求来设置 statecode 和 statuscode 会产生同样的错误。

我暂时停用了所有正在运行的插件,以确保这些插件不是导致此错误的原因。

这似乎是机会的例外。其他记录可以使用Update 关闭和打开,没有任何问题。

我在 CRM 8.2 和 9.1 上对此进行了测试。

【问题讨论】:

  • 如下回答中提到的,不用OptionSetValue试试,就像updateTarget["statecode"] = 0;一样
  • 这会产生错误“状态代码无效或状态代码有效但状态代码对于指定的状态代码无效。”。
  • 好的,所以尝试添加一个附加语句:updateTarget["statuscode"] = 1 这是“进行中”的代码

标签: c# dynamics-crm deprecated setstate


【解决方案1】:

有两种方法可以做到。

  1. 使用 c#

    因为 c# 只是将 statecode 更新为 0

  2. 使用 REST (WEBAPI)

Webapi 只使用 PATCH 方法并将 statecode 设置为 0

现在如何通过 Webapi 调用它。这是从前端调用它的示例代码。您可以使用 Postman 轻松地复制它,看看这有什么帮助。

var entity = {};
entity.statecode = 0;

var req = new XMLHttpRequest();
req.open("PATCH", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/opportunities(8CA20837-715F-E911-A83A-000D3A3852A3)", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 204) {
            //Success - No Return Data - Do Something
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send(JSON.stringify(entity));

【讨论】:

  • 这会产生错误“机会已关闭。”这是有道理的。为什么 WinOpportunity 或 LoseOpportunity 会重新刷新记录?你试过这种方法吗?请记住,我正在尝试重新打开一个机会。我不想关闭它。
  • 你是对的,我误读了你的问题。我已经更新了我的答案,我刚刚尝试在我的系统中使用 webapi。它确实打开了封闭的机会。
【解决方案2】:

因此,在另一个有效的租户上尝试了这个之后,我得出的结论是,必须有一些组件对这个错误负责。瞧,在任何实体的 RetrieveMultiple 上都注册了一个第三方插件。停用此插件后,更新按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多