Dynamics crm 自动将联系人映射到帐户

Dynamics crm 自动将联系人映射到帐户,dynamics-crm,Dynamics Crm,我想向帐户添加一个字段,显示该帐户的电子邮件域,例如@BT.com。然后,我有一个电子表格,其中列出了所有帐户及其电子邮件域。我想做的是,当一个新联系人添加到Dynamics时,它会检查同一电子邮件域的电子表格(显然电子邮件中没有联系人名称),然后将联系人分配到链接到该域的帐户。你知道我会怎么做吗。谢谢开发CRM插件可能是最好的机会。在创建或更新联系人后(所谓的事件后阶段),注册要在启用时调用的插件。并在插件中更新联系人实体的parentaccountid属性,以指向您选择的帐户 在代码方面,它

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

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

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

//IPluginExecutionContext上下文=null;
//IOOrganizationService organizationService=null;
var contact=(实体)context.InputParameters[“Target”];
var email=organizationService.Retrieve(“contact”、contact.Id、新列集(“emailaddress1”)).GetAttributeValue(“emailaddress1”);
字符串主机;
尝试
{
var地址=新邮件地址(电子邮件);
host=address.host;
}
抓住
{
返回;
}
var查询=新查询表达式(“账户”);
query.TopCount=1;
//或者无论帐户上的电子邮件域字段的名称是什么
query.Criteria.AddCondition(“emailaddress1”,ConditionOperator.Contains,“@”+主机);
var entities=organizationService.RetrieveMultiple(查询).entities;
如果(entities.Count!=0)
{
联系人[“parentaccountid”]=实体[0]。ToEntityReference();
}
组织服务。更新(联系);

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

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

//IPluginExecutionContext上下文=null;
//IOOrganizationService organizationService=null;
var contact=(实体)context.InputParameters[“Target”];
var email=organizationService.Retrieve(“contact”、contact.Id、新列集(“emailaddress1”)).GetAttributeValue(“emailaddress1”);
字符串主机;
尝试
{
var地址=新邮件地址(电子邮件);
host=address.host;
}
抓住
{
返回;
}
var查询=新查询表达式(“账户”);
query.TopCount=1;
//或者无论帐户上的电子邮件域字段的名称是什么
query.Criteria.AddCondition(“emailaddress1”,ConditionOperator.Contains,“@”+主机);
var entities=organizationService.RetrieveMultiple(查询).entities;
如果(entities.Count!=0)
{
联系人[“parentaccountid”]=实体[0]。ToEntityReference();
}
组织服务。更新(联系);

我把昂德雷的代码清理了一下,重新考虑了手术前的因素。我还更新了逻辑以仅匹配活动帐户记录,并将查询移动到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
}

我把昂德雷的代码清理了一下,重新考虑了手术前的因素。我还更新了逻辑以仅匹配活动帐户记录,并将查询移动到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
}

如果dynamics在线,您应该尝试Flow如果dynamics在线,您应该尝试Flow您可以在操作前进行此类检查,避免进行检索以获取电子邮件地址(因为它已经在目标中),并避免对联系人本身进行更新。我不知道MailAddress是否能在沙盒插件中工作,但一个正则表达式就足够了。有趣的语法.Entities在RetrieveMultiple之后,99%的时间仅使用Entities属性作为EntityCollection,这简化了对结果的访问(作为Count属性),它还允许您执行以下有趣的操作:Account[]Companys=\u pluginWrapper.Service.RetrieveMultiple(query).Entities.Select(o=>o.ToEntity()).ToArray();您可以在操作前进行此类检查,避免进行检索以获取电子邮件地址(因为它已经在目标中),并避免对联系人本身进行更新。我不知道MailAddress是否能在沙盒插件中工作,但一个正则表达式就足够了。有趣的语法.Entities在RetrieveMultiple之后,99%的时间仅使用Entities属性作为EntityCollection,这简化了对结果的访问(作为Count属性),它还允许您执行以下有趣的操作:Account[]Companys=\u pluginWrapper.Service.RetrieveMultiple(query).Entities.Select(o=>o.ToEntity()).ToArray();