![](/img/trans.png)
[英]Analog of CRM 4 methods CrmService.CreateAsync(UpdateAsync) in CRM 2011
[英]MS CRM 4.0 CrmService - Close a Task
我正在嘗試解決如何使用 CrmService 關閉 MS CRM 4.0 中的任務
我嘗試使用SetStateTaskRequest
將任務的狀態和狀態設置為 TaskState.Completed 和 5。我也嘗試過 TaskState.Completed 和 -1,但也沒有骰子。
無論哪種方式,我只在 CrmService.Execute 嘗試中收到有用的“服務器無法處理請求”異常。
我可以隨意創建和更新任務。 但我似乎無法將它們設置為完成。 這令人沮喪。
我注意到我只能通過關閉任務操作在 CRM 中將任務的狀態設置為已完成。 我想知道是否需要單獨調用 CrmService 來執行關閉任務操作,而不是通過 CrmService.Execute 方法。
哦:我正在以完全權限登錄 CrmService。 所以我看不出這是任務項目的權限問題。
我想不出還有什么可能導致這個問題。 任何建議,甚至只是正確方向的一點,都將不勝感激。
第一次編輯:
感謝grega g的回答讓我檢查異常的 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 g 相同:
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 Web 界面確認與已完成任務關聯的狀態值也被命名為已完成。 我可以從上面的 SQL 中確認,對於任務,此狀態的值是 5 - 這是從我的 Enum 傳入的值。
我還可以確認 gTaskId 被設置為引用一個實際存在的任務的有效 Guid,並且在嘗試關閉時打開。
越來越好奇。 有什么想法嗎?
使用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 ..."
}
這段代碼應該可以工作(或者讓你看看為什么會發生錯誤)
您確定當您嘗試關閉任務時,您正在傳遞對 Completed狀態有效的狀態值嗎? 不同的狀態碼只有對應的狀態碼才有效。 你能添加你的源代碼和你的狀態實體定制的一部分嗎?
找到了!
好的 - 仔細查看我上面的代碼和錯誤消息,我的 CrmService 包含屬性 EntityID - 但例外是缺少屬性 EntityId。
不知何故,我的 CrmService 將其 EntityId 屬性重命名為 EntityID。
重命名屬性解決了這個問題。 我仍然不知道這最初是怎么發生的。
為安全起見,我將重新生成一個新的服務代理以確保我的屬性正確命名。
查看代碼,似乎有人對“Id”進行了查找和替換並將其轉換為“ID”——順便說一下,這是我工作場所中代表主鍵的 Property 字段的命名約定。
再次感謝 grega g 指出 Detail 屬性包含我需要的額外信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.