Microsoft CRM: как открыть возможность по коду? SetStateRequest устарел, обновление не работает - PullRequest
2 голосов
/ 16 апреля 2019

Как мне открыть закрытую (выигранную или потерянную) возможность с помощью кода C # в Dynamics CRM? SetStateRequest устарела (см. документация ), и когда я пытаюсь сделать то же самое с помощью Update, я получаю эту ошибку:

Элемент 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType' содержит данные из типа, который отображается на имя' Microsoft.Crm.Common.ObjectModel: ActivityState '. Десериализатор не знает ни одного типа, который соответствует этому имени Рассмотрите возможность изменения реализации метода ResolveName в вашем DataContractResolver, чтобы он возвращал ненулевое значение для имени «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 для установки кода состояния и кода состояния выдает ту же ошибку.

Я временно деактивировал все плагины, работающие по возможности, чтобы убедиться, что они не являются причиной этой ошибки.

Кажется, это исключение для возможностей. Другие записи могут быть закрыты и открыты с использованием Update без каких-либо проблем.

Я проверял это на CRM 8.2 и 9.1.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Поэтому, попробовав это на другом арендаторе, где он работал, я пришел к выводу, что должен быть какой-то компонент, ответственный за эту ошибку. И вот, есть сторонний плагин, зарегистрированный на RetrieveMultiple любой сущности. После деактивации этого плагина обновление работает как положено.

0 голосов
/ 16 апреля 2019

Это можно сделать двумя способами.

  1. Использование c #

    Для c # просто обновляется код состояния до 0

  2. Использование REST (WEBAPI)

Для Webapi просто используйте метод PATCH и установите код состояния в 0

Теперь, как вы вызываете его через Webapi.Вот пример кода с передней стороны, чтобы вызвать его.Вы можете легко повторить это с помощью Почтальона и посмотреть, как это помогает.

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));
...