2009-10-21 2 views
0

Я пытаюсь выяснить, как использовать CrmService закрыть задачу в MS CRM 4.0MS CRM 4.0 CrmService - Закрыть Задачу

Я пытался использовать SetStateTaskRequest, чтобы установить состояние и статус Целевого в к TaskState.Completed и 5. Я также попробовал TaskState.Completed и -1, но там не было ни одной кости.

В любом случае, я получаю всегда полезное исключение «Сервер не смог обработать запрос» в попытке CrmService.Execute.

Я могу создавать и обновлять задачи так же свободно, как мне нравится. Но я не могу заставить их закончить. Это расстраивает.

Я заметил, что я могу установить состояние задачи для выполнения в CRM с помощью действия Close Task. Мне было интересно, есть ли отдельный вызов CrmService, который мне нужно сделать для выполнения действия Close Task, а не через метод CrmService.Execute.

О: Я вхожу в CrmService с полными разрешениями. Поэтому я не вижу, что это проблема с разрешениями для элемента задачи.

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

FIRST EDIT:

Благодаря Grega г для получения меня проверить Detail поле исключения.

У меня теперь есть более подробное сообщение об исключении. В XML-форма:

<error> 
    <code>0x80040203</code> 
    <description>Invalid format of input XML for request SetStateTask: required field 'EntityId' is missing.</description> 
    <type>Platform</type> 
</error> 

Что странно - рассмотреть мой код (почти идентичный Greg г-х:

 SetStateTaskRequest request = new SetStateTaskRequest(); 
     request.EntityID = gTaskId; 
     request.TaskState = TaskState.Completed; 

     // ETaskStatusCode is an enumeration of the status codes taken from the StringMap in CRM. 
     // 
     // ETaskStatusCode.Completed = 5 - I can confirm this is the accurate status value for a Closed Task. 
     // 
     // Also, I have attempted this code with -1, which the documentation claims should cause the status 
     // to automatically be set to the default status for the supplied state. No change there. 
     request.TaskStatus = (int)ETaskStatusCode.Completed;    

     SetStateTaskResponse response = CRMManager.CrmService.Execute(request) as SetStateTaskResponse; 

Кроме того, только чтобы убедиться, что у меня есть код правильный статус (а также поделиться чем-то я «ве нашел очень полезно при работе с MS CRM), вот SQL я использую, чтобы определить значения для статусов сущностей.

SELECT 
    MSE.ObjectTypeCode, 
    MSE.PhysicalName, 
    SM.AttributeName, 
    SM.Value, 
    SM.AttributeValue 
FROM MetadataSchema.Entity MSE 
    INNER JOIN StringMap SM on MSE.ObjectTypeCode = SM.ObjectTypeCode 
ORDER BY MSE.PhysicalName, SM.AttributeName, SM.AttributeValue 

Я могу подтвердить из веб-интерфейса MS CRM, что значение состояния, которое, как связанный с Завершенной задачей, также называется Completed. Я могу подтвердить из SQL выше, что значение этого статуса для задачи - 5 - это значение, переданное из моего Enum.

Я также могу подтвердить, что gTaskId настроен на действительный Guid, который ссылается на Task, который действительно существует, и открыт в момент попытки закрытия.

Любопытство и любопытство. Есть предположения?

ответ

0

Найденный!

ОК - внимательно рассмотрев мой код выше и сообщение об ошибке, мой CrmService содержал свойство EntityID, но исключение состояло в том, что свойство EntityId отсутствовало.

Как-то, у моего CrmService было свойство EntityId, переименованное в EntityID.

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

Чтобы быть в безопасности, я создам новый служебный прокси, чтобы убедиться, что мои свойства правильно названы.

Просматривая код, кажется, что кто-то выполнил поиск и замену на «ИД» и превратил его в «ИД», что, кстати, является соглашением именования на моем рабочем месте для полей свойств, которые представляют первичные ключи.

Еще раз спасибо grega g за то, что вы указали, что у свойства Detail есть дополнительная информация, в которой я нуждался.

1

SetStateTaskRequest класс.

SetStateTaskRequest task2Close = new SetStateTaskRequest(); 
task2Close.EntityId = <taskGuid> 
task2Close.TaskState = TaskState.Completed; 
task2Close.TaskStatus = <some value> 

try 
{ 
    SetStateTaskResponse r = (SetStateTaskResponse) crmSvc.Execute(task2Close); 
} 
catch (SoapException e) 
{ 
    //Use e.Details for more info than "server was unable ..." 
} 

Этот код должен работать (или позволяют понять, почему возникает ошибка)

+0

Сначала с летучей мыши - это почти * точно * мой код. Но я не понял, что могу получить более подробное сообщение из поля «Сведения». Однако характер этого сообщения ... странный, учитывая контекст. Я отредактирую свое оригинальное сообщение с подробностями. –

0

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

+0

Спасибо за предложение - но да, я уверен. Я проверил некоторый SQL на StringMap для подтверждения. Завершенная задача должна иметь статус «Завершено», для которой задано значение 5 в задачах StringMap. Я также пробовал -1, который в документации должен предоставить мне запись по умолчанию для выбранного состояния. Не повезло. –

Смежные вопросы