Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

sábado, 25 de abril de 2009

Monitoreo de Errores en RPG (3/4)








Continuamos con el tema del monitoreo de errores en RPG, esta es la tercera entrega de una serie de cuatro. Es recomendable que leas lo anteriores de esta serie para que se te facilite continuar con el contenido de este artículo.

Hay dos subrutinas para manejar errores en RPG. La rutina de manejo de errores sobre operaciones de archivos (especificada en la palabra clave INFSR) y la rutina para manejar los errores de ejecución en RPG (*PSSR.

En artículos anteriores especificábamos para cada archivo declarado SU respectiva INFDS, y en el código del programa, una vez detectado un error de I/O por medio de un indicador o un código extendido (E) llamábamos explícitamente a la rutina que se encargaría de procesar el error de I/O y enviar el mensaje correspondiente.

En la declaración del archivo podemos especificar a través de la palabra clave
INFSR la rutina que tomará el control del error en caso de que el archivo arroje algún problema de I/O. No será necesario realizar un EXSR explícito sino que el programa automáticamente al detectar un error pasará el control a la rutina especificada en el INFSR.
Por ejemplo:

FARCHIVO1 OF E K DISK KINFDS DS1
F...............................KINFSR SRERROR1

FARCHIVO2 UF E K DISK KINFDS DS2
F...............................KINFSR SRERROR2


Especificamos para el ARCHIVO1 y para el ARCHIVO2, una rutina distinta, SRERROR1 y SRERROR2, respectivamente, aunque puede ser la misma si así lo deseamos, sin embargo la INFDS si debe ser única para cada archivo.

Para manejar los errores de ejecución de RPG tales como índice fuera de rango, división por cero y cosas así se utiliza la rutina *PSSR. Cuando declaramos en la hoja C del programa la rutina *PSSR, el sistema operativo automáticamente dirige el control del error del programa a esa rutina y ejecuta las instrucciones que han sido especificadas por el programador para manipular los mensajes de error o realizar cualquier acción que se requiera.

La rutina *PSSR también puede especificarse en la declaración de archivos en la palabra clave, INFSR de manera que podemos indicarle a RPG que cuando haya problemas de I/O en un archivo se ejecuten los comandos que estén establecidos en la rutina *PSSR.

FARCHIVO1 OF E K DISK KINFDS DS1
F...............................KINFSR *PSSR

FARCHIVO2 UF E K DISK KINFDS DS2
F...............................KINFSR *PSSR


Para determinar el código de error del error para cada archivo vimos en artículos anteriores que se asocia una estructura de datos en el INFDS en la hoja ‘F’ asociada a cada archivo. Para determinar el código de error no asociado a errores de I/O, debemos declarar la SDS que es la estructura de datos de sistema. Algunos manuales la denominan PSDS (Program System Data Structure)

La PSDS tiene el siguiente formato básico:

D SDS
D PROC_NAME *PROC * Procedure name
D PGM_STATUS *STATUS * Status code
D PRV_STATUS 16 20S 0 * Previous status
D LINE_NUM 21 28 * Src list line number
D ROUTINE *ROUTINE * Routine name
D PARMS *PARMS * Num passed parms

Hay más posiciones que nos dan información sobre las condiciones de ejecución del programa que pueden ver en este link: http://faq.midrange.com/data/cache/234.html
Para no hacer tan extenso este artículo colocamos las más usadas y conocidas.

Un ejemplo del código sería el siguiente:

FARCHIVO IF E K DISK
D
...
...
D PSDS SDS
D Procedure *PROC
D Status *STATUS
C
C Read ARCHIVO
C Eval TAB, Z = Valor
...
C Eval LR = *ON
C*
C *PSSR BEGSR
C Status IFEQ 00121
C .....
C* Mensaje de Índice fuera de rango.
c
C RETURN
C ENDIF
C ENDSR



En el Link publicado en este blog titulado Manuales y Documentos RPG, pueden descargar el manual IleRpgReferenceSummaryVersion5, en el primer capitulo: Error Handling está la lista de errores asociados a PSDS distintos a la lista de errores de I/O. Ambas listas están en el mismo capitulo.

Nótese que, en este ejemplo, el archivo no está siendo monitoreado. Si hay un error de I/O, el programa producirá un mensaje de error. Algunos programadores piensan que colocando la rutina *PSSR se monitorea todo, pero no es así porque para el monitoreo errores de I/O de los archivos debemos especificar en su declaración la INFDS y la INFSR.

Puede parecer agobiante el control de errores, por lo que resulta cómodo muchas veces utilizar los indicadores de error en las instrucciones que nos interesa monitorear o trabajar con código extendido (E) con las functions built-in %error y
%status. Sin embargo, cuando surge un problema a tiempo real que debe ser resuelto con carácter de urgencia, la experiencia me dicta que mientras mas detallada y rápidamente tengamos información sobre el error, es mas rápida y efectiva la solución del problema que está requiriendo una atención urgente.


ESPECIFICANDO UN PUNTO DE RETORNO en el ENDSR

El empleo de estas palabras claves es opcional, pero se importante conocer su existencia y uso.

Cuando utilizamos una rutina de error especificada en el INFSR o la rutina *PSSR, puedes indicar al programa en punto de retorno donde deberá continuar la ejecución del programa una vez monitoreado el error. Esto los puedes hacer colocando un keyword especial en el FACTOR 2 del ENDSR de la rutina que monitorea el error. La entrada que coloque acá debe ser de 6 posiciones carácter y puede ser una variable, constante elemento de una tabla o literal.
Si el punto de retorno es un literal, entonces debe estar encerrado en apóstrofos y en mayúsculas. Si se coloca una variable, el valor debe estar ajustado a la izquierda.

Ejemplo en el siguiente código:

C *PSSR BEGSR

C If Error <> 00102

C Eval Divsr = Divsr + 1

C Eval ACCION = '*DETC'

C Else

C Eval ACCION = '*CANCL'

C Endif

C ENDSR ACCION



En el ejemplo, si hay división por cero, se detiene la ejecución del programa, si el error es de otra naturaleza, continúa el procesamiento con una operación de input.
La variable ACCION debe ser de 6 posiciones alfabéticas. También puede colocarse en lugar de la variable, directamente el literal si el punto de retorno fuese siempre el mismo, en este caso, si siempre queremos que se suspenda la ejecución del programa:
ENDSR ‘*CANCL’

Los valores válidos para los puntos de retorno son:

*DETL Continue at the beginning of detail lines.
*GETIN Continue at the get input record routine.

*TOTC Continue at the beginning of total calculations.
*TOTL Continue at the beginning of total lines.
*OFL Continue at the beginning of overflow lines.
*DETC Continue at the beginning of detail calculations.
*CANCL Cancel the processing of the program.

Si no colocas nada, se Retorna el control por defecto al Ile-Rpg. Por ejemplo, si la subrutina fue llamada por un EXSR, el programa regresa a la siguiente instrucción que siguió a la llamada de la rutina.


Si te pareció interesante, reenvialo a un amigo haciendo click en el sobrecito que está al final del artículo. El conocimiento es valioso, compártelo.


Autor:  Ing. Liliana Suárez

No hay comentarios: