IsValidStateTransitionRequest
Допустим, что мы собираемся изменить состояние Возможной сделки с помощью запроса WinOpportunityRequest. Т.к. для ВС предусмотрен некий стандартный функционал, то такой переход не всегда возможен. Например, если попытаться закрытую сделку перевести в выигранное состояние, то получите ошибку: The opportunity is already closed.
Чтобы избежать ошибки, можно выполнить предварительную проверку с помощью запроса IsValidStateTransitionRequest. Запрос IsValidStateTransitionRequest проверяет возможность перехода на конкретный Статус и возвращает true или false.
Пример:
using System; using System.ServiceModel.Description; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Crm.Sdk.Messages; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // Подключаемся к CRM ClientCredentials credentials = new ClientCredentials(); credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2012"); Uri uri = new Uri("http://crm2015/superfirma/XRMServices/2011/Organization.svc"); OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null); proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior()); IOrganizationService service = (IOrganizationService)proxy; // Ссылка на ВС EntityReference opportunityRecord = new EntityReference("opportunity", new Guid("905FF239-7D7C-E711-80BE-000C291AFB9D")); // Создаем запрос на проверку IsValidStateTransitionRequest checkRecordState = new IsValidStateTransitionRequest(); checkRecordState.Entity = opportunityRecord; // Указываем Состояние и Статус, в который хотим перевести запись checkRecordState.NewState = "Won"; checkRecordState.NewStatus = 3; // Выполняем запрос IsValidStateTransitionResponse checkStateResponse = (IsValidStateTransitionResponse)service.Execute(checkRecordState); // Проверяем результат if (checkStateResponse.IsValid) { Console.WriteLine("Can convert."); Console.ReadKey(); } } } }