自动将联系人映射到客户

时间:2019-05-23 08:17:05

标签: dynamics-crm

我想向“帐户”添加一个字段,以显示该帐户的电子邮件域,例如@ BT.com。然后,我有了一个电子表格,其中列出了所有帐户及其电子邮件域。我想做的是将新的联系人添加到Dynamics中时,它会检查电子表格中是否有相同的电子邮件域(显然电子邮件中没有联系人名称),然后将联系人分配给链接到该域的帐户。知道我该怎么做。谢谢

2 个答案:

答案 0 :(得分:0)

可能最好的机会是开发CRM插件。注册您的插件,以便在创建或更新联系人后调用该插件(所谓的事件后阶段)。然后在您的插件中更新联系人实体的parentaccountid属性以指向您选择的帐户。

在代码方面,它类似于(免责声明:未经测试):

// IPluginExecutionContext context = null;
// IOrganizationService organizationService = null;

var contact = (Entity)context.InputParameters["Target"];
var email = organizationService.Retrieve("contact", contact.Id, new ColumnSet("emailaddress1")).GetAttributeValue<string>("emailaddress1");
string host;
try
{
  var address = new MailAddress(email);
  host = address.Host;
}
catch
{
  return;
}

var query = new QueryExpression("account");
query.TopCount = 1;
// or whatever the name of email domain field on account is
query.Criteria.AddCondition("emailaddress1", ConditionOperator.Contains, "@" + host);
var entities = organizationService.RetrieveMultiple(query).Entities;
if (entities.Count != 0)
{
  contact["parentaccountid"] = entities[0].ToEntityReference();
}

organizationService.Update(contact);

答案 1 :(得分:0)

我接受了Ondrej的代码,并对其进行了一些清理,将其重构以进行预操作。我还更新了逻辑以仅匹配活动帐户记录,并将查询移至try / catch内。我不熟悉MailAddress对象,我个人只是使​​用字符串映射逻辑。

var target = (Entity)context.InputParameters["Target"];

try
{
    string host = new MailAddress(target.emailaddress1).Host;

    var query = new QueryExpression("account");
    query.TopCount = 1;
    // or whatever the name of email domain field on account is
    query.Criteria.AddCondition("emailaddress1", ConditionOperator.Contains, "@" + host);
    query.Criteria.AddCondition("statecode", ConditionOperator.Equals, 0); //Active records only
    var entities = organizationService.RetrieveMultiple(query).Entities;
    if (entities.Count != 0)
    {
        target["parentaccountid"] = entities[0].ToEntityReference();
    }
}
catch
{
  //Log error
}