ADempiere: Generate Model

Existen varias opciones en ADempiere para darle vida a nuestro modelo diseñado con el Diccionario de Datos. Para esto debemos entrar al mundo maravilloso de la codificacion, con un poco de conocimiento en Java y en la funcionalidad de ADempiere podemos ser capaces de hacer desarrollos y personalizaciones del sistema por nosotros mismos mejorando la herramienta.

En esta entrada escribire acerca de la clase Generate Model, luego ire escribiendo hablando acerca de otras clases de gran importancia como son CalloutEngine, ModelValidator, SvrProcess, entre otras.

Generate Model

Esta clase sirve para extender la funcionalidad de las tablas que creemos en el sistema. Con ella podemos establecer la persistencia de objeto para nuestras tablas con el fin de acceder a sus datos para Crear, Leer, Actualizar y Borrar (CRUD = Create, Read, Update, Delete).
El modelo esta representado por las clases X_<tabla> y las clases I_<tabla>, las cuales estan compuestas por los metodos getter y setter que nos permitiran manejar los datos de la tabla por toda la aplicacion.
Las clases X_<tabla> extienden de PO (Persistent Object) e implementan las clases (interfaces) I_<tabla> correspondiente y la clase I_Persistent

Pasos a seguir:

  1. Desde el entorno de desarrollo (eclipse), ir a la opcion para correr o ejecutar el programa "RUN" y seleccionar la opcion "RUN CONFIGURATIONS"
  2. Crear o actualizar un configuracion para generate model.
    1. Si va a crear la configuracion: 
      • Hacer click en "Nueva configuracion" (New Launch Configuration)
      • Asignarle un nombre identificador
      • Asegurarse que este asociado al proyecto principal o customizacion con la que este trabajando
      • Seleccionar la clase Generate Model (org.adempiere.util.GenerateModel)
      • Ir a la pestaña "Arguments" para indicar los argumentos validos para generar el modelo
          
        1era Linea: Ruta donde estan ubicadas las clases del modelo (directorio destino): Las clases X_<tabla>, y las clases I_<tabla>
        2da Linea: Nombre del paquete donde estan ubicadas las clases del modelo
        3ra Linea: Nombre de la entidad (Entity Type) con que se creo la tabla.
        4ta Linea: Nombre de la tabla para la que se creará el modelo. En caso de estar creando el modelo para varias tablas cuyo nombre del prefijo sea igual se puede escribir el argumento de esta linea así: 'HR_%', de esta manera creará (o actualizará) el modelo para todas las tablas que se han creado con el prefijo HR.

      • Ejecutar la configuración haciendo click en "RUN".
    2. Si va a actualizar una configuración previamente creada
      • Ir a la pestaña "Arguments" para indicar los argumentos validos para generar el modelo
      • Ejecutar la configuración del modelo haciendo click en "RUN"
Esto es lo principal que debemos saber para trabajar con el código de ADempiere.
Cada vez que agregamos un nuevo campo a cualquier tabla y vamos a necesitar manejar los datos mediante un validador, un callout o un proceso se debe generar el modelo para esa tabla que se ha modificado (En este caso actualiza las clases X_, I_ que habíamos creado previamente).
Hay una opción que permite acceder al nuevo campo creado, esto es usando el método genérico haciendo "cast" al tipo de dato que sabes que se esta usando:
(BigDecimal) invoice.get_Value("NombreDeTuColumna");

También se puede colocar un valor usando el siguiente método:
invoice set_ValueOfColumn(columnName, value);
Esto lo recomiendan algunos que prefieren no modificar las clases del base.

Algo que he aprendido es que si necesito trabajar con una clase del base la copio (con paquete exacto y todo) a mi proyecto de customizacion y ahí la trabajo y modifico a gusto. En caso de presentarse algun inconveniente con esa clase entonces se tiene la clase original en el base como backup. Lo importante es no tener miedo a modificar las clases (siempre sabiendo lo que se esta haciendo).
Al principio mencione que con la generación del modelo podemos establecer la Persistencia de Objeto para extender la funcionalidad del sistema.

Persistencia de Objeto

En programación, entendemos por Persistencia de Objeto (PO) a:
"La acción de preservar la información de un objeto de forma permanente, y a su vez poder recuperar la información del mismo para ser utilizada nuevamente en diferentes propósitos"
En ADempiere una vez que hemos generado las clases X_<tabla> podemos crear las clases M<tabla> (las manejadoras o "Clase Manager"), puesto que estas extienden de las clases X_<tabla>.  Estas 'clases M' son clases abstractas que definen métodos como load(), save(), delete(), get_ID(), entre otros, que los podemos invocar desde nuestro código personal donde hayamos instanciado esa clase.
Estas clases manager se usan de dos formas:
  1. Master Data Object Classes: Extienden de la clase X_<tabla> y permiten manejar los datos maestros de una tabla determinada. Ej. MProduct extends X_M_Product
  2. Workflow Business Object: Estas permiten manejar los objetos de negocio usados para manejar los flujos de trabajo de un proceso determinado. Aparte de extender de la clase X_<tabla> implementan la interfaz 'DocAction'. Ej. MInvoice extends X_C_Invoice implements DocAction.
Estas son las clases que nos permiten ir mas allá de la funcionalidad básica de ADempiere. En estas clases podemos definir métodos o funciones que manejaran los datos de una manera especifica en el sistema.

Comentarios

Entradas populares de este blog

ADempiere: Codigo Comun

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

ADempiere: Diccionario de Aplicación