2013-07-10 4 views
4

사용자가 crm에서 작업 상태를 설정하면 인시던트와 관련된 모든 작업을 확인하도록 플러그인을 만들고 있습니다. 작업이 열리지 않으면 사건을 닫아야합니다.CRM 2011 PLUGIN - PostTaskSetState

프로필을 사용하여 플러그인을 디버깅 할 때 제대로 작동하지만 아무 일도 일어나지 않습니다.

IPluginExecutionContext context = localContext.PluginExecutionContext; 
      IOrganizationService service = localContext.OrganizationService; 
      EntityReference entity = (EntityReference)context.InputParameters["EntityMoniker"]; 
      ColumnSet cols = new ColumnSet(); 
      cols.AllColumns = true; 
      Entity entityComplete = service.Retrieve("task", entity.Id, cols); 

      if (((OptionSetValue)entityComplete.Attributes["statecode"]).Value == 0) //se o status for cancelado ou concluído 
      { 
       if (entityComplete.Attributes.Keys.Contains("regardingobjectid") && ((EntityReference)entityComplete.Attributes["regardingobjectid"]).LogicalName == "incident") 
       { 

        QueryExpression query = new QueryExpression(); 
        query.EntityName = "task"; 
        query.ColumnSet = cols; 
        query.LinkEntities.Add(new LinkEntity("task", "incident", "regardingobjectid", "incidentid", JoinOperator.Inner)); 
        query.Criteria.AddCondition(new ConditionExpression("statecode", ConditionOperator.Equal, 0)); 
        query.Criteria.AddCondition(new ConditionExpression("activityid", ConditionOperator.NotEqual, entityComplete.Id)); 
        query.Criteria.AddCondition(new ConditionExpression("regardingobjectid", ConditionOperator.Equal, ((EntityReference)entityComplete.Attributes["regardingobjectid"]).Id)); 
        EntityCollection collection = service.RetrieveMultiple(query); 
        if (collection.Entities.Count == 0) 
        { 
         Entity incident = service.Retrieve("incident", ((EntityReference)entityComplete.Attributes["regardingobjectid"]).Id, cols); 
         SetStateRequest setState = new SetStateRequest(); 
         setState.EntityMoniker = new EntityReference(); 
         setState.EntityMoniker.Id = incident.Id; 
         setState.EntityMoniker.LogicalName = incident.LogicalName; 
         setState.State = new OptionSetValue(1); 
         SetStateResponse setStateResponse = (SetStateResponse)service.Execute(setState); 
        } 
       } 
      } 

누군가 나를 도울 수 있습니까? 감사합니다. .

+0

디버거를 연결하면 올바르게 작동합니다. – Daryl

+0

네, 잘 작동합니다. –

+0

추적 로그에 오류가 있습니까? 어쩌면 디버거에서 디버깅하려면 다른 사용자로 실행 중입니까? – Daryl

답변

1

SetStateDynamicEntity 메시지에 대해서도 플러그인을 등록하고 SetState에 대해서도 플러그인을 등록 해보십시오. 경험상 엔티티는 필요에 따라 100 % 확실하지는 않지만 작업하기 위해 둘 다 등록해야합니다. 실제로 작동한다는 사실을 알고 있습니다. 여러 가지 검색을 통해 확실한 답을 얻지 못했습니다. 같은 제안으로이 유명한 CRM 블로그를 확인하십시오. http://nishantrana.wordpress.com/2010/01/29/plug-in-for-setstate-and-setstatedynamicentity-messages/

내가 작업 한 엔티티에서 SetStateDynamic에 등록하지 못하면 플러그인이 트리거되지 않습니다.

+0

예,이 작업을 수행하고 정상적으로 작동합니다. 감사. –