2013-10-04 4 views
4

Я расследую возможности нового делегата & подписки на события шаблона в AX 2012.Таблица Обновление обработчика события

На данный момент я ищу, чтобы определить, когда определенное поле было изменено, например, при изменении SalesTable.SalesStatus до SalesStatus::Invoiced.

Я создал следующий обработчик post-event и привязан к методу SalesTable.Update;

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

Теперь я знаю, что могу получить SalesTable от _args, но как я могу обнаружить поле изменилось? Я мог бы использовать до & после версии, что заставляет меня думать, что я подписываюсь на неправильное событие здесь.

+0

Возможно, это не ваш ответ, но вы можете обнаружить изменения, используя значения salesTable.orig()? http://msdn.microsoft.com/en-us/library/xrecord.orig.aspx –

+0

@ian_scho Я не думаю, что это работает, потому что я забочусь об обновлении – AnthonyBlake

ответ

7

Если метод update не обновляет данное поле, вы можете использовать метод обновления preevent handler. Если вы хотите контролировать 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, ваш обработчик не вызывается.

Вы также можете переопределить aosValidateUpdate на CustTable, который вызывается, даже если используется doUpdate. Этот метод всегда запускается на сервере 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. Из заголовка метода:

служит в качестве обратного вызова, которая вызывается ядром при записи в таблице обновляется, при условии, что ядро ​​было создано для контроля записей в этой таблице.

Разработчик может создать ядро ​​перезвонить об обновлениях для данного таблицы путем вставки записи в таблицу ядра DatabaseLog со всеми полей, установленных для соответствующих значений, который включает в LOGTYPE поле установлено значение EventUpdate. Можно настроить, что ядро ​​должно перезванивать всякий раз, когда запись обновляется или когда определенное поле обновляется. Это очень похоже на то, как вызывается и настраивается logUpdate. Вызов этого метода будет в транзакции, в которой будет обновлена ​​запись .

Этот метод используется системой уведомлений alert rule. Я бы рекомендовал против этого, если это не глобальное изменение (например, правила предупреждения).

Правила предупреждения могут быть продлены as described here.

+0

хороший ответ Ян, я вернусь к вам, когда я попробовал несколько из них – AnthonyBlake

+0

Ян, вы указали мне в правильном направлении. Вы можете добавить это к последнему искусству своего ответа, поскольку я использую широко http://msdn.microsoft.com/en-us/library/aa673670.aspx - также, я оставлю щедрость открытой до истечения срока ее действия на всякий случай! – AnthonyBlake

Смежные вопросы