如何填充相关的查找字段CRM 2011

时间:2013-05-16 05:20:28

标签: c# plugins dynamics-crm-2011 lookup entityreference

我想创建一个审核插件,每当更改“联系人”实体时,会创建一个“历史联系人”实体,该实体在更改之前拥有旧“联系人”实体的所有数据。

我的问题是,如果我在“帐户”的“联系人”中有一个查找字段,我该如何查找特定的“帐户”并将其放在“历史联系人”实体的查询字段中?< / p>


我完成了插件,但现在出现了一个新问题。

“联系人”实体的“名字”字段中可以有一个空白。

“历史联系”实体将“名字”作为其主要字段,但不是必需的。

如果在创建“历史联系人”实体时没有“名字”,则会抛出错误。我不知道为什么会这样。

即使字段标记为“无约束”,我是否还需要主字段来创建实体?

2 个答案:

答案 0 :(得分:0)

我不确定我会效仿。当某些内容发生变化时,您是否正在创建联系人的完整副本?使用“更新后执行”消息上的“预映像”可以非常简单地执行此操作。预映像是更新前联系人的快照。

但为什么不使用提供的审核功能?

答案 1 :(得分:0)

您有两种选择:

1)按照以下方式创建一个插件:

public void Execute(IServiceProvider serviceProvider)
{
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    var service = ((IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))).CreateOrganizationService(context.UserId);

    var originalContact = context.InputParameters["Target"] as Entity;
    var newContact = new Entity("new_historicalcontact");
    if (originalContact.Contains("firstname"))
    {
        newContact.Add("new_firstname", orginalContact["firstname"]);
    }
    if (originalContact.Contains("emailaddress1"))
    {
        newContact.Add("new_emailaddress1", orginalContact["emailaddress1"]);
    }
    if (originalContact.Contains("parentcustomerid"))
    {
        newContact.Add("new_parentcustomerid", orginalContact["parentcustomerid"]);
    }

    //etc etc for other properties
    service.Create(newContact);
}

如果你不熟悉插件,那里有很多教程,你可以从我在this question中提出的推荐开始

2)使用开箱即用的审核功能。可能或可能不是您要找的内容,但您可以详细了解herehere