Mostrando entradas con la etiqueta READ. Mostrar todas las entradas
Mostrando entradas con la etiqueta READ. Mostrar todas las entradas

viernes, 2 de marzo de 2012

COBOL/CICS vol.2: acceso a ficheros.

En este artículo veremos un programa CICS que recoge información de la pantalla y actualiza un fichero VSAM. Al igual que en el ejemplo anterior, se trata de un programa conversacional, es decir, el código se ejecutará de principio a fin sin devolver el control al CICS en ningún momento (salvo al finalizar la ejecución).

En el artículo COBOL/CICS vol.1: primer contacto vimos como crear una transacción CICS y asociarla a nuestro programa, por lo que no volveremos a explicarlo.
En esta ocasión veremos como definir un fichero VSAM en CICS para que pueda ser utilizado por nuestro programa. El sistema será el mismo que para definir un programa.

Utilizaremos la transacción CEDA para definir el fichero.
Escribiremos CEDA DEFINE FILE
La información a rellenar será:
File
Group
DSNAme
Add = yes
BRowse = yes
DELete = yes
READ = yes
UPDATE = yes

Una vez definido, tendremos que instalarlo:
CEDA INSTALL FILE(FILE1)
Se debe rellenar el campo Group


Ahora si consultamos la transacción CEMT veremos que ya aparece nuestro fichero:
CEMT I FILE(FILE1)


Ya tenemos el fichero listo para usar.

Antes de meternos a ver el programa, vamos a ver las instrucciones CICS de acceso a fichero que vamos a utilizar.

STARTBR: Apertura del fichero

      EXEC CICS STARTBR
                FILE ('FILE1')
                RIDFLD (WX-CODIGO)
                KEYLENGTH (WX-LONG-CLAVE)
                GTEQ
                RESP (WX-RESP)
      END-EXEC.


Donde:
FILE1 es el nombre que le hemos dado a nuestro fichero en CICS.
RIDFLD es el campo clave del fichero.
KEYLENGTH es la longitud de la clave.
GTEQ indica mayor o igual.
RESP indicamos la variable donde guardaremos el código de respuesta.

DELETE: borra un registro del fichero

    EXEC CICS DELETE
              RIDFLD (WX-CODIGO)
              FILE ('FILE1')
              NOHANDLE
    END-EXEC.


Nota: si usamos NOHANDLE el código de respuesta lo tendremos en EIBRESP


WRITE: graba un registro

     EXEC CICS WRITE
               FILE ('FILE1')
               RIDFLD (WX-CODIGO)
               LENGTH (WX-LONG-REG)
               FROM (REG-VSAMKSDS)
               NOHANDLE
     END-EXEC.

Donde:
LENGTH es la longitud del registro
FROM es el nivel 01 que define la estructura del fichero

READ: lectura directa

     EXEC CICS READ
               RIDFLD (WX-CODIGO)
               FILE ('FILE1')
               INTO (REG-VSAMKSDS)
               LENGTH (WX-LONG-REG)
               NOHANDLE
     END-EXEC.


Donde:
INTO es el nivel 01 que define la estructura del fichero.

READNEXT: lectura del fichero

     EXEC CICS READNEXT
               INTO (REG-VSAMKSDS)
               RIDFLD (WX-CODIGO)
               FILE ('FILE1')
               KEYLENGTH (WX-LONG-CLAVE)
               RESP (WX-RESP)
     END-EXEC.



UPDATE: indica lectura con intención de actualizar

     EXEC CICS READ
               RIDFLD (WX-CODIGO)
               FILE ('FILE1')
               INTO (REG-VSAMKSDS)
               LENGTH (WX-LONG-REG)
               UPDATE
               NOHANDLE
     END-EXEC.


Nota: con UPDATE bloqueamos el registro para que no se pueda acceder a él mientras tanto

REWRITE: actualiza un registro

     EXEC CICS REWRITE
               FILE ('FILE1')
               LENGTH (WX-LONG-REG)
               FROM (REG-VSAMKSDS)
               NOHANDLE
     END-EXEC.


ENDBR: cierre del fichero

     EXEC CICS ENDBR
               FILE ('FILE1')
               RESP (WX-RESP)
     END-EXEC.



La semana que viene continuaremos el artículo con el código completo del programa y su ejecución. Esta no hay tiempo para más!

miércoles, 9 de marzo de 2011

Natural/ADABAS para coboleros: parte II.

En esta segunda parte vamos a ver cómo acceder a la base de datos ADABAS.
La base de datos ADABAS es "no relacional" con ficheros en vez de tablas, registros en vez de filas y campos en vez de columnas.

Para entenderlo veremos un ejemplo de un programa natural que accede a una "tabla".

Fichero(tabla) EMPLEADOS:

11111JOSE MARTINEZ
33333LAURA VAZQUEZ
44444SUSANA LOPEZ
22222JAVIER GUTIERREZ


Donde el primer campo es el número de empleado y el segundo campo el nombre del empleado.

JCL:

//**************EJECUCION NATURAL*******************
//**************************************************
//PROG1 EXEC NATBAT
//CMPRINT DD SYSOUT=*
//CMSYNIN DD *
LOGON SYSEXBAT
EXECUTE PGMNAT2
FIN
//SYSIN DD *
11111
/*



Programa:

DEFINE DATA LOCAL
  1 EMPLEADOS-VISTA VIEW OF EMPLEADOS
    2 NUM-EMPLEADO (N5)
    2 NOMBRE-EMPLEADO (A30)

  1 #NUM-EMPL (N5)
END-DEFINE

INPUT #NUM-INPUT

READ EMPLEADOS-VISTA BY NUM-EMPLEADO = #NUM-INPUT

   DISPLAY NUM-EMPLEADO 3X NOMBRE-EMPLEADO

END-READ

END



Donde:
EMPLEADOS-VISTA sería una vista del fichero EMPLEADOS, que podría tener más campos que los que nosotros mostramos en la LOCAL.
#NUM-EMPL es una cariable que recibimos de la SYSIN.

La sentencia READ recuperará todos los registros de la tabla que cumplan
NUM-EMPLEADO >= #NUM-IMPUT ordenados por NUM-EMPLEADO.
Si quisiésemos recuperar sólo el empleado con número = #NUM-INPUT tendríamos que codificarlo así:

READ EMPLEADOS-VISTA BY NUM-EMPLEADO FROM #NUM-INPUT THRU #NUM-INPUT


Utilizaremos el DISPLAY en lugar del WRITE para que quede más bonito :P y "3X" indica que deje 3 espacios en blanco entre cada columna.


Resultado para NUM-EMPLEADO = #NUM-INPUT:

  NUM             NOMBRE
EMPLEADO         EMPLEADO
--------   --------------------
11111      JOSE MARTINEZ
22222      JAVIER GUTIERREZ
33333      LAURA VAZQUEZ
44444      SUSANA LOPEZ


Resultado para NUM-EMPLEADO FROM #NUM-INPUT THRU #NUM-INPUT:

  NUM             NOMBRE
EMPLEADO         EMPLEADO
--------   --------------------
11111      JOSE MARTINEZ


Más ejemplos de accesos a base de datos.

READ(1) --> lee por "mayor o igual" y recupera sólo 1 registro; equivaldría a nuestro "fetch first row only".

Sentencia: READ(1) EMPLEADOS BY NUM-EMPLEADO = 30000
Resultado: 33333LAURA VAZQUEZ

READ --> lee por "mayor o igual" y recupera todos los registros; equivaldría a nuestro cursor.

Sentencia: READ EMPLEADOS BY NUM-EMPLADO = 30000
Resultado: 33333LAURA VAZQUEZ
        44444SUSANA LOPEZ

FIND --> se utiliza cuando el campo que buscamos es clave primaria del fichero ADABAS. Lee por "igual".

Sentencia: FIND EMPLEADOS WITH NUM-EMPLEADO = 33333
Resultado: 33333LAURA VAZQUEZ

UPDATE --> actualiza un registro del fichero ADABAS.
INSERT --> inserta un registro en el fichero ADABAS.
DELETE --> borra un registro del fichero ADABAS.

Este es un ejemplo muy sencillo de acceso a base de datos con Natural/ADABAS, pero espero que sirva para que os hagáis una idea de cómo funciona.
Como en el ejemplo de la parte I, he probado el programa con la versión de Natural que ya teníamos, y una versión de ADABAS que se puede descargar de la página de Software AG.

Para la próxima vemos cómo utilizar ADABAS en un programa COBOL : )