在 AX7 的扩展中编写事件处理程序

Writing event handlers in extensions in AX7

我从事 Dynamics AX7 表单开发工作。我必须在按钮的 'Clicked' 方法中编写代码,但 'Clicked' 方法中已经有一些 'Sys Layer' 代码。我必须对其应用一些条件。但我不想做 'over-layering',我必须用扩展来做,但是如果我在 onClicked 事件中编写代码,问题是,我的代码在系统层代码之前或之后运行,但我需要对该系统层代码应用一些条件。

我的问题是,我们可以使用扩展事件处理程序实现此逻辑吗?我已经通过叠加完成了,但我需要通过扩展来完成。那么是否可以使用扩展来做到这一点?

下面添加了代码。

void clicked()
{      
       super();

       // My logic will be written here

       if(result == true) //This is my code, based on above logic I applied this check
       {
           // start of sys layer code
           remainSalesPhysical.realValue(0);
           remainInventPhysical.realValue(0);
           if (formCtrl)
           {
               formCtrl.cancelLine();
           }
           element.closeOk();
           // end of sys layer code    
       }                                      //this is my code
       else                                   //this is my code
       {                                      //this is my code
           error("Some error message");       //this is my code
       }                                      //this is my code
}

是也不是。如果它只是一个 button 那么 super() 并没有真正做任何事情,所以你可以做一个 pre 事件处理程序。

如果它是 menu item button,其中 super() 调用 class,那么您将对 class 执行 post 事件处理程序,而不是按钮,这样您的逻辑就会在 super() 调用后立即运行。

并且在您的 class 中,您可以执行类似 formRun = _xppPrePostArgs.getThis() 的操作,然后执行 if (formRun.name() == formStr(SalesTable)) 或任何数量的操作(如果 class 具有多个入口点。

我已经搜索过了,到目前为止我得出的结论是,如果不叠加,我们不能 100% 做到这一点。我们有 Pre 和 Post 事件,但这些无法解决上述问题,将来我们可能会有一些更具体的方法来做到这一点,但现在我们有三个选择。

  1. 像我们在 AX 2012 中那样进行叠加(不推荐)
  2. 与委托一起做(即使是委托,我们也只能做一些重叠,但这是推荐的方式)
  3. 您也可以隐藏该按钮并将其替换为您自己的按钮,但它仅适用于表单控件,我们不能对方法执行此操作,因为您无法避免调用它们。

我使用委托解决了我的问题。 这是我发现的有用 link,它很有帮助。

https://ievgensaxblog.wordpress.com/2016/05/01/ax-7-how-to-override-form-data-source-field-methods-without-overlaying/