2013-10-04 128 views
4

我調查新的委託&事件訂閱模式的AX 2012表更新事件處理程序

能力。在我找當一個特定的領域已被修改,以檢測,例如時刻SalesTable.SalesStatus改變到SalesStatus::Invoiced

我已經創建了以下事件處理程序,並且已經創建了SalesTable.Update方法;

public static void SalesTable_UpdatePosteventHandler(XppPrePostArgs _args) 
{ 
    Info("Sales Update Event Handler"); 
} 

現在我知道我可以從_argsSalesTable,但我怎麼能檢測場發生了變化?我真的可以在版本之前使用&,這讓我覺得我在這裏訂閱了錯誤的事件。

+0

可能不是您的答案,但可以使用salesTable.orig()值檢測更改嗎? http://msdn.microsoft.com/en-us/library/xrecord.orig。aspx –

+0

@ian_scho我不認爲它是有效的,因爲我正在尋找更新 – AnthonyBlake

回答

7

如果update方法不更新該字段,則可以在更新方法上使用preevent handler。如果要監視在CustTablePriceGroup場然後創建一個名爲CustTableEventHandler包含此方法類:

public static void preUpdateHandler(XppPrePostArgs _args) 
{ 
    CustTable custTable = _args.getThis(); 
    if (custTable.PriceGroup != custTable.orig().PriceGroup) 
     info(strFmt("Change price group from '%1' to '%2'", custTable.orig().PriceGroup, custTable.PriceGroup)); 
} 

一個post事件處理程序將無法正常工作,因爲orig()將返回更改的記錄。 此外,如果記錄更新使用doUpdate您的處理程序不被調用。

您也可以覆蓋上的aosValidateUpdate,即使使用doUpdate,也會調用aosValidateUpdate。此方法始終在AOS服務器上運行。

public boolean aosValidateUpdate() 
{ 
    boolean ret = super(); 
    if (this.PriceGroup != this.orig().PriceGroup) 
     info(strFmt("Change price group from '%1' to '%2'", this.orig().PriceGroup, this.PriceGroup)); 
    return ret; 
} 

另一種選擇是全局改變Application.eventUpdate方法。 從方法的標題:

作爲由內核時在 表中的記錄進行更新稱爲回調,提供的內核已經建立監測 記錄在該表中。

開發人員可以設置內核插入一條記錄與所有 字段設置爲相關的值,其中包括現場日誌類型設置爲 EventUpdate的DatabaseLog內核表再打上一個給定 表更新。可以設置內核應在每次更新記錄或更新特定字段時回撥 .This 與調用和設置logUpdate的方式非常相似。此方法的電話號碼 將在更新記錄爲 的交易中。

該方法由alert rule通知系統使用。我會建議反對這一點,除非它是一個全球變化(如警報規則)。

預警規則可以延長as described here

+0

很好的答案1月,當我嘗試了一些這些出來 – AnthonyBlake

+0

Jan,你指出我在正確的方向。您可能希望將此添加到您的答案的最後一個藝術中,因爲我使用的是廣泛的htt​​p://msdn.microsoft.com/en-us/library/aa673670.aspx - 同樣,我將讓賞金開放直到它過期以防萬一! – AnthonyBlake