2013-03-26 81 views
6

如何在同步插件中确定哪些字段已更改?
插件在更新时注册。
喜欢的东西的isDirty()在JavaScript:CRM 2011更新插件:更改了哪些字段?

// 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 
} 

回答

13

实际存在目标中的属性是已经改变的那些。未更改的属性不会显示在那里。

+0

如何访问未更改的属性? – Bvrce 2013-03-26 10:51:12

+8

使用预映像或后映像(http://msdn.microsoft.com/en-us/library/gg309673.aspx#bkmk_preandpost) – 2013-03-26 11:19:05

+0

我打算使用IOrganization.Retrieve,因为Id可用,但是您的方式看起来更有效率。 – Bvrce 2013-03-26 11:28:24

11

我将稍微扩大GCATNM的答案。目标包含所有将更新的值,而不一定是所有已更改的值。

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

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

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

+0

您的回答非常相关。我通过Resco Mobile CRM更新gps co-ords;插件会在经过或长时间更换时触发,并证明销售代表处在该位置。看起来在这种情况下,所有的字段值将在localContext.PluginExecutionContext.InputParameters [“Target”]中找到,所以我会比较前映像值和[“Target”]值以确定它们是否已经改变。 – Bvrce 2013-03-26 13:40:01

+0

+1使用前映像:) – glosrob 2013-03-26 14:37:23