5

AX 2012 の新しいデリゲート & イベント サブスクリプション パターンの機能を調査しています。

現時点では、特定のフィールドがいつ変更されたか、たとえば がいつSalesTable.SalesStatus変更されたかを検出しようとしていSalesStatus::Invoicedます。

次のポストイベント ハンドラーを作成し、SalesTable.Update メソッドにアタッチしました。

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

SalesTableからを取得できることはわかりました_args、フィールドが変更されたことをどのように検出できますか? 私は本当に前と後のバージョンを使用することができたので、ここで間違ったイベントをサブスクライブしていると思います。

4

1 に答える 1

9

updateメソッドがフィールドを更新しない場合は、update メソッドでpre イベント ハンドラーを使用できます。PriceGroupテーブルのフィールドを監視する場合は、次のメソッドを含むCustTableクラスを作成します。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、ハンドラは呼び出されません。

が使用されている場合でも呼び出されるaosValidateUpdateonをオーバーライドすることもできます。このメソッドは、常に AOS サーバーで実行されます。CustTabledoUpdate

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 に設定されたフィールド logType を含む、すべてのフィールドが関連する値に設定されたレコードを DatabaseLog カーネル テーブルに挿入することにより、特定のテーブルの更新時にコールバックするようにカーネルを設定できます。レコードが更新されたとき、または特定のフィールドが更新されたときにカーネルがコールバックするように設定することができます。これは、logUpdate が呼び出されて設定される方法と非常によく似ています。このメソッドの呼び出しは、レコードが更新されるトランザクションで行われます。

このメソッドは、アラート ルール通知システムで使用されます。グローバルな変更 (アラート ルールなど) でない限り、これはお勧めしません。

アラート ルールは、ここで説明されているように拡張できます。

于 2013-10-07T12:17:28.373 に答える