Registros / Fichero
En infinidad de ocasiones nos es necesario saber la cantidad de registros que tiene un fichero indexado. Casi siempre la manera mas fácil de saberlo es haciendo una lectura secuencial completa. Eso con pequeños ficheros es válido, pero; ¿y si tenemos que saber los registros de un fichero enorme?.

La respuesta está en este truco que nos ha hecho llegar nuestro amigo Artur Potau. Os tengo que decir que solo es válida para ficheros indexados de RM/cobol o de FujitsuCobol (PowerCobol).

Estos compiladores guardan dicha información en la primera linea de nuestro fichero, de hecho si hacemos un type o vemos su contenido con algún editor, observamos que al principio mete información que no es nuestra. Por lo tanto lo que tenemos que hacer es leer el fichero como secuencial e ir directamente a la posición donde la guarda.

El programa necesario para hacer dicha labor sería el siguiente:

IDENTIFICATION DIVISION.
PROGRAM-ID. REGISTROS.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
       SELECT FICHERO ASSIGN TO RANDOM
'el_nombre_del_fichero'
       ORGANIZATION SEQUENTIAL
       ACCESS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FICHERO.
01  REG-FICHERO.
     02  FILLER       PIC X(46).
     02  NUMREG    PIC 9(15) BINARY.
WORKING-STORAGE SECTION.
01  NUMEROS       PIC 9(8).
01  OP                PIC X.
PROCEDURE DIVISION.
INICIO.
    OPEN INPUT FICHERO.
    READ FICHERO.
    MOVE NUMREG TO NUMEROS.
    DISPLAY NUMEROS LINE 10 ERASE.
    CLOSE FICHERO.
    ACCEPT OP LINE 20.
    STOP RUN. 


Solo debeis cambiar 'el_nombre_del_fichero' por el fichero sobre el que queráis hacer la comprobación y listo, increible pero cierto. Fijaros que en la FD depreciamos los primeros 46 caracteres con un FILLER y luego ponemos una variable binaria, porque así es como el gestor de ficheros guarda la información.

A continuación abrimos el fichero leemos el primer registro correspondiente a la primera línea y movemos ese valor binario a una variable numérica. Ya solo nos queda mostrarlo.

Lo mas lógico, para esto, sería que esta rutina fuera llamada a su vez por el programa que deseemos, resultando entonces que las variables (nombre de fichero y número de registros las asignariamos en la LINKAGE) y solo tendriamos que pasar el valor y el nos devolvería el número de registros.

Quedaría así:

IDENTIFICATION DIVISION.
PROGRAM-ID. REGISTROS.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
       SELECT FICHERO ASSIGN TO RANDOM NOMBREFICHERO
       ORGANIZATION SEQUENTIAL
       ACCESS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FICHERO.
01  REG-FICHERO.
     02  FILLER       PIC X(46).
     02  NUMREG    PIC 9(15) BINARY.
LINKAGE SECTION.
77  NOMBREFICHERO   PIC X(30).
77  NUMEROREGISTROS PIC 9(9).
PROCEDURE DIVISION USING NOMBREFICHERO NUMEROREGISTROS.
INICIO.
    OPEN INPUT FICHERO.
    READ FICHERO.
    MOVE NUMREG TO NUMEROREGISTROS.
    CLOSE FICHERO.
    GOBACK.


Al volver del CALL, la variable NUMEROREGISTROS nos dará el valor correcto.




Este artículo proviene de Cobol en español
http://www.escobol.com

La dirección de esta noticia es:
http://www.escobol.com/modules.php?name=Sections&op=viewarticle&artid=90