活动指针中不允许创建/更新方法;CRM 2011

本文关键字:新方法 CRM 2011 更新 指针 不允许 创建 活动 | 更新日期: 2023-09-27 18:16:43

我有一个插件,移动导致机会资格的活动。我已经在机会的"创建"上注册了插件,下面是代码

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"
            }

        }

有人能解释一下吗?我错过什么了吗?谢谢你

活动指针中不允许创建/更新方法;CRM 2011

您需要查询确切的实体类型,因为您无法更新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);
        }
    }

您还可以编写一个方法,首先检索所有活动(就像您已经做过的那样),然后检查ActivityTypeCode,根据活动类型(电子邮件,传真,…)检索和更新每个单独的记录

试着注释这一行:

castedActivity.Id = Guid.NewGuid();

然后输入Update:

service.Update(castedActivity)

你只是更新RegardingObjectId,而不是创建一个新的活动,所以你不应该改变Id,你不应该使用Create