Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol COBOL - General
COBOL - General Discusiones de temática general sobre el lenguaje COBOL y todo lo relacionado con él.
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
No puedo crear un archivo indexado CHITOBLA GnuCOBOL (OpenCOBOL) 42 7 de diciembre de 2022 10:34
[Sintaxis] Crear archivo indexado desde un XLS Anthony AcuCobol 10 6 de agosto de 2019 17:35
[Sintaxis] Lectura archivo secuencial Gatomalo PowerCOBOL v3 (V3L10, Win32) 11 28 de agosto de 2018 20:21
[Sintaxis] Error de lectura en archivo jmeza PowerCOBOL (ActiveX, v4 - v11) 2 12 de diciembre de 2017 12:13
[Sintaxis] Grabación/Lectura archivo de configuración Dasije WinDev 0 8 de septiembre de 2016 01:04

Respuesta
 
Herramientas

  #1
Antiguo 11 de abril de 2024, 05:51
JonathanDemons_123
Acabo de llegar...
Última Actividad 08.10.2024 05:12
Posts Posts: 4
Likes enviados Enviados: 1
Likes recibidos Recibidos: 0
Base de datos Ayuda con lectura de archivo indexado
0 Inactivo Inactivo

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.
JonathanDemons_123 is offline   Responder Con Cita
  #2
Antiguo 11 de abril de 2024, 12:17
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 19.09.2026 12:26
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

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:

Código COBOL:
  1. WORKING-STORAGE SECTION.
  2. 01  EOF                    PIC 9.
  3. 01  STFILE                PIC XX.      *> FILE-STATUS del fichero
  4. .
  5. .
  6. .
  7. PROCEDURE DIVISION.
  8. INICIO.
  9.      MOVE 333 TO NUMKEY.
  10.      INITIALIZE EOF.
  11.      OPEN INPUT FICHERO.
  12.      PERFORM POSICIONAR.
  13.      PERFORM LEER UNTIL EOF = 1.
  14.      CLOSE FICHERO.
  15.      STOP RUN.
  16. POSICIONAR.
  17.      START FICHERO
  18.                KEY NOT LESS NUMKEY
  19.                      INVALID KEY DISPLAY "Error de posicionamiento... " STFILE
  20.                                   CLOSE FICHERO
  21.                                   STOP RUN
  22.      END-START.
  23. LEER.
  24.      READ FICHERO
  25.               NEXT RECORD
  26.                       AT END
  27.                           MOVE 1 TO EOF
  28.                           DISPLAY "Fin fichero ..."
  29.                       NOT AT END
  30.                              PERFORM HACER-COSAS THRU FIN-HACER
  31.      END-READ.
  32. HACER-COSAS.
  33. .
  34. .
  35. .
  36. .
  37. .
  38. HACER-MAS-COSAS.
  39. .
  40. .
  41. .
  42. .
  43. FIN-HACER.
  44.     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.
Josber is offline   Responder Con Cita
  #3
Antiguo 11 de abril de 2024, 21:20
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@JonathanDemons_123, para la próxima vez publica también tu código, así te podremos ayudar mejor



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #4
Antiguo 15 de abril de 2024, 05:01
JonathanDemons_123
Acabo de llegar...
Última Actividad 08.10.2024 05:12
Posts Posts: 4
Likes enviados Enviados: 1
Likes recibidos Recibidos: 0

Citación del post de Josber Ver Mensaje
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:

Código COBOL:
  1. WORKING-STORAGE SECTION.
  2. 01  EOF                    PIC 9.
  3. 01  STFILE                PIC XX.      *> FILE-STATUS del fichero
  4. .
  5. .
  6. .
  7. PROCEDURE DIVISION.
  8. INICIO.
  9.      MOVE 333 TO NUMKEY.
  10.      INITIALIZE EOF.
  11.      OPEN INPUT FICHERO.
  12.      PERFORM POSICIONAR.
  13.      PERFORM LEER UNTIL EOF = 1.
  14.      CLOSE FICHERO.
  15.      STOP RUN.
  16. POSICIONAR.
  17.      START FICHERO
  18.                KEY NOT LESS NUMKEY
  19.                      INVALID KEY DISPLAY "Error de posicionamiento... " STFILE
  20.                                   CLOSE FICHERO
  21.                                   STOP RUN
  22.      END-START.
  23. LEER.
  24.      READ FICHERO
  25.               NEXT RECORD
  26.                       AT END
  27.                           MOVE 1 TO EOF
  28.                           DISPLAY "Fin fichero ..."
  29.                       NOT AT END
  30.                              PERFORM HACER-COSAS THRU FIN-HACER
  31.      END-READ.
  32. HACER-COSAS.
  33. .
  34. .
  35. .
  36. .
  37. .
  38. HACER-MAS-COSAS.
  39. .
  40. .
  41. .
  42. .
  43. FIN-HACER.
  44.     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???
JonathanDemons_123 is offline   Responder Con Cita
  #5
Antiguo 15 de abril de 2024, 08:46
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 19.09.2026 12:26
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

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.-
Josber is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:09.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.