【问题标题】:CRM 2011 Removing Activity Party from the Email CC ListCRM 2011 从电子邮件抄送列表中删除活动方
【发布时间】:2017-06-06 10:53:56
【问题描述】:

如何通过插件从 CRM 2011 中的电子邮件抄送字段中删除活动方?

到目前为止我已经完成了,但我被困在了这个之外。我的问题是电子邮件路由器在抄送字段中使用相同的电子邮件地址复制联系人。我们建议对联系人进行重复数据删除是最佳解决方案,但该解决方案尚未被接受。因此,目前,我们需要能够从电子邮件抄送字段中删除活动方,并将其替换为未解析的电子邮件地址。

有什么想法吗?

Email email = crmService.Retrieve(Email.EntityLogicalName, emailId, new Microsoft.Xrm.Sdk.Query.ColumnSet(true)).ToEntity<Email>(); //Do not use ColumnSet(true)
List<ActivityParty> ccPartyList = email.Cc.ToList<ActivityParty>();
List<string> ccEmailAddresses = new List<string>();

foreach (ActivityParty ap in ccPartyList)
{
    ccEmailAddresses.Add(ap.AddressUsed);
}

List<string> dedupedCCEmailAddresses = ccEmailAddresses.Distinct().ToList();
List<string> emailAddressToBeRemoved = new List<string>();


//Check for each unique email addresses, how many records are there
foreach (string emailAddress in dedupedCCEmailAddresses)
{
    int count = ccPartyList.Count(ap => ap.AddressUsed.Equals(emailAddress, StringComparison.InvariantCultureIgnoreCase));
    if (count > 1) //Same email address; Multiple Records
    {
       emailAddressToBeRemoved.Add(emailAddress);
    }
}

//Remove ALL Activity Party from the List
foreach (string emailAddress in emailAddressToBeRemoved)
{
    ccPartyList.RemoveAll(ap => ap.AddressUsed.Equals(emailAddress, StringComparison.InvariantCultureIgnoreCase));
    ActivityParty unResolvedEmailAddress = new ActivityParty();
    unResolvedEmailAddress.AddressUsed = emailAddress;
    ccPartyList.Add(unResolvedEmailAddress);
}

Email emailToUpdate = new Email();
emailToUpdate.Id = emailId;
emailToUpdate.Cc = ccPartyList;
crmService.Update(emailToUpdate);

我现在使用以下代码对其进行了更新,其中我删除了所有 CC 方。

if (localContext == null)
{
    throw new ArgumentNullException("localContext");
}

IPluginExecutionContext context = localContext.PluginExecutionContext;
IOrganizationService service = localContext.OrganizationService;
tracingService = localContext.TracingService;

Email emailFromTarget = (context.InputParameters.Contains("Target")
                        && context.InputParameters["Target"] is Entity)
                        ? 
((Entity)context.InputParameters["Target"]).ToEntity<Email>() : null;

Entity email = service.Retrieve(Email.EntityLogicalName, emailFromTarget.Id, new ColumnSet("cc"));

EntityCollection cc = email.GetAttributeValue<EntityCollection>("cc");
if (cc != null)
{
    cc.Entities.ToList().ForEach(party =>
    {
        cc.Entities.Remove(party);
    });
}

email["cc"] = cc;
service.Update(email);

即使如此,CC 字段也会继续保留数据发布创建。

我在 Post Create Plugin 中执行此操作。这样是不是不删除它们?我必须将其作为工作流/CWA 进行吗?

【问题讨论】:

  • 为什么发布创建?有没有试过预操作?
  • @ArunVinoth 是的,我确实是在操作前完成的。稍后我会发布完整的代码。
  • @ArunVinoth 你能把这个写成答案,这样我就可以把它标记为接受了吗?

标签: c# plugins dynamics-crm dynamics-crm-2011 microsoft-dynamics


【解决方案1】:

不是在操作后,而是在创建插件的操作前注册它并从目标实体中删除重复的 CC 派对列表。这将起作用。

【讨论】:

    【解决方案2】:

    您建议的代码有什么问题?

    // Get your cc field
    var cc = email.GetAttributeValue<EntityCollection>("cc");
    
    // Iterate through the collection. If there's a partyId, it's a party list, so remove it
    cc.Entities.ToList().ForEach(entity =>
    {
        var partyId = entity.GetAttributeValue<EntityReference>("partyid");
        if (partyId != null)
            cc.Entities.Remove(entity);
    }
    
    // Update your email
    email["cc"] = cc;
    service.Update(email);
    

    【讨论】:

    • 我现在用完整的代码示例更新了这个问题。从插件尝试时,上述逻辑不起作用,但在控制台应用程序中可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2013-07-23
    • 2016-01-12
    • 1970-01-01
    • 2013-07-02
    • 2013-06-08
    相关资源
    最近更新 更多