Professional Documents
Culture Documents
com
Algunas veces debemos reemplazar programas que ya están en producción y que fueron
compilados bajo ciertas condiciones por una persona que ya se ha ido de la empresa o por algún
analista que aunque sigue en la institución no recuerda las especificaciones de compilación y no
están documentadas en ningún lado. En programas de recepción y envío de data, en ocasiones
es imperativo compilar con Ignore decimal data error = *yes.
¿Cómo saber si el programa que estoy cambiando fue compilado con este
parámetro = *yes?.
Para dar respuesta a esta pregunta, se redacto el presente documento.
Utility para determinar si un programa RPG fue compilado con Ignore Data Decimal error = *yes.
La estrategia consiste en ejecutar el programa haciendo que falle y responder con ‘D’ (dump) al
mensaje de error. En el spool de salida buscamos la cadena de caracteres: ZIGNDECD a
continuación de este palabra clave, puedes ver un ‘0’ o u ‘1’. Si aparece un ‘1’, significa que el
programa fue compilado con ignore data decimal = *yes.
Se puede realizar un programa que en forma automática haga el recorrido por una tabla
contentiva de la lista de programas y librerías en RPG sobre la cual deseamos determinar si el RPG
en proceso fue compilado con Ignore Data Decimal Error.
Autor: Ing. Liliana Suárez
http://iseriesvenezuela.blogspot.com
http://iseriesvenezuela.blogspot.com
Construimos en primer lugar un archivo de entrada que tienes dos campos: Librería objeto y
Programa. En este archivo puede estar especificado uno o varios programas. Llamaremos a este
archivo: PROGRAMA
Necesitamos también un archivo de salida que tenga los campos: Librería Objeto, Nombre del
programa, Flag de Ignore (alfabético 1). Llamaremos a este archivo: SALIDA.
Un tercer archivo para copiar el spool generado por la respuesta ‘D’ (DUMP) al mensaje de error
que emite el programa rpg. Este archivo lo llamaremos PRINT. Debe ser creado con un crtpf sin
DDS asociado y un largo de 198 de longitud.
El programa CLP, lee el archivo PROGRAMA donde están especificados los programas y sus
librerías y hace un CALL al programa que está leyendo en ese momento. Para asegurarnos de que
el programa va a fallar, hacemos un CHGLIBL al comenzar el CLP y así establecemos que la lista de
librerías tenga una sola librería DUMMY que no contenga ningún archivo.
Al hacer un CALL del programa RPG en el programa CLP, se genera un error CPF4101 entre otros,
que debe ser monitoreado. Este error CPF4101 dice: “no se encontró el archivo X de la biblioteca
Y”. Sabíamos que esto iba a pasar.
Si tenemos una lista extensa de programas, responder manualmente al mensaje de error con una
‘D’ para generar el spool del DUMP es poco práctico. Podemos entonces activar un comando
antes de ejecutar el programa CLP para que el sistema emita una respuesta automática del
mensaje sin la intervención nuestra o de un operador.
A nivel de línea de comando antes de ejecutar el programa utilizamos dos comandos: WRKRPYLE
(trabajar con lista de entrada de respuestas ) y ADDRPYLE (añadir respuesta a la lista de entrada
de respuestas).
http://iseriesvenezuela.blogspot.com
http://iseriesvenezuela.blogspot.com
Figura 1.
Vemos por ejemplo, que el mensaje: CPA0700 tiene una respuesta ‘D’ es decir cuando una
aplicación en RPG falle, el sistema no le va a preguntar al usuario o al operador la respuesta sino
que genera en forma automática un DUMP de las variables y del programa que falló. Podemos ver
también que quedan secuencias libres. ( 11, 12, 13,..19, 21.. etc). Esta es la numeración
consecutiva que el sistema tiene registrado para cada respuesta. Para el mensaje CPF4101, ya
habíamos incluido una respuesta automática. Para este proceso en particular nos interesa generar
esa respuesta automática, sin embargo debes tener presente, que cualquier otro proceso que se
ejecute en este equipo emitirá una ‘D’ en forma automática. Quizás convenga realizar un
RMVRPYLE al terminar de ejecutar esta utility para remover la respuesta automática que hemos
creado para el mensaje CPF4101 porque posiblemente a los otros procesos que se ejecutan en
este equipo no les convenga esta respuesta automática.
Autor: Ing. Liliana Suárez
http://iseriesvenezuela.blogspot.com
http://iseriesvenezuela.blogspot.com
Figura 2.
El número de secuencia es el que queramos colocar: 11,12.. etc. En este caso elegimos 9997,
porque estaba disponible, no había ninguna respuesta ocupando esa secuencia.
La información relativa a comparar datos, no nos interesa para nuestra utilidad. Esta sección del
comando permite comparar un substring del mensaje de error (a partir de la posición inicial que
especifiquemos) con el texto del mensaje que coloquemos allí. Esto puede usarse para cuando un
programa específico da error. El mensaje de error generalmente dice algo como: El programa
XXXX en la línea YYY….”, Si colocamos en los datos de comparación el nombre del programa
entonces cada vez que el mensaje de error corresponda a la ejecución del programa XXXX se
responderá en forma automática, sino el operador tendrá que tomar acción.
Una Vez especificada la respuesta automática, construimos el programa CLP que se encargará de
realizar una llamada fallida a cada programa especificado en el archivo PROGRAMA. Se monitorea
el error y dentro de este comando de monitoreo, automáticamente se genera el spool. En este
http://iseriesvenezuela.blogspot.com
http://iseriesvenezuela.blogspot.com
punto hacemos un cpysplf como podemos ver en el código fuente del CLP y copiamos la
información del DUMP en el archivo PRINT. Este archivo PRINT es la entrada de un programa RPG
que se encargará de realizar un SCAN en cada registro del archivo PRINT para buscar la serie:
ZIGNDECD. En la posición 34 del registro que contiene esta serie de caracteres, está el ‘0’ o el ‘1’
que nos indica si fue o no compilado con Ignore data decimal error = *yes. El programa RPG
dejará grabado en el archivo SALIDA el nombre del programa, la librería y además una ‘S’ si el
programa fue compilado con Ignore data decimal error y una ‘N’ si no fue compilado de esta
manera.
Permite al programa CLP responder a los mensajes de error según la lista de respuestas
automáticas (*SYSRPYL), además colocar el log en nivel 4, hace que se genere el listado del DUMP
del programa RPG que Falló y no del programa CLP como sucedería si no colocamos el 4 en el nivel
del LOG.
Al final del proceso de cada programa elimina del DUMP del spool para no embasurar la cola de
salida:
A continuación los códigos fuentes de ambos programas que además de verlos en este documento
podrán descargarlos en este enlace:
http://www.megaupload.com/?d=8JMMV102
Programa CLP:
PGM
DCLF FILE(UTILID/PROGRAMA)
http://iseriesvenezuela.blogspot.com
http://iseriesvenezuela.blogspot.com
CALL PGM(THFLIB/&PROGRA1)
JOB(&NBR/&USER/&JOB) SPLNBR(*LAST)
SPLNBR(*LAST)
ENDDO
GOTO LAZO
FIN: ENDPGM
Programa RPG:
Extracto del programa:
Begsr Define_Igndd;
Read Printer;
Pos = %Scan('ZIGNDECD':f_printer:1);
If Pos > 0;
If DSIgndd = '0';
igndd = 'N';
Else;
igndd = 'S';
ENDIF;
http://iseriesvenezuela.blogspot.com
http://iseriesvenezuela.blogspot.com
write rigndd;
leave;
endif;
Read Printer;
enddo;
endsr;
El analista de sistema podrá realizar los cambios y adecuaciones que considere conveniente.
http://iseriesvenezuela.blogspot.com