Cobol.Ficheros.

Ismael Royano Gómez
Enredando con Programación
10 min readMay 10, 2016

Los ficheros son archivos de datos donde se almacenan los valores que necesitemos de un programa a nivel de registro, algo parecido como ocurre con los registros de las bases de datos. Aunque COBOL se puede utilizar para procesar otros tipos de archivo de datos, se utiliza generalmente sólo para procesar registros.

Hay esencialmente dos tipos de organización de registros:

  • Archivos Secuenciales. Los registros se organizan y se accede en serie, es decir, de forma secuencial pasando por los registros anteriores para ir a uno especifico.
  • Archivos de acceso directo o Indexados. En un archivo de acceso directo, los registros se organizan de una manera que permite el acceso directo a un registro determinado sin tener que pasar por cualquiera de los registros anteriores.

Algunas organizaciones son más versátiles que otras, por ejemplo, un archivo con una organización indexada puede tener acceso a sus registros de forma secuencial o de forma directa, pero los registros en un archivo con una organización secuencial sólo se puede acceder de forma secuencial.

En la actualidad se suelen usar ficheros indexados, ya que los secuenciales sólo se pueden agregar y leer y son un poco más engorrosos para poder actualizar, modificar o borrar un registro.

Veamos algunos conceptos básicos para orientarnos y saber de lo que hablamos:

  • Se usa el término archivo o fichero para almacenar todos aquellos valores que necesitemos en un programa.
  • El término registro se usa para describir un conjunto de campos que registran información acerca de un sólo objeto.
  • Usamos el término campo para describir cada información registrada sobre un solo objeto, por ejemplo teléfono, dirección.

Vamos a imaginar una agenda de teléfono:

  • El fichero sería toda la agenda. Un fichero con el nombre agenda.
  • El registro sería el conjunto de información de cada persona, es decir; nombre, teléfono, dirección, código postal…etc.
  • El campo sería cada información independiente que tiene una persona de la agenda, por ejemplo, el nombre es un campo, teléfono sería otro campo, la dirección otro campo más y así sucesivamente.
  • Todos los campos juntos es lo que forma registro, es decir, la fila entera, que resulta que es toda la información que tenemos de una sola persona u objeto.

Vamos a usar de ejemplo la agenda e iremos definiendo un fichero de organización secuencial en cobol:

Agenda.dat (así lo llamaremos).

Cada registro tendra esta estructura:

Orden    Nombre    Dirección         Codigo Postal    Teléfono
1 Ismael Calle Perú, 5 06010 999255124
2 Javier Calle Faisan, 16 06025 989525289
3 Lourdes Calle Perdiz, 21 06259 929444548

Ahora para definir este estructura de fichero en cobol:


ENVIRONMNET DIVISION.
INPUT-OUTPUT SECTION.
* Esta claúsula nos permite dar el nombre real del fichero en el disco.
* También podemos indicar el camino, por ejemplo “c:\ficheros\agenda.dat”
* El nombre que le asignemos en la SELECT debe coincidir con el de la FD.
SELECT
AGENDA ASSIGN TO “AGENDA.DAT”.
DATA DIVISION.
FILE SECTION.
* El nombre interno que le asignamos se llamara agenda.
FD
AGENDA.
* A continuación definimos como se llama el registro y como se estructura.
01 AGENDA-REG.
02 ORDEN PIC 9(2) VALUE ZEROS.
02 NOMBRE PIC X(15) VALUE SPACES.
02 DIRECCION PIC X(30) VALUE SPACES.
02 CODIGO-POSTAL PIC 9(4) VALUES ZEROS.
02 TELEFONO PIC 9(9) VALUES ZEROS.

Vemos como es la sintaxis de la instrucción SELECT:

SELECT NombreFichero ASSIGN TO NombreFicheroExterno

En estos tipos de archivos debemos tener en cuenta 4 instrucciones fundamentales. OPEN, CLOSE, READ, WRITE . Vamos a ir viéndolos poco a poco y como funcionan.

OPEN. Veamos su sintaxis: OPEN modo nombreinternodelfichero

Antes de trabajar con un fichero, hay que asegurarse de abrirlo correctamente para acceder a los datos que pueda contener para trabajar con ellos. Existen 3 formas de abrir un fichero:

INPUT. Se abre un fichero en modo lectura. Usando este cláusula se coloca el puntero en el primer registro. Si el fichero no existiera daría un error, ya que el primer requisito es que el fichero exista.

OUTPUT. Se abre un fichero en modo escritura. Usando esta cláusula tiene la peculiaridad de que si no existe lo crea y si existe, lo elimina y vuelve a crearlo. Hay que tener cuidado con esto, ya que crea un nuevo fichero cada vez que lo utilizamos, borrando los datos que pudiéramos tener almacenados.

EXTEND. Como su nombre indica, se abre un fichero para extenderlo, es decir, para agregar más registros a los ya existentes. Cuando se abre de esta forma, el puntero se coloca en el último registro para continuar almacenando datos. Obviamente el requisito fundamental es que el fichero exista, si no fuera asi la instrucción OPEN nos mostraría un error.

CLOSE. Su sintaxis es la siguiente: CLOSE nombreficherointerno…

Se debe siempre asegurase, antes de terminar con un programa, que se cierran debidamente todos los ficheros que hayamos utilizado, ya que puede grabarse los datos de mala manera y perder el acceso a estos ficheros en el futuro.

READ. Su sintaxis es la siguiente:

READ nombreinternodelfichero NEXT/PREVIOUS RECORD INTO descripción
AT END / NO AT END instrucciones
END-READ

Una vez que tengamos un fichero abierto, toca usar una instrucción para leer cada registro, veamos como funciona:

  • Cuando utilizamos esta instrucción, lo que hace es almacenar en un la memoria una copia del registro que esta leyendo para trabajar con él.
  • INTO. Esto se utiliza para usar una variable en donde almacenar el registro. Al hace esto, tendremos el registro en dos lugares, en la memoria y en la variable para su posterior utilización.
  • AT END. Este instrucción es la que nos indica cuando ha llegado al final del fichero, es decir, cuando haya terminado de leer todos los registros que haya en el fichero.
  • NOT AT END. Es posible que queramos hacer algún tipo de procedimiento cuando no ha llegado al final del fichero.

WRITE. Veamos su sintaxis; WRITE registro FROM variable.

  • Esta instrucción sirve para grabar los datos en el fichero que usamos como almacenamiento de datos.
  • FROM. Esto sirve para realizar una copia en una variable del registro que vayamos almacenar en el fichero.

Vamos a coger el ejemplo de la agenda de teléfono. Agregaremos un par de registros y luego los leeremos y visualizaremos sus datos para ir viendo como funciona:

identification division.
program-id. Ficheros.
author. Ismael.
environment division.
input-output section.
file-control.
select agenda assign to "agenda.dat"
organization is line sequential.
data division.
file section.
fd agenda.
01 agenda-reg.
02 orden pic 9(2).
02 nombre pic X(15).
02 direccion pic X(30).
02 codigo-postal pic 9(5).
02 telefono pic 9(9).
working-storage section.
77 fin-fichero pic 9 value 0.
procedure division.
Inicio.
open output agenda
perform 3 times
perform agregar
perform limpiar-pantalla
end-perform
perform leer-agenda
close agenda
stop run.
agregar.
display "programa de la agenda"
display "dame el orden: "with no advancing
accept orden
display "dame el nombre: "with no advancing
accept nombre
display "dame la direccion: "with no advancing
accept direccion
display "dame el codigo postal: "with no advancing
accept codigo-postal
display "dame el telefono: "with no advancing
accept telefono
write agenda-reg.
limpiar-pantalla.
* usando esta instrucción, puedo llamar a cualquier comando del S.O.
CALL "SYSTEM" USING "clear".
leer-agenda.
move 0 to fin-fichero
close agenda
open input agenda
perform until fin-fichero=1
read agenda
at end move 1 to fin-fichero
not at end perform leer-registro
end-read
end-perform.
leer-registro.
display "orden: "orden
display "nombre: "nombre
display "direccion: “ direccion
display "codigo postal: "codigo-postal
display "telefono: "telefono.

Organización y Acceso.

Cuando hablamos de Organización de los datos, se refiere a la forma en la que se organizan los registros en un dispositivo de almacenamiento. Existen en COBOL 3 tipos de organizaciones;

Secuencial. Registros organizan en serie.
Relativa. Organización basada en el número relativo de registro.
Indexado. Organización basada en uno o varios índices, es decir, por una o varias claves como pasa con los las bases de datos.

Si hablamos de Método de acceso, se refiere a la forma en que se accede a los registros. Dependiendo del tipo de organización hay varias formas de hacerlo:

Organización Secuencial. El modo de acceso sólo puede ser secuencial.
Organización Indexada. Este tipo de archivos o ficheros son los más utilizados en cobol, ya que permiten en acceso de varias formas:

  • Dynamic. Permite el acceso de forma secuencial o directa según nos interese a lo largo del procedimiento.
  • Random. Permite el acceso de forma directa, sin necesidad de pasar por los registros anteriores.

Cuando utilizamos los ficheros indexados, existen varios parámetros extras que debemos indicarle al a hora de definir el archivo en la SELECT, vamos a verlo:

SELECT nombrefichero ASSIGN TO nombreficherofisico
ORGANIZATION IS SEQUENTIAL
INDEXED
ACCESS MODE IS SEQUENTIAL
RANDOM
DYNAMIC
RECORD KEY IS claveprincipal
ALTERNATE RECORD KEY IS clavealternativa (WITH DUPLICATES)
FILE STATUS IS variable
  • ACCESS MODE SEQUENTIAL. Modo de acceso es secuencial o de serie, es decir, pasará por todos los registros anteriores para consultar uno específico.
  • ACCESS MODE RANDOM. Modo de acceso directo, es decir, se desplazará directamente al registro que vayamos a consultar sin necesidad de pasar por los anteriores.
  • ACCESS MODE DYNAMIC. Es el modo de acceso mas utilizado, podemos acceder de forma secuencial o directa cuando mas nos interese dentro de un programa.
  • RECORD KEY. Clave principal se refiere a un campo numérico que debe ser único para cada registro para poder identificarlo inequívocamente.
  • ALTERNATE RECORD KEY. Clave alternativa se refiere a otro campo numérico o alfanumérico para poder darle otro orden al fichero a la hora de consultar. Se pueden hacer hasta 254 claves de este tipo en un sólo archivo. Este tipo de claves se suele utilizar para realizar consultas por otro campo que no sea la clave principal, por ejemplo, por fechas o por nombre…etc. Por defecto si no se dice nada, son claves que no pueden duplicarse y son únicas por registro. Si queremos una clave alternativa que se pudiera repetir hay que indicarle la cláusula “WITH DUPLICATES”.
  • FILE STATUS. Aquí se usa un campo alfanumérico de dos caracteres para guardar el estado del fichero. Por ejemplo si abriéramos un archivo y este no existiera por algún motivo, o no lo abra correctamente, almacenaría un código de error en esa variable.

El código de error con el que trabajaremos será el “35”. Este número se guarda en la variable que indiquemos en el FILE STATUS, cuando al abrir un fichero éste no exista.

¿Que cosas podemos hacer con los archivos indexados? Pues básicamente podemos hacer OPEN, READ, WRITE y con estos tipos de archivos podemos hacer REWRITE, DELETE y START gracias a los índices para identificar a cada registro.

OPEN. Veamos su sintaxis:

OPEN modo nombreinternodelfichero

Antes de trabajar con un fichero, hay que asegurarse de abrirlo correctamente para acceder a los datos que pueda contener para trabajar con ellos. Existen 4 formas de abrir un fichero:

  • INPUT. Se abre un fichero en modo lectura. Si el fichero no existiera daría un error, ya que el primer requisito es que el fichero exista.
  • OUTPUT. Se abre un fichero en modo escritura. Usando esta cláusula tiene la peculiaridad de que si no existe lo crea y si existe, lo elimina y vuelve a crearlo. Hay que tener cuidado con esto, ya que crea un nuevo fichero cada vez que lo utilizamos, borrando los datos que pudiéramos tener almacenados.
  • I-O. El archivo se abre en modo lectura/escritura de forma que podemos agregar, leer, escribir, rescribir o modificar y borrar la información de los registros.

CLOSE. Su sintaxis es la siguiente:

CLOSE nombredelficherointerno…

Se debe siempre asegurase, antes de terminar con un programa, que se cierran debidamente todos los ficheros que hayamos utilizado, ya que puede grabarse los datos de mala manera y perder el acceso a estos ficheros en el futuro.

READ.

Hay que tener en cuenta que la lectura en este tipo de archivos se debe hacer en función del tipo de acceso, es decir, si el acceso es secuencial se lee exactamente igual que los ficheros de organización secuencial. Veamos que cambiaría si la organización es indexada pero el acceso secuencial:

as

file-control.
select agenda assign to "agenda.dat"
organization is indexed
access mode is sequential
record key is orden
alternate record key is nombre
alternate record key is codigo-postal
file status is estado.

Agregar.

accept telefono
write agenda-reg
invalid key display "error al guardar"
end-write.

Si nos fijamos bien hay que darle un par de datos más, propio de los ficheros indexados, como son por ejemplo las claves principales o alternativas, en el caso de que las hubiere. La variable con la que trabajamos en la “file status” debemos declararla en la “Working” como es lógico. También existiría un pequeño cambio a la hora de escribir los registros, ya que dependemos de una clave principal para guardar los cambios.

Ahora bien, si el acceso lo hemos definido como “Dynamic/Random”, dependerá del valor de la clave que vayamos a utilizar para la consulta.

READ nombreinternodelfichero INTO descripción
KEY IS clave
INVALID KEY instrucciones
END-READ

Ahora dependemos del valor de uno o varios índices para poder leer un registro.

  • KEY IS. Se debe indicar el campo que utilizamos como índice para la consulta.
  • INVALID KEY. Ejecuta las instrucciones expuestas aquí cuando la clave no es válida.

WRITE.

WRITE registro FROM variable
INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-WRITE
  • FROM. Esto sirve para realizar una copia en una variable del registro que vayamos almacenar en el fichero.
  • INVALID KEY. Ocurre cuando se produce un error al grabar el registro en el fichero.
  • NOT INVALID KEY. Realiza las instrucciones que aquí se exponen cuando no ocurre error alguno al grabar los datos en el archivo.

REWRITE.

REWRITE registro FROM variable
INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-REWRITE
  • FROM. Esto sirve para realizar una copia en una variable del registro que vayamos almacenar en el fichero.
  • INVALID KEY. Ocurre cuando se produce un error al grabar el registro en el fichero.
  • NOT INVALID KEY. Realiza las instrucciones que aquí se exponen cuando no ocurre error alguno al grabar los datos en el archivo.

DELETE.

DELETE nombreinternodelfichero
INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-DELETE
  • INVALID KEY. Ocurre cuando se produce un error al grabar el registro en el fichero.
  • NOT INVALID KEY. Realiza las instrucciones que aquí se exponen cuando no ocurre error alguno al grabar los datos en el archivo. Hay que tener en cuenta que para usar esta instrucción hay que hacer un READ antes, como ocurre con la START.

START.

Esta instrucción es esencial en el uso de ficheros indexados con acceso dinámico cuando queremos hacer lecturas secuenciales. Vamos a imaginar un archivo con 20.000 registros y sólo queremos visualizar a partir del registro 8000. Si lo hiciéramos de la forma que sabemos hasta ahora, pasaríamos por los 7999 registros que se encuentran antes y sería un poco engorroso y lento. Para esto sirve la START, se posiciona en el registro que queramos sin pasar por los anteriores para hacer una lectura más rápida. Vamos a ver como funciona:

START nombreinternodelfichero KEY (expresión) nombredelaclave
INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-START

Expresión. Esto se refiere a las comparaciones lógicas de campos claves que vayamos a usar en la consulta:

  • IS EQUAL TO. Igual a…
  • IS =. Igual a..
  • IS GREATER THAN. Mayor que.
  • IS > Mayor que.
  • IS NOT LESS THAN. No es menor que.
  • IS NOT < No es menor que.

Cuando utilizamos esta sentencia, éste no lee, sólo coloca el “cursor” en el registro que le indicamos. Después toca leer el fichero con la instrucción READ.

Continúa por Screen section.

--

--

Ismael Royano Gómez
Enredando con Programación

Técnico Informático curioso, lector activo de las nuevas tecnologías, amante de las series de televisión y usuario del respetable mundo del enredo.