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.

Sunday, March 15, 2009

¿Es posible Hacer un Chain en un programa CL?












Cuando estamos programando un CLP, a veces nos encontramos en la necesidad de detectar si un registro con determinados valores en su clave, existe en la base de datos y dependiendo del resultado de la búsqueda tomamos una acción u otra.

Hay varias opciones para obtener un resultado, algunas son más felices que otras en términos de eficiencia y programación:

1.-Leer todo el archivo y preguntar si el valor de un campo corresponde al valor que estamos buscando en el archivo.
Esto consume mucho tiempo de respuesta.


2.-Llamar a un programa en RPG pasándole el valor como parámetro para que el Programa RPG realice el chain y nos devuelva en otro parámetro la respuesta de si existe o no existe el registro en el archivo. Esto implica un call cada vez que se entra al programa CLP

3.-Utilizar Opnqryf y leer los resultados que arroja. Es mas lento por la generación de una tabla de lectura intermedia.

4.-Realizar un ovrdbf especificando la clave de búsqueda y monitoreando el mensaje de excepción. Esta es la opción más eficiente. A continuación un ejemplo:

PGM
DCL VAR(&USER) TYPE(*CHAR) LEN(10)
DCLF FILE(TABLAUSER)
/* Obtiene el usuario actual */
RTVSYSVAL SYSVAL(QUSER) RTNVAR(&USER)

OVRDBF FILE(TABLAUSER) POSITION(*KEY 1 FMT1 &USER)
RCVF

/* SI ES FIN DE ARCHIVO O NO ENCUENTRA LA CLAVE DE BUSQUEDA */
/* Finaliza el programa*/
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(FINPGM))
/* Si el Usuario está en el archivo */

IF (&USER *EQ &NOMBRE) +
THEN(DO) /* USUARIO SI ESTA EN LA TABLA*/
GOTO CMDLBL(PROCESAR)
ENDDO


PROCESAR: CALL PGM(PROCUSER)
FINPGM: ENDPGM


Esta última opción es la mas eficiente ya que consume menos tiempo de procesamiento y el código es mas directo y fácil de seguir para cualquier programador.

Se explica el comando Ovrdbf con estos nuevos parámetros:

OVRDBF FILE(TABLAUSER) POSITION(*KEY 1 FMT1 &USER)

Los valores del parámetro POSITION se interpretan de la siguiente manera:

Posicionarse en:

A) *KEY = el primer registro del archivo TABLAUSER
B) FMT1 = con formato de registro FMT1
C) 1 = cuyo valor en el primer campo clave (1) sea igual al
valor de la variable &USER.

Al momento de ejecutar el RCVF, si no consigue ningún registro en el archivo que cumpla con esta condición entonces va a Fin de programa. Esta verificación se realiza utilizando el comando MONMSG para detectar si hay algún status de excepción.

1.- Además del valor *KEY existen otros valores que podemos emplear si necesitamos una búsqueda mas avanzada:


*KEYBE (key-before or equal): Si no hay registro en el archivo que haga match con el valor especificado en el ovrdbf, se selecciona el registro anterior con valor menor al especificado.
Esto es la combinación de dos comandos SETLL y READ

*KEY (key-equal): The registro identificado por los valores de búsqueda especificados en el programa es el registro que será retribuido en la lectura.
Esto es la combinación de SETLL y READE

*KEYAE (key-after or equal):
Si no hay registro en el archivo que haga match con el valor especificado en el ovrdbf, se selecciona el siguiente registro con valor mayor al especificado.
Esto es la combinación de dos comandos READE y SETGT

*KEYA (key-after):
El primer registro con un valor mayor al valor especificado en el programa será el registro retribuido en la lectura.
Esto es la combinación de dos comandos SETGT y READ

2.-Número de Campos clave en la búsqueda.

En el ejemplo colocamos un 1, pero podemos colocar otros valores de acuerdo a lo que necesitemos buscar en el archivo.

Si POSITION(*KEY 1 FMT1 A) es especificada, el primer registro en el archivo con formato de registro FMT1 que tiene su primer campo clave con valor ‘A’ es retribuido en la lectura. Si se especifica un valor cero (0) la búsqueda del valor ‘A’ se realizará en todos los campos clave del archivo.

Si especificamos un valor 2, por ejemplo estamos diciendo que busque el primer registro del archivo con valor ‘A’ en el segundo campo que constituye la clave del archivo.

El nombre del formato de registro puede ser omitido y podemos colocar *N para decirle que tome todos los formatos de registro del archivo

Tomando en cuenta estos últimos tips, el parámetro POSITION quedaría asi:

POSITION(*KEY 2 *N A)



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 comments: