2011-12-15 2 views
4

CRM 2011의 사례 (사건) 엔티티와 관련된 모든 액티비티의 상태가 완료로 설정되어 있는지 확인해야만 사례 자체의 상태를 확인할 수 있습니다.ActivityPointer 엔터티를 사용하여 여러 활동 유형에서 동일한 상태를 설정할 수 있습니까? CRM 2011

가능한 모든 활동 유형을 독립적으로 가져온 다음 각 유형에 적절한 SetStateRequest (...)를 수행하기 위해 여러 번의 검색을 수행 할 수 있습니다. This article은 액티비티 유형 레코드가 생성 될 때마다 ActivityPointer 레코드가 생성되고 두 레코드가 동일한 ID를 가짐을 제안하는 것으로 보입니다. 물론, 사례 및 활동을 볼 때 모든 활동 유형 레코드에는 동일한 ID를 가진 연관된 ActivityPointer 레코드가 있습니다. 여태까지는 그런대로 잘됐다.

내 사건과 관련된 모든 ActivityPointer 레코드를 한 번 검색하고 교차 유형 활동 상태 설정을 얻기 위해 상태를 설정할 수 있습니까? ActivityPointer의 목적이 일반적인 활동 조작을 허용하지 않는다면 무엇인지 이해하지 못한다고 생각합니다. 그 점이 있다면? 또한 ActivityPointer 엔티티에는 SetStateRequest 메시지가 없으므로 ActivityPointer 레코드에서 상태 코드/상태를 설정하는 방법을 설명 할 수 있습니까? 이상적으로 나는 완료 상태와 취소 상태를 원합니다.

업데이트 : This blogoffical docs on SetStateRequest이 ActivityPointer 엔터티를 지원하지 않는다고 나타내는 것처럼 보이지만 정확히 원하는 것을 보여줍니다. 나는 이것을 내일 시도 할 것이다. 그러나 만일 누군가가 나아갈 가장 좋은 길에 대한 충고를한다면 나는 의무가있다.

업데이트 2 : 더 자세히 읽으면서 ActivityPointer 엔티티 만 상태 집합을 가질 수 있다고 생각합니다. 그래서 나는 모든 activitypointer 레코드를 this setup 당 취소 된 상태로 설정할 수 있어야합니다. 나는 액티비티 유형마다 다른 "상태 이유"를 일반적으로 설정할 수 없다고 생각합니다. 나는 여전히 이전 링크에 대해 조금 혼란 스럽다. 상태상태 activitypointer의 상태를 나타내지 만 이것이 사실인지, 어떤 값 조합이 허용되는지, 그리고 어떤 것들이 허용되는지는 분명하지 않다. 의미 ...

답변

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); 


       } 
      } 
+0

비슷한 접근 방식을 시도하면 activityPointer.LogicalName 속성이 읽기 전용이라는 메시지가 나타납니다. –

+0

@BorisCallens 코드가 정확하지 않습니다. 활동 포인터 목록에서 유형을 확인하고 해당 유형의 새 활동을 작성한 다음 activitypointer의 ID (해당 활동과 동일한 ID임이 보장됨)를 사용한 다음 해당 활동에 대해 setstatus를 수행해야합니다 당신이 만들었습니다. 희망은 그 말이 맞습니다. 단지 AP에 대한 쿼리를 수행 한 다음이를 반복하여 각 프록시에 대해 일종의 프록시를 만들면 조작 할 수 있습니다. 핵심은 각각의 특정 활동이 동일한 ID를 가진 해당 AP를 가지며 AP의 유형 속성에서 유형을 알고 있다는 것입니다. – keerz

5

Activity Pointer를 설명하는 가장 좋은 방법은 전자 메일 및 전화 통화와 같은 파생 클래스에 기본 클래스라는 것입니다.

활동 포인터는 모든 활동의 기본 특성을 캡슐화하므로 사용자 지정 활동을 만들면 활동 포인터에서 확장됩니다.

여기에서 활동 포인터에는 모든 활동의 상태 및 상태 값이 포함되어 있지만 SetStateRequest에서 액세스 할 수 없다는 의미가 있습니다.

실제로는 의 활동 (열기, 종료 됨, 예약 됨, 취소됨)이 모든 활동에 적용되지만 상 태는 각 활동에 개별적이라고 상상해보십시오.

예 : 작업을 열어도 그 상태의 이유가 열려있을 수 있습니다. 이메일도 열릴 수 있지만 상태 이유는 "대기 중"입니다.

이 구분으로 인해 SetStateRequest는 사용자가 실행할 수 없게합니다 ActivityPointer에서 실행되지만 각 개별 활동 엔티티에서 수행됩니다.

수행하려는 작업을 수행하는 측면에서 지원되는 방법은 연관된 모든 활동을 개별적으로 검색 한 다음 설정된 상태 요청을 수행하는 것입니다.

원하는 모든 작업을 한꺼번에 수행 할 수 있지만 데이터베이스에서 직접 수행해야한다는 점에서 "지원되지 않음"과 관련이 있습니다. 그러나 상태를 완료로 설정하면 상태 이유는 해당 상태에 속한 상태를 반영해야합니다. 그렇지 않으면 활동이 잘못 될 것이라고 나는 믿는다.

그래서 유감스럽게도 우아한 방법으로 주위를 볼 수는 없지만 찾으면 업데이트하십시오!

+0

+1 비지지는 너무 자주 가장 좋은 방법입니다. 온라인 모델에는 데이터베이스에 직접 액세스 할 수 없습니다. –

+0

@Chris는 매우 도움이 된 설명에 감사드립니다. 내가 궁금해하는 것을 할 길을 찾았습니다. 질문에 대한 내 대답을보십시오. – keerz