lunes, 16 de abril de 2012

Autómatas con Genexus Ev1 en Linux y Windows, y I


Hoy empezaré una serie de cuatro publicaciones en las que trataré de dar un vistazo a como programar un autómata en Genexus Ev1, ejecutarlo periódicamente en Linux y Windows, enviar logs y/o reportes resultantes por mail.

Esta técnica la habíamos utilizado en producción en una de las empresas donde trabajé como desarrollador para ejecutar unos procesos de verificación de integridad de datos.

En esta primera entrega abordaremos la creación del autómata con Genexus Evolution 1 y el generador Java para Windows, aunque en realidad se podría programar con cualquier lenguaje que pueda arrojarnos un PDF con el nombre y en el directorio que especifiquemos. 

En la segunda entrega nos ocuparemos de hacerlo correr periódicamente bajo Linux utilizando nada mas que las aplicaciones GNU estándar que vienen con las mayoría de las distribuciones. 

En la tercera entrega haremos lo mismo pero bajo Windows, utilizando algunas aplicaciones de terceros para lograr el mismo efecto que en Linux. 

En la cuarta y última entrega modificaremos el script para Linux para utilizar las mismas aplicaciones que utilizamos en Windows, como un ejercicio de adaptación de una plataforma a otra.

Requerimientos del autómata

Necesitamos crear un programa sin interfaz de usuario, que reciba parámetros desde la linea de comandos, cree archivos en un directorio pasado por parámetro, su salida vaya como texto a la salida estándar del SO.

El acceso a bases de datos u otros procedimientos dependerá en cada caso que queramos implementar esta técnica, por lo que son opcionales como requerimiento. 

Manos a la obra

Procedimiento principal

Como primer paso debemos crear una KB en Genexus. A los efectos de este proyecto debemos elegir Java Environment en Prototyping Environment y en target elegimos Win, el resto de los detalles no son relevantes pero para seguir el ejemplo sería recomendable nombrar a la kb chequeodesatendido.


Ahora creamos un procedimiento llamado chequeodesatendido, este será el procedimiento principal de nuestro autómata. En sus propiedades cambiamos Main program a True y Call protocol a Command line.


Agregamos algo de código:

Rules
parm(in:&date_ini, in:&date_end, in:&filename);

Source

if &date_ini.IsEmpty() or &date_end.IsEmpty() or &filename.IsEmpty() 
  msg("Faltan parametros.")
  msg("Se debe proveer fecha inicial, fecha final y nombre del archivo de salida")
endif

msg("date ini: " + &date_ini.ToFormattedString() + 
  " | date_end: " + &date_end.ToFormattedString() + 
  " | filename: " + &filename
)

reporte.call(&date_ini, &date_end, &filename)

Como puede verse el código es bastante simple, solo a modo de ejemplo. La salida de msg va a la consola, la que bajo Linux puede redirigirse fácilmente hacia un archivo, bajo Windows no encuentro aún la forma de hacer lo mismo.

Aquí es donde debemos ejecutar o llamar al código que realice alguna verificación, corrección, cierre, etc. sobre nuestros datos.

Reporte

Creamos un procedimiento llamado reporte y modificamos sus propiedades. Por casualidad las propiedades coinciden con el procedimiento anterior,  ponemos Main program a True Call protocol Command line. 

Rules
parm(in:&date_ini, in:&date_end, in:&filename);
output_file(&filename, 'PDF');

Source
print printBlock1
return

Layout
Para nuestro ejemplo sencillamente creamos una banda llamada printBlock1 y agregamos las variables que recibimos como parámetro, pero es aquí donde debe generarse el reporte que va a enviar como resultado de la ejecución del autómata.


Ahora definimos a chequeodesatendido como el Startup object y construimos el proyecto.

Lo desplegamos

La forma mas fácil de empaquetar los archivos necesarios para ejecutar nuestro proyecto es haciendo un "deploy", así que ejecutamos el Deployment Wizard


En la primera pantalla nos apareceran nuestros dos procedimientos en la lista Available mains, los pasamos a la derecha a Mains to deploy. 


Pasamos a la segunda pantalla y no tocamos nada ahí, solo le damos siguiente (next) para llegar a la tercera pantalla. Una vez ahí chequeamos el cuadro Transfer location files luego ingresamos un directorio donde el wizard colocará los archivos, por último le damos Finish.

Ahora se abrirá la pantalla del Genexus Web Start Deployment, cambiamos VM: a Sun, especificamos un nombre en Application name:, yo usé de vuelta chequeodesatendido, y por último le damos a Build Archives.


Ahora, si todo fue bien, deberíamos de tener todos los archivos necesarios para correr nuestro programa en el directorio que especificamos en la tercera ventana del Genexus Deployment Wizard. Deberíamos de tener una carpeta Shared y otra con el nombre que especificamos en Application name: en el Genexus Web Start Deployment. Creamos la carpeta reportes, que es donde le pediremos a nuestro autómata que envíe sus reportes.


Últimas acciones

A partir de aquí teóricamente estamos en condiciones de probar nuestro autómata, pero todavía quedan un par de detalles que el wizard no cubrió, ni idea del porqué. Por algún motivo el wizard no copia el paquete iText.jar que es necesario para el reporte, por lo que debemos copiarlo manualmente de nuestra KB, de la carpeta JavaModel a la carpeta Shared de nuestro deployment.

Bajo Windows 7, supongo que debería de ser lo mismo con Vista, al ejecutar el programa por primera vez intentará copiar el archivo winjutil.dll a la carpeta bin del JRE, pero fallará por cuestión de permisos. Hay dos formas de solucionar este inconveniente, el primero es ejecutar una vez nuestro proyecto como Administrador, la otra es copiar el archivo desde la carpeta JavaModel de nuestra KB a la carpeta bin del JRE.


Probando nuestro autómata

Creamos un archivo test.cmd y le agregamos el siguiente código:

@echo off

rem reemplazamos los backslach "/" de la fecha por el signo menos "-"
for /f "tokens=1-3 delims=/" %%a in ("%date%") do set FECHA=%%a-%%b-%%c
set ARCHIVO_SALIDA=cr_%FECHA%
set DIRECTORIO_SALIDA=%CD%\reportes
set GXCLASSPATH="shared/.;shared/gxclassp.jar;shared/iText.jar;chequeodesatendido/chequeodesatendido_GXWS.jar"

java -cp %GXCLASSPATH% achequeodesatendido "%FECHA%" "%FECHA%" "%DIRECTORIO_SALIDA%\%ARCHIVO_SALIDA%"


Ejecutamos el archivo test.cmd, luego deberíamos tener un archivo PDF en la carpeta reportes.

Eso es todo para la primera entrega.


Autómatas con Genexus Ev1 en Linux y Windows, y II

1 comentario:

Unknown dijo...

Una consulta, si estoy trabajando en entorno web, como hago para que se genere el procedimiento como ejecutable (.JAR) porque he seguido tus pasos pero me permite generar .War y eso no quiero, estoy trabajando con Java y MySql, entorno Web.
Gracias

Walter Alburqueque C.