如何通过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上测试了这个。
有两种方法可以。
对于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));
因此,在对其工作的另一个租户进行尝试之后,我得出结论,必须有一些组件负责此错误。瞧,在任何实体的RetrieveMultiple上都有一个第三方插件。停用此插件后,Update将按预期工作。