Recently we came across a scenario where we needed to check if a field has changed after super() in update method of a table. Back in the days of AX 2012 you could easily compare original field’s value with current using orig() method before super() and call necessary logic after.
public void update() { boolean myFieldHasChanged = this.MyField != this.orig().MyField; super(); if (myFieldHasChanged) { this.doStuff(); } }
Now we want to do the same using extensions. We can create Pre and Post event handlers, but they are static, so we need a way to pass a value between them.
First option is to use static field, like it’s done in RunBase extension example
First option is to use static field, like it’s done in RunBase extension example
public static class MyTableEventHandler { private static UnknownNoYes myFieldHasChanged; [PreHandlerFor(tableStr(MyTable), tableMethodStr(MyTable, update))] public static void MyTable_Pre_update(XppPrePostArgs _args) { MyTable myTable = _args.getThis() as MyTable; if (myTable.MyField != myTable.orig().MyField) { MyTableEventHandler::myFieldHasChanged = UnknownNoYes::Yes; } else { MyTableEventHandler::myFieldHasChanged = UnknownNoYes::No; } } [PostHandlerFor(tableStr(MyTable), tableMethodStr(MyTable, update))] public static void MyTable_Post_update(XppPrePostArgs _args) { MyTable myTable = _args.getThis() as MyTable; if (MyTableEventHandler::myFieldHasChanged == UnknownNoYes::Yes) { myTable.doStuff(); } MyTableEventHandler::myFieldHasChanged = UnknownNoYes::Unknown; } }
Another option is to use XppPrePostArgs as a vehicle for new parameter. XppPrePostArgs has collection of parameters under the hood, so nothing stops us to add one more and framework will take care of passing it between Pre and Post event handler!
public static class MyTableEventHandler_XppPrePostArgs { const static str myFieldHasChangedArgName = 'myFieldHasChanged'; [PreHandlerFor(tableStr(MyTable), tableMethodStr(MyTable, update))] public static void MyTable_Pre_update(XppPrePostArgs _args) { MyTable myTable = _args.getThis() as MyTable; boolean myFieldHasChanged = myTable.MyField != myTable.orig().MyField; <strong>_args.addArg(MyTableEventHandler_XppPrePostArgs::myFieldHasChangedArgName, myFieldHasChanged);</strong> } [PostHandlerFor(tableStr(MyTable), tableMethodStr(MyTable, update))] public static void MyTable_Post_update(XppPrePostArgs _args) { MyTable myTable = _args.getThis() as MyTable; <strong>boolean myFieldHasChanged = _args.getArg(MyTableEventHandler_XppPrePostArgs::myFieldHasChangedArgName); </strong> if (myFieldHasChanged) { myTable.doStuff(); } }
Actual Post : https://community.dynamics.com/365/financeandoperations/b/ievgensaxblog/archive/2017/07/01/d365o-trick-to-pass-a-value-between-pre-and-post-event-handler-using-xppprepostargs
This comment has been removed by the author.
ReplyDeleteGreat! It sounds good. Thanks for sharing..
ReplyDeletepożyczka przez internet na konto