【问题标题】:CRM 2011 Update Plug-in: Which Fields Changed?CRM 2011 更新插件:更改了哪些字段?
【发布时间】:2013-03-16 02:18:57
【问题描述】:

如何在同步插件中确定哪些字段发生了变化?
插件在更新时注册。
JavaScript 中的 isDirty() 之类的东西:

// TODO: Implement your custom Plug-in business logic.
IOrganizationService service = localContext.OrganizationService;
Entity account = (Entity)localContext.PluginExecutionContext.InputParameters["Target"];
if (account.GetAttributeValue<String>("address1_latitude").isDirty())
{
    service.Create(new Lead { FirstName = "LOCATION CHANGED" }); // this is a stub
} 

【问题讨论】:

    标签: dynamics-crm-2011


    【解决方案1】:

    Target 中实际存在的属性是已更改的属性。未更改的属性不会出现在那里。

    【讨论】:

    【解决方案2】:

    我将稍微扩展 GCATNM 的答案。 Target 包含更新请求中包含的所有值,而不仅仅是与数据库中当前存在的值不同的值。

    除非您在表单上执行一些非常“hacky”的 JavaScript,否则从 CRM Web 前端更新/创建的目标实体将始终只包含已更改的值,因为 CRM UI 中的 JavaScript 只会发送已更改的值。

    但是,如果您通过其他方法(OData 调用、使用 SDK 的 C# 更新)更新数据,并且更新请求中包含的值实际上并未更改,它们将显示在插件的目标中.例如,如果您有一个 C# 进程获取特定实体的所有属性,然后更新单个属性,则该实体的所有属性都将显示在目标中。

    所以真正的目标不是改变了什么,而是插件完成后实体将是什么。您需要在原图像中包含要检查更改的属性,以便能够确定值是否确实发生了更改。

    【讨论】:

    • 您的回答非常相关。我正在通过 Resco Mobile CRM 更新 gps 坐标;插件会在 lat 或 long 更改时触发,并证明销售代表在该位置。似乎在这种情况下,所有字段值都将在 localContext.PluginExecutionContext.InputParameters["Target"] 中找到,因此我会将前映像值与 ["Target"] 值进行比较以确定它们是否已更改。
    • 基本上,目标包含发送到服务器的值。不一定“改变”。正是请求中包含的内容(例如更新或创建)
    • 这不是我说的吗?也许我应该修正一些措辞?
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多