Microsoft CRM:如何通过代码重新打开机会?不推荐使用SetStateRequest,更新无效

问题描述 投票:2回答:2

如何通过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上测试了这个。

c# dynamics-crm deprecated setstate
2个回答
0
投票

有两种方法可以。

  1. 使用c# 对于c#,只是将状态代码更新为0
  2. 使用REST(WEB API)

对于Webapi,只需使用PATCH方法并将状态代码设置为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));

0
投票

因此,在对其工作的另一个租户进行尝试之后,我得出结论,必须有一些组件负责此错误。瞧,在任何实体的RetrieveMultiple上都有一个第三方插件。停用此插件后,Update将按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.