2011-12-15 56 views
4

我需要確保CRM 2011中與案例(事件)實體相關的所有活動的狀態都已設置爲完成,然後才能將案件狀態設置爲已解決。我可以使用ActivityPointer實體在不同的活動類型上設置相同的狀態嗎? CRM 2011

我可以進行多次檢索以獨立獲取所有可能的活動類型,然後對每種類型執行相應的SetStateRequest(...)。 This article似乎表明每次創建任何活動類型記錄時都會創建一個ActivityPointer記錄,並且這兩個記錄具有相同的ID。當然,當我查看案例和活動時,每個活動類型記錄都有一個具有相同ID的關聯的活動指針記錄。到現在爲止還挺好。

這是否意味着我可以執行與我的案例相關的所有ActivityPointer記錄的單個檢索並設置其狀態以實現交叉類型活動狀態設置?我想我不明白ActivityPointer的目的是什麼,如果它不允許我進行泛型活動操作。這是否是重點?另外,ActivityPointer實體沒有SetStateRequest消息,所以有人可以解釋我如何設置ActivityPointer記錄上的狀態碼/狀態?理想情況下,我希望完成狀態和取消狀態。

更新:This blog似乎正好顯示我想要的,儘管offical docs on SetStateRequest似乎表明它不支持ActivityPointer實體。我明天會試試,但如果任何人有關於繼續進行的最佳方法的建議,我會承擔責任。

更新2:在進一步閱讀,我認爲情況是一個ActivityPointer實體只能有它的狀態設置。所以我應該能夠將所有活動指針記錄設置爲根據this setup取消的狀態。我想這是有道理的,我不能一般性地設置「狀態原因」,因爲它在活動類型之間有所不同。我仍然對前一個鏈接感到困惑,似乎表明我可以設置活動指針的狀態狀態,但不清楚這是否爲真,允許哪些值組合以及它們是什麼意思是...

回答

5

Chris。我在這裏回答我自己的問題,因爲有一種方法可以使用活動指針記錄來關閉所有活動類型。這可能是有這種記錄的原因之一。它依賴於一個活動指針記錄具有一個字段,該字段定義了它所代表的活動類型。這裏的代碼:

// do a search for all activities that have a status of open or scheduled 
// that covers them all 
// here's the filter expression to use 
/* 
FilterExpression filterStateCode = new FilterExpression(); 
      filterStateCode.FilterOperator = LogicalOperator.Or; 
      filterStateCode.AddCondition("statecode", ConditionOperator.Equal, "Open"); 
      filterStateCode.AddCondition("statecode", ConditionOperator.Equal, "Scheduled"); 
*/ 
// the search returns a list of entities called AllOpenRelatedActivities 

foreach (var currentActivityPointer in AllOpenRelatedActivities.Entities) 
      { 
       if (currentActivityPointer.Attributes.Contains("activityid") & currentActivityPointer.Attributes.Contains("activitytypecode")) 
       { 
        currentActivityPointer.LogicalName = currentActivityPointer.Attributes["activitytypecode"].ToString(); 
        currentActivityPointer.Id = (Guid)currentActivityPointer.Attributes["activityid"]; 

        SetStateRequest setState = new SetStateRequest(); 
        setState.EntityMoniker = currentActivityPointer.ToEntityReference(); 
        setState.State = new OptionSetValue(); 
        setState.State.Value = 2; 
        setState.Status = new OptionSetValue(); 
        setState.Status.Value = -1; 



        SetStateResponse setStateResponse = (SetStateResponse)service.Execute(setState); 


       } 
      } 
5

我可以解釋活動指針的最佳方式是它是派生類(如電子郵件和電話呼叫)的基類。

活動指針封裝了任何活動的基本屬性,因此如果您創建自定義活動,它也將從活動指針擴展。

由此可見,活動指針包含所有活動的狀態和狀態值,但也有道理,它不能從SetStateRequest訪問。

我想象的是活動的實際狀態,打開,關閉,預定,取消,適用於所有活動,但狀態對每個活動都是單獨的。

例如,一個任務可以打開,但其狀態原因也可以打開 雖然電子郵件也可以打開,但其狀態原因是「等待發送」

由於此差異,SetStateRequest可能不會讓您運行它在ActivityPointer上,但它會在每個單獨的活動實體上。

就您所做的事情而言,支持的方法是單獨檢索所有關聯的活動,然後執行設置狀態請求。

您可以一次完成所有操作,但需要一點「不支持」,因爲您可能需要直接在數據庫上執行此操作。但是,將狀態設置爲「完成」時,狀態原因還必須反映屬於該狀態的狀態。否則,我相信這些活動會出錯。

因此,不幸的是,我無法以優雅的方式看到它周圍的方式,但請更新,如果你找到一個!

+0

+1不支持是通常最酷的方式來完成任務。太糟糕了,在線模型中沒有直接的數據庫訪問。 – 2011-12-15 17:00:52

+0

@Chris謝謝你的解釋,這非常有幫助。我找到了一種方法去做我想知道的事情。看到我對這個問題的回答。 – keerz 2011-12-25 01:52:01

相關問題