簡體   English   中英

MS CRM 4.0 CrmService - 關閉任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM