ADempiere: Callout

Un callout es una codificación utilizada para modificar, bajo ciertas condiciones, el contenido que se muestra en un campo de una determinada ventana. El metodo callout puede escribirse en una clase creada en un paquete especifico de nuestra customizacion...
... o desde el diccionario de datos usando el tipo de evento callout y el tipo de regla JSR 223 Scripting APIs. 


La diferencia es que para ver la funcionalidad del método creado desde el ambiente de desarrollo se debe compilar el proyecto.
La invocación del método callout se hace desde la columna de la tabla (Table & Column) desde el campo "Callout". En este campo se pueden llamar tantos métodos calificados como sea necesario, solo deben ir separados por punto y coma (;).

Invocar metodo callout desde clase java

  • <paquetes>.<callout_name>.<metodo>
 Ejemplo real - Invocando un solo metodo:
    • ve.com.lve.model.produccion.CalloutPlanificacion.getCalculaDias;
 Ejemplo real - Invocando multiples metodos:
    • ve.com.lve.model.produccion.CalloutPlanificacion.getEstableceHoras;ve.com.lve.model.produccion.CalloutPlanificacion.rangoFechas

Invocar metodo callout desde diccionario de datos (script)

  •  @script:beanshell:BP_fillDescriptionFromName

Pasos para crear un Callout

  1. Crea la clase dentro de un paquete perteneciente a la customización con la que estas trabajando. Esa clase debe extender de CalloutEngine.
  2. Crea el o los métodos a usar que definirán el comportamiento del campo en la pestaña (ventana). Cada método debe recibir como parámetro lo siguiente:
    • (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value, Object oldValue)
      • mTab y mField: me permiten obtener (get) o establecer (set) el valor de un campo especifico. Para ello usamos la interfaz de la tabla correspondiente a la pestaña donde estamos estableciendo la funcionalidad para el campo. Esa interfaz o clase I_<table> es la que se crea cuando se genera el modelo (Generate Model).
      • Se pueden realizar distintas consultas sql o instanciar distintos objetos para obtener los resultados deseados (todo depende de la lógica del programador). 
      • El método del callout siempre debe retornar null o vacío ("") o NO_ERROR. Si retorna cualquier otro valor el sistema lo tomara como un error.
  3. Una vez finalizada la codificación, loguearse como SuperUser - SystemAdministrator para ir a Table & Column e invocar el método desde el campo que disparara el cambio. Ejemplo: Si quiero mostrar la cantidad por tipo de producto, debo invocar el método callout desde el campo "Tipo de Producto" para que cada vez que cambie el tipo de producto en el campo cantidad me muestre los datos correspondientes al tipo de producto seleccionado.

Script Callout

Desde el diccionario de aplicación se crea el callout desde la ubicación Menu » Diccionario de Aplicación » Regla

Creando la Regla

Dentro del script se usan las variables del contexto del sistema:
  • Para las ventanas comienzan con el prefijo W_ 
  • Para los usuarios (login) comienzan con el prefijo G_
  • Los parámetros del callout comienzan con el prefijo A_
    • A_WindowNo
    • A_Tab
    • A_Field
    • A_Value
    • A_OldValue
    • A_Ctx
Ejemplo:
if (A_Tab.getValue("Name") != null) {
    A_Tab.setValue("Description", A_Tab.getValue("Name"));
}
result = "";
Desde el script también se pueden importar clases de la misma manera que se importan desde una clase java.

Usos del Callout

En lo personal los callout me han servido para:
  • Mostrar resultados de un calculo especifico (porcentajes, sumas, promedios...)
  • Autocompletar datos desde un identificador especifico: Desde el id de un trabajador autocompletó los datos principales (nombre, apellido, cédula, ficha, tipo de nomina...)
  • Mostrar notificaciones o advertencias en cuanto a un registro (Ej. Mostrar que esta llegando al limite de crédito o que supera el limite de crédito. O también mostrar que la cantidad que esta señalando es mayor a las cantidades existentes en almacén...). 
    • Es importante señalar aquí que con el callout se muestra la advertencia pero no impide que el registro sea guardado. Para validar que no se registre un dato dependiendo una condición se deben usar los "Validadores del Modelo" (Model Validator)
En la próxima entrada escribiré sobre el "Model Validator".

Comentarios

Entradas populares de este blog

ADempiere: Configuración Inicial de la Compañía

ADempiere: Diccionario de Aplicación

ADempiere: Codigo Comun