
Ficheros (I)
Cuando adquirimos
un compilador de Cobol, sin darnos cuenta a la vez estamos
obteniendo un completo administrador de ficheros, algo
que con otros lenguajes tienes que implementar con bases
de datos u otras herramientas externas.
No voy a entrar en la polémica de que es mejor,
si ficheros Cobol o Bases de datos, pero la experiencia
me permite decir que la fiabilidad, seguridad y potencia
de los ficheros es perfecta para nuestras aplicaciones
de gestión.
La
gran potencia sin duda, viene dada por los archivos
indexados y será sobre ellos sobre los que gire prácticamente
todo el tema, además con longitud fija. Los secuenciales se utilizan para la impresión
y para determinados procesos de exportación de datos,
pero cada uno es libre de utilizar el tipo de fichero
que desee.
En
la sección de Instrucciones relativas a ficheros tengo
una pequeña explicación sobre lo que es un fichero y
una clave y la voy a repetir aquí, porque nos viene
muy bien para comprender perfectamente como se comportan.
¿Que es un fichero? Podríamos
definir un fichero como un conjunto de registros, pero estaríamos mas o menos igual. Si
comparásemos un fichero de cobol con nuestra vieja agenda de teléfonos, para cada amigo
tendríamos los mismos datos, es decir, nombre, teléfono, dirección, etc ... cada uno de
esos datos es lo que llamamos campo y el conjunto de todos esos campos para cada amigo
sería un registro. Ahora podemos comprender mejor que un fichero o archivo es un conjunto
de registros, como una agenda es un conjunto de datos de amigos.
¿Que es una clave? Una clave, es
un campo de nuestra agenda que nos sirve para identificar a cada amigo, en la agenda
normal la clave podría ser la lengüeta con la letra del abecedario correspondiente a los
apellidos del amigo. Informáticamente es mas completa y con ella podremos identificar a
cada uno de ellos, por ejemplo con su nombre o su teléfono o un código que le asignemos
nosotros personalmente.
Algunos tipos de ficheros indexados, dividen el fichero en dos
archivos físicos, uno para las claves y otro para los
datos, otros en cambio lo guardan todo en uno mismo,
pero eso no significa que no lo haga igual, sino que
al usuario solo le muestra un fichero físico, que puede
resultar mas cómodo.
Cuando
se graba un nuevo registro, éste se ordena automáticamente
en orden ascendente por la clave principal. Luego podremos modificar
tantas veces como deseemos los datos, pero la clave
nunca se podrá alterar. Si queremos cambiar la clave,
tendremos que borrar el registro y grabar otro con la
clave deseada. De esa manera Cobol se asegura el perfecto
funcionamiento de su sistema de índices.
La
parte de índices es como una tabla con las posiciones
de memoria de los datos que le corresponden. Si el fichero
está abierto en modo I-O y se produce una salida brusca
del programa o un corte de luz, puede ocurrir que esa
información sobre los datos que corresponden a cada
índice se alteren y de ahí el famoso y terrible error
98. Por eso yo siempre aconsejo tener nuestro fichero
abierto solo como Input y abrirlo como I-O solo en el
preciso momento de grabar o borrar su contenido.
Lo
realmente importante para Cobol cuando crea un fichero,
es el tamaño del registro y el de la clave en bytes. El
resto le da igual, incluso la estructura se puede
definir de maneras totalmente diferentes. Para Cobol,
si generamos un fichero con un registro de 128 posiciones, eso es lo que guarda,
si nosotros le indicamos que el nombre ocupa 40 y comienza
en la posición 18 perfecto, pero si la próxima vez le
indicamos otra estructura el también la aceptará.
Un
ejemplo, antes de entrar mas en materia:
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT
FICHERO ASSIGN TO RANDOM "FICHERO.DAT" ORGANIZATION
INDEXED ACCESS DYNAMIC RECORD
KEY KEYAGE. DATA DIVISION. FILE
SECTION. FD FICHERO
LABEL RECORD STANDARD. 01 REGAGE. 02
KEYAGE. 03
CAMPOCODIGO PIC 9(4). 02
CAMPONOMBRE PIC
X(30). 02
CAMPOPOBLACION PIC
X(20).
|
Suponemos
que CAMPONOMBRE = 'UN NOMBRE CUALQUIERA' CAMPOCODIGO
= 1001 CAMPOPOBLACION
= 'UNA LOCALIDAD'
Ahora en otro programa cambiamos la estrutura a por ejemplo:
|
FD FICHERO
LABEL RECORD STANDARD. 01 REGAGE. 02
KEYAGE. 03
CAMPOCLAVE1 PIC 999. 03
CAMPOCLAVE2 PIC
9. 02
CAMPODATO1 PIC
X(10). 02
CAMPODATO2 PIC
X(15). 02
CAMPODATO3 PIC
X(25).
| Como
veis, los tamaños son igual la clave sigue
teniendo 4 y el registro 54 pero la estructura
ha cambiado. Si ahora le decimos que nos
displaye el mismo registro obtendríamos
lo siguiente: CAMPOCLAVE1
= 100 CAMPOCLAVE2
= 1 CAMPODATO1
= 'UN NOMBRE '. CAMPODATO2
= 'CUALQUIERA '. CAMPODATO3
= ' UNA LOCALIDAD'.
He
puesto este ejemplo, porque muchas veces aprendemos las cosas tan literalmente que
pensamos que cambiar algo puede provocar errores.
|
CLAVES ALTERNATIVAS
Las claves alternativas, nos dan la posibilidad de acceder
al fichero indexado por mas de un índice, con lo que la rapidez de acceso se incrementa muchísimo.
¿Por que son necesarias ?
Imaginemos un fichero de ventas, cuya clave es el número de factura, pero en su registro también guardamos
la fecha, el cliente, el artículo, etc ..... Si ahora quisieramos listar todos los registros de ventas
relativos a un solo clientes y no existieran las claves alternativas, tendríamos que leer todo el fichero
para saber de que cliente es cada factura e imprimir solo esos registros.
Pues
bien, con este tipo de claves lo que hacemos es posicionarnos directamente en el cliente en concreto y leer secuencialmente
por esa clave, con lo cual tendremos una relación
de todas sus facturas directamente hasta que el cliente
cambie. En los ejemplos que pondré en esta sección
intentaré que se vea todo esto.
En
la actualidad, las claves alternativas se definen de
manera diferente y no hacen la información redundante,
es decir, antes, si creábamos una clave alternativa,
había que implementar en el registro dicha clave,
con lo que repetiamos los datos y hacíamos el
registro de mayor longitud. Hoy en día eso no
es necesario y las claves se pueden definir en la propia
SELECT con lo cual evitamos la repetición de
campos, espacio y además ganamos en comodidad,
sencillez y comprensión.
Veamos que es lo que he dicho:
ANTES:
SELECT FICHERO ASSIGN TO RANDOM 'FICHERO.DAT ORGANIZATION
INDEXED ACCESS DYNAMIC RECORD KEY
CLAVE ALTERNATE RECORD KEY CLAVE1
WITH DUPLICATES FILE STATUS STA-FICHERO.
FD
FICHERO LABEL RECORD STANDARD. 01
REG-FICHERO. 02
CLAVE. 03
CODIGO PIC 9(5). 02
NOMBRE PIC
X(30). 02
DOMICILIO PIC X(30). 02
POBLACION PIC X(20). 02
CLAVE1. 03
NOMBRE1 PIC X(30).
| Fijaros
como tenemos que repetir dos campos, ocupando
mas espacio y teniendo siempre cuidado de
que ambos estén actualizados a la vez.
|
AHORA:
SELECT
FICHERO ASSIGN TO RANDOM 'FICHERO.DAT ORGANIZATION
INDEXED ACCESS DYNAMIC RECORD KEY
CODIGO ALTERNATE RECORD KEY NOMBRE
WITH DUPLICATES FILE STATUS STA-FICHERO.
FD
FICHERO LABEL RECORD STANDARD. 01
REG-FICHERO. 02
CODIGO PIC 9(5). 02
NOMBRE PIC
X(30). 02
DOMICILIO PIC X(30). 02
POBLACION PIC X(20).
|
Todo es mucho mas claro, la definición
de los ficheros se asemeja mas a los relativos
y en la SELECT es donde se describen las
claves. Si la clave fuera compuesta, es
decir con mas de un campo, haríamos
lo siguiente:
RECORD
KEY CLAVE = CODIGO, NOMBRE
Si
tuvieramos que hacer un START nos dirigiriamos
por la palabra CLAVE, como ese conjunto
de campos.
|
Aquí
termina la primera parte del tema. Antes de continuar,
es necesario tener claro todo lo aquí expuesto
e igualmente si alguien tiene alguna queja o comentario
al respecto que me lo haga llegar.
Siempre
me gusta recordaros que yo soy un programador mas, al
igual que vosotros y por lo tanto, con las mismas dudas,
inquietudes y meteduras de pata.
Continuará...
|
|