Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Ayuda con lectura de archivo indexado


JonathanDemons_123
11 de abril de 2024, 05:51
Buenas noches mis compas:

Estoy aprendiendo cobol, pero requiero abrir un archivo indexado este archivo tiene clave primaria y secundaria, pero hay unos conceptos que no me quedan claros.


Ya declare en FILE-CONTROL, con select mi archivo indexado.
En DATA DIVISION paso la extructura de mi archivo indexado.
En PROCEDURE DIVISION., tengo 2 perform uno READ, para leer el archivo y otro START para aprovechar las claves primarias.

Una de mis dudas, es primero start y despues el read???
Yo para leer el archivo utilizo Perform leer until, para leer todo el archivo, pero en que momento voy haciendo mi incremental de mi variable, que utilizo en el perform, porque solo me lee un registro.

Josber
11 de abril de 2024, 12:17
Hola @JonathanDemons_123,

A ver, sí, por supuesto que primero un START y después un READ, por lógica, primero posicionas el "puntero" en el lugar que quieres y después haces la lectura. Sin ver el código, te lee un sólo registro, porque haces un READ normal y corriente, y tienes que hacer el READ con un NEXT/PREVIOUS, en los que no hace falta incrementar nada, el propio compilador es el que se encarga de ir hacia adelante o hacia atrás de forma automática, (depende del parámetro usado), la manera más sencilla de hacerlo es:

Vamos a suponer que tienes un fichero con 500 registros, numerados del 1 al 500 consecutivos y, que quieres leer a partir del registro 333 hasta el último:


WORKING-STORAGE SECTION.
01 EOF PIC 9.
01 STFILE PIC XX. *> FILE-STATUS del fichero
.
.
.
PROCEDURE DIVISION.
INICIO.
MOVE 333 TO NUMKEY.
INITIALIZE EOF.
OPEN INPUT FICHERO.
PERFORM POSICIONAR.
PERFORM LEER UNTIL EOF = 1.
CLOSE FICHERO.
STOP RUN.
POSICIONAR.
START FICHERO
KEY NOT LESS NUMKEY
INVALID KEY DISPLAY "Error de posicionamiento... " STFILE
CLOSE FICHERO
STOP RUN
END-START.
LEER.
READ FICHERO
NEXT RECORD
AT END
MOVE 1 TO EOF
DISPLAY "Fin fichero ..."
NOT AT END
PERFORM HACER-COSAS THRU FIN-HACER
END-READ.
HACER-COSAS.
.
.
.
.
.
HACER-MAS-COSAS.
.
.
.
.
FIN-HACER.
EXIT.


Si cambias NEXT por PREVIOUS, leerá el fichero al revés y, cuando llegue al principio, (sentencia AT END), terminará la lectura, aunque, no todos los compiladores, soportan la cláusula de lectura inversa

Un saludo y, si tienes más dudas, ya sabes por donde andamos.

Kuk
11 de abril de 2024, 21:20
@JonathanDemons_123, para la próxima vez publica también tu código, así te podremos ayudar mejor ;)

JonathanDemons_123
15 de abril de 2024, 05:01
Hola @JonathanDemons_123,

A ver, sí, por supuesto que primero un START y después un READ, por lógica, primero posicionas el "puntero" en el lugar que quieres y después haces la lectura. Sin ver el código, te lee un sólo registro, porque haces un READ normal y corriente, y tienes que hacer el READ con un NEXT/PREVIOUS, en los que no hace falta incrementar nada, el propio compilador es el que se encarga de ir hacia adelante o hacia atrás de forma automática, (depende del parámetro usado), la manera más sencilla de hacerlo es:

Vamos a suponer que tienes un fichero con 500 registros, numerados del 1 al 500 consecutivos y, que quieres leer a partir del registro 333 hasta el último:


WORKING-STORAGE SECTION.
01 EOF PIC 9.
01 STFILE PIC XX. *> FILE-STATUS del fichero
.
.
.
PROCEDURE DIVISION.
INICIO.
MOVE 333 TO NUMKEY.
INITIALIZE EOF.
OPEN INPUT FICHERO.
PERFORM POSICIONAR.
PERFORM LEER UNTIL EOF = 1.
CLOSE FICHERO.
STOP RUN.
POSICIONAR.
START FICHERO
KEY NOT LESS NUMKEY
INVALID KEY DISPLAY "Error de posicionamiento... " STFILE
CLOSE FICHERO
STOP RUN
END-START.
LEER.
READ FICHERO
NEXT RECORD
AT END
MOVE 1 TO EOF
DISPLAY "Fin fichero ..."
NOT AT END
PERFORM HACER-COSAS THRU FIN-HACER
END-READ.
HACER-COSAS.
.
.
.
.
.
HACER-MAS-COSAS.
.
.
.
.
FIN-HACER.
EXIT.


Si cambias NEXT por PREVIOUS, leerá el fichero al revés y, cuando llegue al principio, (sentencia AT END), terminará la lectura, aunque, no todos los compiladores, soportan la cláusula de lectura inversa

Un saludo y, si tienes más dudas, ya sabes por donde andamos.

Gracias hoy estuve practicando, estuve leyendo de la setencia de start y en la documentacion encontre que
>
>=
<
<=
=
!=
Que solo hay estas opciones, pero ahi viendo como esta el archivo requiero una clase de Between, algo asi
sea >= y <=
ha cierto rango, se puede, con el start???

O tendria que hacer doble start, es decir, uno que sea >= este seria el start1 y otro <= seria el start2???

Josber
15 de abril de 2024, 08:46
No, no existe el BETWEEN como en SQL por ejemplo, y tampoco puedes hacer un "doble START", porque prevalece siempre el último que hagas. La única manera de hacerlo es primero con un START >= y después, en el READ en la parte de NOT AT END, añades al principio el comparar el registro leído con el registro máximo, y si coincide o es superior, mover 1 a EOF, no sé si me explico bien.

Un salu2.-