2013-07-10 170 views
4

我正在创建一个插件,当用户在crm中设置任务的状态时,验证与事件相关的所有任务。如果没有开启任务,则应关闭事件。CRM 2011插件 - 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。根据我的经验,实体需要注册才能工作,尽管我并不十分清楚是否有必要,但我知道它有效。几次搜索没有给我一个明确的答案。查看这个流行的CRM博客,并提供相同的建议。 http://nishantrana.wordpress.com/2010/01/29/plug-in-for-setstate-and-setstatedynamicentity-messages/

我知道我曾经使用过的实体,未注册SetStateDynamic会导致插件无法触发。

+0

是的,我这样做,工作得很好。谢谢。 –