2013-07-10 2 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

Да, я делаю это и отлично работал. Благодарю. –