AX7 - Eventos PrePostHandler

Los eventos Pre y Post Handler no son nuevos; es una funcionalidad heredada de la anterior versión que sigue siendo válida para la nueva.

¿Qué son estos eventos?

Son métodos que están relacionados con otros, que se ejecutan automáticamente una vez se ejecuta el método al que hace referencia y pueden ser configurados para que se ejecuten antes o después..

¿Dónde aplica?

En cualquier parte de la aplicación en la que exista un método. La estructura de estos métodos es como sigue:

Si deseamos que el evento se ejecute antes de la ejecución del método al que hace referencia.
 [PreHandlerFor(classStr(MyClass),   methodstr(MyClass, MethodName))]

Si queremos que se ejecute después de la ejecución del método.
 [PostHandlerFor(classStr(MyClass), methodstr(MyClass, MethodName))]

Como veréis se le indica la clase y método al que hace referencia(*).

El método debe ser declarado como public static y recibir por parámetros la clase XppPrePostArgs, la cual tendrá el objecto original.

 [PreHandlerFor(classStr(MyClass), methodstr(MyClass, MethodName))]
 
public static void PreHandler(XppPrePostArgs arguments)
 {

 }



A continuación veremos un ejemplo con un evento PostHander.

Aquí está el código de la clase.

class TestHandlerClass
{
  Name firstName;
  Name lastName;
  Name fullName;
   
  public void setFirstName(Name _firstName)
  {
      firstName = _firstName;
  }
  public void setLastName(Name _lastName)
  {
      lastName = _lastName;
  }
  public void setFullName()
  {
      fullName = firstName + " " + lastName;
  }
}  

Como podemos ver el método PostHandler  es utilizado a la vez por los métodos setFirstName setLastName.
En el método recuperarmos la clase con arguments.getThis() y llamamos al método setFullName de la clase TestHandlerClass.

[PostHandlerFor(classStr(TestHandlerClass), methodstr(TestHandlerClass, setFirstName)),
 PostHandlerFor(classStr(TestHandlerClass), methodstr(TestHandlerClass, setLastName))]
public static void FullNamePostHandler(XppPrePostArgs arguments)
{
    TestHandlerClass testHandlerClass = arguments.getThis();

    testHandlerClass.setFullName();
}


Aquí la clase completa:

class TestHandlerClass
{   
   Name firstName;
   Name lastName;
   Name fullName;

   public void setFirstName(Name _firstName)
   {
      firstName = _firstName;
   }

   public void setLastName(Name _lastName)
   {
      lastName = _lastName;
   }
   
   public void setFullName()
   {
      fullName = firstName + " " + lastName;
   }

   [PostHandlerFor(classStr(TestHandlerClass), methodstr(TestHandlerClass, setFirstName)),
    PostHandlerFor(classStr(TestHandlerClass), methodstr(TestHandlerClass, setLastName))]
   public static void FullNamePostHandler(XppPrePostArgs arguments)
   {
      TestHandlerClass testHandlerClass = arguments.getThis();

      testHandlerClass.setFullName();
   }
}

Aquí tenemos una RunnableClass para probar los eventos.

class RunnableClass1
   /// <summary>
   /// Runs the class with the specified arguments.
   /// </summary>
   /// <param name = "_args">The specified arguments.</param>
   public static void main(Args _args)
   { 
      TestHandlerClass testHandlerClass = new TestHandlerClass();

      testHandlerClass.setFirstName("Jason");
      testHandlerClass.setLastName("Smith");
   }
}


Si la ejecutamos veremos que al llegar al final de cualquiera de los dos métodos


Llamará al evento donde recuperaremos la clase y llamaremos al método setFullName.




En el ejemplo anterior recuperábamos la clase y llamábamos a un método de ésta.
Para este ejemplo recuperaremos el parámetro que se le ha pasado al método y lo haremos así:

arguments.getArg("_firstName");




class TestHandlerClass
{   
   Name firstName;
   Name lastName;
   Name fullName;

   public void setFirstName(Name _firstName)
   {
      firstName = _firstName;
   }
   
   public void setLastName(Name _lastName)
   {
      lastName = _lastName;
   }
   
   public void setfullName(Name _firstName, Name _lastName)
   {
      fullName = _firstName + " " + _lastName;
   }
   public name getfullName()
   {
      return fullName;
   }

   [PostHandlerFor(classStr(TestHandlerClass), methodstr(TestHandlerClass, setFirstName))]
   public static void FirstNamePostHandler(XppPrePostArgs arguments)
   {
       TestHandlerClass testHandlerClass = arguments.getThis();

       Name             name             = arguments.getArg("_firstName");

       testHandlerClass.setfullName(name, testHandlerClass.lastName);
   }
 
     

[PostHandlerFor(classStr(TestHandlerClass), methodstr(TestHandlerClass, setLastName))]
   public static void LastNamePostHandler(XppPrePostArgs arguments)
   {
       TestHandlerClass testHandlerClass = arguments.getThis();

       Name             name             = arguments.getArg("_lastName");

       testHandlerClass.setfullName(testHandlerClass.firstName, name);
   }
}

y la RunnableClass

class RunnableClass1
     /// <summary>
     /// Runs the class with the specified arguments.
     /// </summary>
     /// <param name = "_args">The specified arguments.</param>
  public static void main(Args _args)
     { 
         TestHandlerClass testHandlerClass = new TestHandlerClass();

         testHandlerClass.setFirstName("Jason");
         testHandlerClass.setLastName("Smith");
         
         info(testHandlerClass.getfullName());
     }
}

   

Al ejecutarla veremos como recuperamos el valor que se le ha pasado por parámetros al método.





Por último quería comentar que también se puede recuperar el valor devuelto por un método con  arguments.getReturnValue().

Aquí tenéis el código para hacer pruebas.

public name setFirstName(Name _firstName)
{
    firstName = _firstName;


    return firstName;
}

[PostHandlerFor(classStr(TestHandlerClass), methodstr(TestHandlerClass, setFirstName))]
public static void FirstNamePostHandler(XppPrePostArgs arguments)
{
    Name name = arguments.getReturnValue();
}

En este caso recuperaríamos en el evento PostHandler lo que retornará el método setFirstName.

(*)En este caso será una clase pero podría ser una tabla.

Comentarios