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.
Showing posts with label Monitoreo de Errores. Show all posts
Showing posts with label Monitoreo de Errores. Show all posts

Saturday, December 6, 2014

Recuperando Los Mensajes de Error: RCVMSG














Hola!  A mis seguidores de IseriesVenezuela.

 Gracias por continuar visitando este blog escrito ustedes.

En esta oportunidad vamos a tratar algo sencillo el comando: RCVMSG
Como hemos visto en artículos anteriores, para controlar los errores de ejecución utilizamos frecuentemente el MONMSG en los programas CLP. Sin embargo, aunque este comando evita que el proceso se detenga no nos suministra el mensaje de error que fue monitoreado.

En muchas instalaciones donde se ejecutan procesos nocturnos múltiples y concurrentes resulta una verdadera pesadilla revisar inmensos listados o anotaciones del Log que arroja el sistema operativo durante la ejecución de los procesos.  En esos logs se anota los CALL, CRTPF, ENDJOB e infinidad de operaciones que retornan complicado el proceso de buscar cual fue el resultado del proceso.

El comando MONMSG contempla la ejecución de acciones específicas
 DO(EXEC)… ENDDO
Podemos ejecutar el comando RCVMSG dentro del grupo de instrucciones EXEC del comando MONMSG. En su expresión más sencilla el comando RCVMSG permite recuperar, a través de variables declaradas dentro del programa CLP el mensaje CPFXXXX y su descripción.
RCVMSG   MSGID(&MID) MSG(&MTEXT)
Luego de capturado el id del Mensaje MID y el texto del mensaje, Mtext, podemos grabarlo en un archivo de errores construido por nosotros. 

Una vez terminado el proceso, consultamos nuestro archivo y podemos rápidamente ver que errores fueron monitoreados durante la ejecución del proceso. Construimos el archivo de errores a nuestra conveniencia. Podemos colocar campos como: Proceso, Sistema, Modulo, Fecha, Usuario, Job, Programa que se estaba ejecutando, Hora, Msgid y Msg-texto.

Cada vez que se ejecuta el proceso se puede realizar un CLRPFM del archivo al principio de la ejecución del mismo y con esto evitamos ocupar memoria con mensajes de fechas anteriores. 

Otro uso práctico del archivo sería generar una estadística por día de la semana, usuario, o cualquier combinación de estos campos para determinar si los errores siguen ocurriendo o se han solucionado completamente.

Si te pareció interesante, reenvíalo 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

Thursday, May 31, 2012

Monitoreando Errores en Acceso a Archivos. Segunda Parte




 







Al actualizar un archivo, el registro actualizado es  desbloqueado (deallocated) y cualquier otro programa o proceso puede accederlo y modificarlo sin problemas.

Cuando trabajamos con subfiles, es necesario recargar el subfile cada vez que  la data ha sido actualizada en el programa a fin de mostrar la información actualizada.
Al leer un archivo para cargar el subfile y  evitar bloqueos innecesarios de un registro se deben realizar los read o chain sin bloqueos.
 Luego, una vez que el usuario ha confirmado su petición de grabar la información, realiza nuevamente, un chain pero con Bloqueo de registro y actualiza inmediatamente para permitir que otros procesos que están ejecutándose paralelamente al tuyo puedan acceder a la información y actualizarla en caso de ser necesario.

-------------------------
En este punto hago un paréntesis:
Cuando se realiza el segundo CHAIN o READ para grabar la información, tradicionalmente se usaba el “pool” de variables auxiliares declaradas para guardar los valores nuevos de los campos del archivo y que no se perdieran al hacer el Chain de actualización.
 Recuerda que utilizando el OCCUR puedes ahorrarte este inconveniente y ahorrar espacio y tiempo de programación. 
Puedes consultar este tema en un artículo anterior de este mismo blog:

-----------------------


Para cargar el subfile utiliza: la (N) permite hacer lecturas sin bloqueo de registro

KeyField       Chain (N)  FileName

O también:

               Read  (N)  FileName


Para actualizar un registro utiliza:

KeyField       Chain   FileName

En general, los desarrolladores no acostumbran realizar pruebas de la aplicación en un ambiente multiusuario. Para evitar errores innecesarios en el ambiente de producción solicita a varios programadores entrar a tu aplicación al mismo tiempo y te sorprenderás de cuantos se quedan “colgados” en alguna parte del proceso.


Otro error frecuente en la actualización de archivos es el de “CLAVE DUPLICADA”

Con estas instrucciones puedes monitorear el error y dar el mensaje sin producir esa fea caida de la pantalla que da muy mala impresiòn:

Chequear que se va a grabar clave duplicada:

C          Monitor
C          WRITE(E) FILENAME
C          On-Error 01021
C          CALL      PROGX
C          EndMon



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

Thursday, May 17, 2012

Monitoreando Errores de Acceso a Archivos -Primera Parte.













Cuando realizamos una operación sobre un archivo de datos que requiere “bloquear” un registro, por ejemplo cuando hacemos un CHAIN (en un programa donde el archivo se ha declarado de UPDATE), puede suceder que ocurra un error de I/O porque otro job tiene bloqueado (allocated) el acceso al registro y el tiempo límite de espera para acceder el registro ha expirado. Esto puede acarrear que nuestro programa falle y se detenga la ejecución del mismo.

Generalmente no es obvio  extraer la información sobre el  otro job que no nos está dejando acceder al registro. Otras veces es nuestra propia programación que ha realizado una lectura previa del registro y  en la segunda vuelta de ejecución se encuentra el registro bloqueado.

Cuando el registro esta bloqueado, el archivo se coloca en Status de Error 1218. Podemos obtener la información básica sobre lo que sucede examinando los subcampos de la estructura de datos PSDS en las posiciones comprendidas desde la 91 hasta la 170. Con el Status de Archivo en 1218 este subcampo puede contener un mensaje de primer nivel como este:

Record 3 in use by job 029617/QPGMR/QPADEV0005.

El texto del subcampo puede contener el mensaje de error del Código de error CPF5027 cuando otro job está bloqueando el registro o puede contener el mensaje del código de Error CPF5032 cuando es nuestro propio job quien bloquea el acceso al registro.

Para mayor información de cómo se declara la estructura de datos de SDS (Status Data Structured) puedes consultar el siguiente enlace:


Para monitorear errores de lectura por bloqueo de registro este código puede ser de utilidad:

key  chain(E) file

select
when not %error

... Procesamiento Normal

when %error and %status = 01218


... Mensaje: “Registro Retenido por otro Usuario”
     En este punto puedes desplegar el contenido del campo 91-170
     De la SDS declarada en la hoja D de tu programa.

endsl


ALGO MÁS…

Cuando creamos un archivo, o definimos una descripción de trabajo (JOBD) generalmente tomamos  los valores por omisión en cuanto al tiempo de espera por el acceso a un registro (palabras claves: WAITRCD/WAITFILE).

Esto significa que nuestros Jobs van a esperar ese tiempo máximo definido en el archivo físico o en el job hasta que nuestro programa falle. Esto puede ser un tiempo de espera innecesario para procesos nocturnos o procesos diarios de cierre que requieren optimizar al máximo los tiempos de respuesta. Podemos, a través de este comando que realizamos sobre el archivo:

Ovrdbf waitrcd(*immed)

Hacer que nuestro job no espere nada. Es decir, inmediatamente detecta que el registro está bloqueado y nuestro monitoreo del mensaje de error puede mandar el mensaje  al operador o usuario del proceso para aplicar las medidas correctivas que se requieran en forma mas expedita.


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


Publicado por: Ing. Liliana Suárez


Sunday, April 26, 2009

Monitoreo de Errores en RPG (4/4)



Uso del Monitor group





Continuamos con el monitoreo de errores en RPG.

Este es el útimo articulo de una serie de cuatro.Si no has leído los anteriores posiblemente no se te facilite seguir el contenido de esta entrega.

En la versión V5R1 se introduce un Monitor Group: esto te permite monitorear un conjuntos de instrucciones con errores potenciales, en contraposición al chequeo individual de cada una de ellas. Por otra parte es posible monitorear instrucciones que no permite codigo extendido (E).
El concepto funciona similar a un grupo SELECT, y tiene las siguiente estructura:

Comienza el monitoreo con la palabra clave: MONITOR
Monitor

Conjunto de instrucciones en RPG ha se monitoreadas
C READ archivo
C IF
C ...
C Eval a = b(j)+ 4
C ...
C Etc...

// comienza el monitoreo

On-Error codigoerror1 : codigoerror2 :codigoerror3;
// realizar accion

On-Error *FILE;
// realizar accion

On-Error *PROGRAM;
// realizar accion

On-Error *ALL;
// realizar accion
EndMon;

Saturday, April 25, 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

Friday, April 24, 2009

Monitoreo de Errores en RPG: Código de operación extendido. (2/4)









Anteriormente vimos como monitorear errores sobre la operación de un archivo utilizando indicadores de error y una estructura definida con la palabra clave INFDS.

Los indicadores de error no solo se utilizan para monitorear operaciones sobre archivos hay otras operaciones que también admiten monitoreo de error. La tabla de errores de esas operaciones (que no son sobre un archivo) es distinta y requiere el uso de una estructura de datos denominada PSDS que en un artículo previo la aplicamos para determinar quien estaba bloqueando el registro de un archivo. No en este artículo pero si en uno posterior se extenderá la explicación del uso de la estructura PSDS.

Las operaciones en RPG que permiten indicadores de error también permiten un código de operación extendido, utilizando una parámetro ‘E’. La operación CALLP también permite un extensor ‘E’ aunque no permite asociar un indicador de error. Esto provee dos métodos en ILE RPG para manipular errores a tiempo de ejecución. Para una misma operación se utiliza o un indicador de error o un extensor ‘E’ pero no ambos. Es decir, se puede utilizar esto:

RECORDKEY CHAIN(E) FILEREC 90

O esto:

RECORDKEY CHAIN FILEREC 9091

Monitoreo de errores en programas RPG. Primera Parte. (1/4)









En un programa CLP es muy fácil monitorear los mensajes de error. Utilizando el comando MONMSG(códigodeerrror) y especificando el código de error que se requiere monitorear, se puede con facilidad tomar el control del programa enviando el mensaje de error correspondiente y direccionado la ejecución del programa a la instrucción donde se requiere continuar sin que se produzca un mensaje de error en pantalla que incomode al usuario o que coloque en alerta al operador del sistema.
En RPG el asunto es un poco más complicado. Existen tres maneras de monitorear los mensajes de error.

1-La primera de ellas está relacionada con el monitoreo sobre errores producidos en la operación sobre un archivo.
a.- INFDS
b .-Uso de la Extensión (E) en el código de operación.

2-La segunda se relaciona con errores propios de la ejecución de alguna instrucción de RPG

3-La tercera es la más efectiva y sustituye a las anteriores pero está disponible únicamente para RPG IV e ILE-RPG

Monitoreo de Errores de Archivos. (primera parte)

INFDS(NOMBREDS)

La palabra clave INFDS te permite definir, en el programa RPG, el nombre de una estructura de datos que contiene la información asociada con un archivo. El nombre de la estructura de datos que se utilizará para tal fin se especifica en el parámetro de la palabra INFDS. Si INFDS es especificada en más de un archivo, cada estructura de datos asociada debe tener un nombre único.
Una INFDS debe ser definida para cada archivo para recoger la información relacionada con los errores de excepción disponibles para el programa.

La INFDS tiene la siguiente información.
• File Feedback (longitud 80)
• Open Feedback (longitud 160)
• Input/Output Feedback (longitud126)
• Device Specific Feedback (longitude variable)
• Get Attributes Feedback (longitude variable)


Para este artículo vamos a trabajar con el FILE FEEDBACK. La información contenida en las primeras 80 posiciones para monitorear los errores de archivos a tiempo de ejecución es, en general, más que suficiente para extraer la causa del error en el proceso de manipulación del archivo dentro del programa.