Alters

COBOL: archivos + ejemplo

Hola de nuevo!

Ya que esta será la última entrega "teórica", he decidido poner el ejemplo en esta misma.

Ahora veremos el tema de ficheros. En COBOL hay varios tipos de ficheros, cada uno con sus ventajas y desventajas. Vamos allá

Ficheros:

Como decía, hay varios tipos de ficheros. Esto no significa diversas extensiones (COBOL no mira extensiones), sino organizaciones internas, modos de acceso...

En concreto, hay tres tipos de ficheros:

 * Secuenciales
 * Indexados
 * Relativos

Explicaré un poco las características de cada tipo:

Los secuenciales son accedidos de manera secuencial (obviamente), es decir, de principio a fin. Si quieres acceder al tercer registro tienes que hacer tres lecturas, no hay más.

Los indexados pueden ser accedidos de manera secuencial o bien de manera directa (mediante clave, ya lo veremos)

Los relativos se basan en "registros", pudiendo ser accedidos de manera secuencial o directa (usando clave).

A continuación, una lista de ventajas / inconvenientes de los tipos de archivo:

 * Secuencial

Ventajas:
   - Tamaño mínimo
   - Fácilmente editable (a mano)

Inconvenientes
   - A tamaño grande, la lectura se ralentiza.
   - Acceso puramente secuencial

* Indexado

 Ventajas
   - Rápidamente accesible
   - Sistema de claves

 Inconvenientes
   - Mayor tamaño
   - Apenas editable (a mano)

* Relativo

 Ventajas
   - Claves "invisibles"
   - Acceso rápido

Inconvenientes
   - No se puede ordenar
   - Apenas editable (a mano)


Aparte de los tipos de archivo, hay lo que se denomina modo de acceso: SEQUENTIAL, RANDOM, DYNAMIC. El primero establece un acceso secuencial, el segundo aleatorio (por clave) y el tercero ambos.

Si el fichero es secuencial solo se puede acceder mediante SEQUENTIAL; en cualquier otro caso vale cualquiera.


El uso de las claves funciona de manera similar a las bases de datos; en el caso de los indexados la clave puede ser cualquier cosa (un dni, teléfono...); en los archivos relativos se usa un índice numérico, de manera transparente al usuario y al programador.


Para declarar un fichero, tenemos que extender dos DIVISION: la ENVIRONMENT y la DATA.

La declaración básica se da en la ENVIRONMENT, y en la DATA definimos simplemente la estructura. En la primera parte, la declaración tiene variaciones dependiendo del tipo de fichero; en la segunda no.

  - ENVIRONMENT SECTION:

   Para un archivo SECUENCIAL, debemos poner algo tal que:


       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
            SELECT var ASSIGN TO DISK 'archivo'
                   ORGANIZATION IS SEQUENTIAL
                   ACCESS MODE IS SEQUENTIAL.


Veamos: Se declara la division, una nueva section (Input-Output), y se declara un fichero mediante FILE CONTROL. Finalmente se especifica el fichero:
   * SELECT var -> asigna una variable de "volcado" para el 'archivo' (hasta 8 caracteres!), que está asignado en el disco (otra opción es, por ejemplo PRINTER).
  * ORGANIZATION IS SEQUENTIAL -> le decimos que es secuencial. Podemos no poner esta sentencia, ya que si no está, por defecto COBOL lo tomará como secuencial.

  * ACCESS MODE IS SEQUENTIAL -> le decimos el modo de acceso, en este caso el único disponible: secuencial.

Para un archivo indexado, debemos poner algo similar a esto:


       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
            SELECT var ASSIGN TO DISK 'archivo'
                   ORGANIZATION IS INDEXED
                   ACCESS MODE IS [SEQUENTIAL | RANDOM | DYNAMIC]
                   RECORD KEY IS var1
                   [ALTERNATE KEY IS var2 [WITH DUPLICATES]].


Revisemos el tema:

  * ORGANIZATION IS INDEXED -> le decimos que es un archivo indexado
  * ACCES MODE IS ... -> aquí especificamos el modo de acceso (explicado más arriba)
  * RECORD KEY IS var1 -> le decimos cuál es la clave (como una PK de una tabla) del archivo
  * ALTERNATE KEY IS ... -> podemos especificar una clave alternativa (como un índice). Es opcional. Si ponemos "with duplicates" (también opcional) le decimos a COBOL que aceptamos que haya duplicados en esta clave. Por defecto COBOL no acepta duplicados en ningún tipo de clave.

Finalmente, para un archivo relativo:


       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
            SELECT var ASSIGN TO DISK 'archivo'
                   ORGANIZATION IS RELATIVE
                   ACCESS MODE IS  [SEQUENTIAL | RANDOM | DYNAMIC] .

Como veis, este último no hace falta explicarlo...

Ahora falta el siguiente punto, la data division:


       DATA DIVISION.
       FILE SECTION.

       FD var LABEL RECORD STANDARD.

       01    var1.
          02 var2 PIC X.

Esto es un poco lioso, así que vamos a explicarlo bien...

Primero abrimos la file section, y a partir de ahí describimos los archivos:

 * FD var LABEL RECORD STANDARD: Es la abreviatura de "File Descriptor". var es el nombre de variable usado en la ENVIRONMENT. La label record es una cláusula que especifica una variable de control interna para los ficheros. Yo recomiendo ponerla siempre como STANDARD (la otra opción es OMITTED).

* 01 var1... -> Declaramos la estructura para var. Tal cual, como cualquier otra estructura. Si el fichero es INDEXED, en esta estructura estarán las RECORD KEY y ALTERNATE KEY.




Ahora ya podemos delcarar ficheros; pero falta usarlos.

Para usar un archivo COBOL, debemos seguir la rutina básica de toda la vida, es decir

 - Abrir archivo
 - Manipular archivo
 - Cerrar archivo

Para abrir el archivo, tenemos la siguiente cláusula:

OPEN [INPUT | OUTPUT | EXTEND | IO] var.

Se tiene que especificar una de las 4 opciones, a saber:

 * INPUT: abre el archivo solo para lectura
 * OUTPUT: abre el archivo solo para escritura (lo crea si no existe, si existe lo borra y empieza de nuevo)
 * EXTEND : abre el archivo solo para escritura (si no existe da error, si existe escribe sin borrarlo)
 * I-O: abre el archivo para lectura/escritura (el archivo tiene que existir)

Hay varias operaciones para manipular el archivo. El tema es que COBOL tiene una "tabla" de operaciones disponibles para cada modo de acceso y modo de apertura:

 - ACCESO secuencial
   * INPUT
       · READ: lee un registro
       · START: se posiciona sobre un registro
  * OUTPUT (o EXTEND)
       · WRITE: escribe un registro
  * I-O
       · READ
       · REWRITE: sobreescribe el registro almacenado
       · DELETE: borra el registro almacenado
       · START

- ACCESO aleatorio

   * INPUT
       · READ
  * OUTPUT (o EXTEND)
       · WRITE
  * I-O
       · READ
       · WRITE
       · REWRITE
       · DELETE

 - ACCESO dinamico

   * INPUT
       · READ
       · START
  * OUTPUT (o EXTEND)
       · WRITE
  * I-O
       · READ
       · WRITE
       · REWRITE
       · DELETE
       · START

Finalmente aclarar: las operaciones se hacen sobre var, y las modificaciones sobre la estructura creada.




Para terminar el tema de COBOL, dejo el SRC de mi trabajo final de COBOL. Recordad leer el README, y si vais a compartir el archivo, citad la fuente y/o la autoría, por favor :-)

http://www.mediafire.com/?4algy7xluud6ay4


Para las próximas entradas tengo varios temas pensados, dejo aquí unas posibles opciones
 - Optimización para PHP
 - Uso de .htaccess para mejorar nuestra web
 - Tutorial HPL2: creando escenarios

Siento haber tardado tanto en hacer esta entrega; he estado liado y enfermo...


Saludos, y ¡Hasta la próxima!