You are on page 1of 7

http://iseriesvenezuela.blogspot.

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.

Se crean dos programas un programa CLP y un RPG.

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).

Cuando escribimos el WRKRPYLE obtenemos la siguiente pantalla: (Figura 1)

Autor: Ing. Liliana Suárez

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

El siguiente comando es: ADDRPYLE muestra la pantalla: (Figura 2)

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.

El identificador de mensaje corresponde a CPF4101.

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.

La respuesta del mensaje será: ‘D’. No es necesario colocarlo entre comillas.

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

Autor: Ing. Liliana Suárez

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.

EL siguiente comando al principio del CLP:

CHGJOB LOG(4) INQMSGRPY(*SYSRPYL)

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:

DLTSPLF FILE(QPPGMDMP) JOB(&NBR/&USER/&JOB) SPLNBR(*LAST)

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

DCL VAR(&JOB) TYPE(*CHAR) LEN(10)

DCL VAR(&USER) TYPE(*CHAR) LEN(10)

DCL VAR(&NBR) TYPE(*CHAR) LEN(6)

DCLF FILE(UTILID/PROGRAMA)

CHGLIBL LIBL(DUMMY) CURLIB(DUMMY)

CHGJOB LOG(4) INQMSGRPY(*SYSRPYL)

Autor: Ing. Liliana Suárez

http://iseriesvenezuela.blogspot.com
http://iseriesvenezuela.blogspot.com

RTVJOBA JOB(&JOB) USER(&USER) NBR(&NBR)

LAZO: RCVF RCDFMT(RPROGRA)

MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(FIN)) /* EOF */

CALL PGM(THFLIB/&PROGRA1)

MONMSG MSGID(CPF4101 RPG1216 RPG9001 CPF0001) EXEC(DO)

CPYSPLF FILE(QPPGMDMP) TOFILE(XJANETTE/PRINTER) +

JOB(&NBR/&USER/&JOB) SPLNBR(*LAST)

CALL PGM(UTILID/RPGIGNDD) PARM(&LIBRER &PROGRA )

DLTSPLF FILE(QPPGMDMP) JOB(&NBR/&USER/&JOB) +

SPLNBR(*LAST)

ENDDO

GOTO LAZO

FIN: ENDPGM

Programa RPG:
Extracto del programa:

Begsr Define_Igndd;

Read Printer;

Dow (not %eof(printer));

Pos = %Scan('ZIGNDECD':f_printer:1);

If Pos > 0;

If DSIgndd = '0';

igndd = 'N';

Else;

igndd = 'S';

ENDIF;

Autor: Ing. Liliana Suárez

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.

Autor: Ing. Liliana Suárez

http://iseriesvenezuela.blogspot.com

You might also like