|
 |
 |
Registros / Fichero
(1251 palabras totales en este texto) (21409 Lecturas) 
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. | |
|
|