2013-03-26 77 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