2013-06-04 1 views
2

Avoir un plugin qui déplace les activités de lead vers l'opportunité sur qualifié. Je me suis inscrit le plugin sur « Créer » de l'occasion et ce qui suit est le codeCréer/mettre à jour la méthode non autorisée dans "Activity Pointer" CRM 2011

public void Execute(IServiceProvider serviceProvider) 
{ 
     IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 
     Entity entity; 

     if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) 
     { 
      entity = (Entity)context.InputParameters["Target"]; 

      if (entity.Attributes.Contains("originatingleadid") == false) return; 
     } 
     else 
     { 
      return; 
     } 

     try 
     { 
      //..... 

      EntityReference Lead = (EntityReference)entity.Attributes["originatingleadid"]; 
      Guid LeadGuid = Lead.Id; 
      MoveActivitiesFromLeadToOpportunity(service, LeadGuid, Opportunityid); 
     } 
     catch (FaultException<OrganizationServiceFault> ex) 
     { 
      throw new InvalidPluginExecutionException(
      "An error occurred in the plug-in.", ex); 
     } 
    } 
private void MoveActivitiesFromLeadToOpportunity(IOrganizationService service, Guid LeadID, Guid OpportunityID) 
    {  
     ConditionExpression condition = new ConditionExpression(); 
     condition.AttributeName = "regardingobjectid"; 
     condition.Operator = ConditionOperator.Equal; 
     condition.Values.Add(LeadID.ToString()); 
     var query = new QueryExpression("activitypointer"); 
     query.Criteria.AddCondition(condition); 
     //query.Conditions.Add("reagrdingobjectid", ConditionOperator.Equal, theIdOfTheRelatedRecord); 
     query.ColumnSet = new ColumnSet(true); 

     var activities = service.RetrieveMultiple(query).Entities; 
     foreach (var activity in activities) 
     { 
      var castedActivity = (ActivityPointer)activity; 
      if (castedActivity.ActivityTypeCode == "email") 
      { 
       castedActivity.Id = Guid.NewGuid(); 
       castedActivity["regardingobjectid"] = new EntityReference("opportunity", OpportunityID); 
       //service.Create(castedActivity);--->Exception thrown 
       //service.Update(castedActivity);---->Tried this one too.Exception is thrown stating method not supported on "ActivityPointer" 
      } 


     } 

Quelqu'un peut-il faire la lumière sur ce sujet? Est-ce que j'ai râté quelque chose? Merci

+0

Les emails du prospect ne passent-ils pas de toute façon à l'opportunité de qualification? Je ne sais pas pourquoi vous devriez faire cela. –

Répondre

4

Vous devez interroger pour le type d'entité exacte, parce que vous ne pouvez pas mettre à jour un activitypointer

private void MoveEmailsFromLeadToOpportunity(IOrganizationService service, Guid LeadID, Guid OpportunityID) 
    {  
     ConditionExpression condition = new ConditionExpression(); 
     condition.AttributeName = "regardingobjectid"; 
     condition.Operator = ConditionOperator.Equal; 
     condition.Values.Add(LeadID.ToString()); 
     var query = new QueryExpression("email"); 
     query.Criteria.AddCondition(condition); 
     query.ColumnSet = new ColumnSet(true); 

     var emails = service.RetrieveMultiple(query).Entities; 
     foreach (var email in emails) 
     { 
      email["regardingobjectid"] = new EntityReference("opportunity", OpportunityID); 
      service.Update(email); 
     } 
    } 

vous pouvez également écrire une méthode qui permet de récupérer d'abord toutes les activités (comme vous l'avez déjà fait) vérifier la ActivityTypeCode après avoir récupéré et mis à jour chaque enregistrement en fonction du type d'activité (e-mail, fax, ...)

+1

probablement vous avez enregistré le plugin comme pré-opération synchrone, à ce point l'enregistrement n'est pas encore créé , essayez de vous inscrire comme post-opération asynchrone –

+0

Désolé .. supprimé le commentaire par erreur..Oui..Merci une tonne !! – Jaya

0

Essayez de commenter cette ligne:

castedActivity.Id = Guid.NewGuid(); 

Et puis faites simplement votre Update:

service.Update(castedActivity) 

Vous mettez à jour juste le RegardingObjectId, ne pas créer une nouvelle activité, de sorte que vous shouldn » t changer l'Id et vous ne devriez pas utiliser Create.

+0

J'ai commenté la ligne mentionnée, mais j'obtiens l'erreur suivante "La méthode 'Update' ne supporte pas les entités de type 'activitypointer'" – Jaya