Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   GnuCOBOL (OpenCOBOL) (https://www.cobolforo.es/forumdisplay.php?f=90)
-   -   [Sintaxis] Problema al leer siguiente registro (https://www.cobolforo.es/showthread.php?t=1814)

Sergio 10 de diciembre de 2024 14:03

Problema al leer siguiente registro
 
3 Archivos Adjunto(s)
Buenos días,

Hace unas semanas realicé un curso de COBOL en Udemy y quiero practicar y aprender más sobre el lenguaje de programación COBOL.

Estoy intentando realizar un ejercicio muy básico pero no consigo que lea el siguiente registro de mi archivo de entrada. Cuando lee el 1er registro reconoce que es el final del archivo en la parte de "AT END" del READ. El objetivo es recorrer el fichero y grabarlo en el fichero de salida en forma de tabla.

Comparto código y fichero entrada y salida. Tengo entendido que en el fichero de entrada tiene que estar todo en una línea para que lo reconozca. Estoy usando el compilador OpenCobolIDE en Windows. No sé si hay compiladores más potentes que se usen más en el día a día.

Código COBOL:
  1.        IDENTIFICATION DIVISION.
  2.        PROGRAM-ID.                  SeqReadNo88.
  3.       *>AUTHOR.                    SERGIO.
  4.       *>INSTALLATION.              CURSO COBOL.
  5.       *>DATE-WRITTEN.              26/09/2024.
  6.       *>DATE-COMPILED.
  7.       *>SECURITY.                  NO ES CONFIDENCIAL.
  8.       *>--------------------------------------------------------------*
  9.       *>OBJETIVO:LEER FICHERO Y VOLCAR DATOS EN FICHERO DE SALIDA     *
  10.       *>--------------------------------------------------------------*
  11.  
  12.        ENVIRONMENT DIVISION.
  13.        CONFIGURATION SECTION.
  14.        SOURCE-COMPUTER.           IBM-3083.
  15.        OBJECT-COMPUTER.           IBM-3083.
  16.  
  17.        INPUT-OUTPUT SECTION.
  18.        FILE-CONTROL.
  19.            SELECT STUDENT ASSIGN TO "C:\COBOL\Archivos\1.STUDENTS.txt".
  20.            SELECT REPORTE ASSIGN TO "C:\COBOL\Archivos\REPORTE1.txt".
  21.  
  22.        DATA DIVISION.
  23.        FILE SECTION.
  24.        FD  STUDENT
  25.         *>LABEL RECORDS ARE STANDARD
  26.            RECORD CONTAINS 60 CHARACTERS
  27.            BLOCK CONTAINS 0 RECORDS.
  28.         *>DATA RECORD IS REG_EMPLEADOS.
  29.        01  REG-STUDENT            PIC X(60).
  30.        FD  REPORTE
  31.         *>LABEL RECORDS ARE STANDARD
  32.            RECORD CONTAINS 400 CHARACTERS
  33.            BLOCK CONTAINS 0 RECORDS.
  34.         *>DATA RECORD IS REG_REPORTE.
  35.        01  REG-REPORTE     PIC X(400).
  36.  
  37.        WORKING-STORAGE SECTION.
  38.        01  STUDENT-DETALLE.
  39.            05 STUDENT-ID   PIC 9(7).
  40.            05 NOMBRE       PIC X(8).
  41.            05 INITIALS     PIC X(2).
  42.            05 DATEOFBIRTH.
  43.               06 YEAR      PIC 9(4).
  44.               06 MONTH     PIC 9(2).
  45.               06 DIA       PIC 9(2).
  46.            05 COURSE-ID    PIC X(4).
  47.            05 GENDER       PIC X(1).
  48.  
  49.        01  SW-FIN          PIC X(3) VALUE SPACES.
  50.  
  51.        01  WS-TITULO-1.
  52.            05 FILLER      PIC X(45) VALUE SPACES.
  53.            05 WS-TIT      PIC X(16) VALUE "DATOS DE ALUMNOS".
  54.            05 FILLER      PIC X(27) VALUE SPACES.
  55.  
  56.        01  WS-GUIONES.
  57.            05 FILLER       PIC X(1)  VALUE SPACES.
  58.            05 FILLER       PIC X(120) VALUE ALL "-".
  59.            05 FILLER       PIC X(1)  VALUE SPACES.
  60.  
  61.        01  WS-TITULO-2.
  62.            05 FILLER       PIC X(04) VALUE SPACES.
  63.            05 NUMERO       PIC X(6)  VALUE "NUMERO".
  64.            05 FILLER       PIC X(20) VALUE SPACES.
  65.            05 APELLIDO     PIC X(8)  VALUE "APELLIDO".
  66.            05 FILLER       PIC X(10) VALUE SPACES.
  67.            05 INICIALES    PIC X(9)  VALUE "INICIALES".
  68.            05 FILLER       PIC X(10) VALUE SPACES.
  69.            05 DATESOFBIRTH PIC X(14) VALUE "AÑO NACIMIENTO".
  70.            05 FILLER       PIC X(10) VALUE SPACES.
  71.            05 CODIGOCURSO  PIC X(12) VALUE "CODIGO CURSO".
  72.            05 FILLER       PIC X(10) VALUE SPACES.
  73.            05 GENERO       PIC X(12) VALUE "GENERO".
  74.  
  75.        01  WS-STUDENT-DETALLE.
  76.            05 FILLER           PIC X(04) VALUE SPACES.
  77.            05 WS-STUDENT-ID    PIC 9(7).
  78.            05 FILLER           PIC X(20) VALUE SPACES.
  79.            05 WS-STUDENT-NAME  PIC X(8).
  80.            05 FILLER           PIC X(13) VALUE SPACES.
  81.            05 WS-INITIALS      PIC X(2).
  82.            05 FILLER           PIC X(16) VALUE SPACES.
  83.            05 WS-DATEOFBIRTH.
  84.               10 YEAR          PIC 9(4).
  85.               10 MONTH         PIC 9(2).
  86.               10 DIA           PIC 9(2).
  87.            05 FILLER           PIC X(18) VALUE SPACES.
  88.            05 WS-COURSE-ID     PIC X(4).
  89.            05 FILLER           PIC X(16) VALUE SPACES.
  90.            05 WS-GENDER        PIC X(1).
  91.  
  92.        LINKAGE SECTION.
  93.  
  94.        PROCEDURE DIVISION.
  95.        010-INICIO.
  96.            PERFORM 020-ABRE-ARCHIVOS THRU 020-FIN
  97.            PERFORM 030-TITULOS       THRU 030-FIN
  98.            PERFORM 040-LEE           THRU 040-FIN
  99.            PERFORM 040-PROCESO       THRU 040-FIN
  100.                    UNTIL SW-FIN EQUAL "FIN".
  101.            PERFORM 050-FINAL         THRU 050-FIN
  102.            GOBACK.
  103.  
  104.        020-ABRE-ARCHIVOS.
  105.            OPEN INPUT STUDENT
  106.                 OUTPUT REPORTE.
  107.        020-FIN. EXIT.
  108.  
  109.        030-TITULOS.
  110.            WRITE REG-REPORTE FROM WS-TITULO-1 AFTER ADVANCING 1
  111.            WRITE REG-REPORTE FROM WS-GUIONES AFTER ADVANCING 1
  112.            WRITE REG-REPORTE FROM WS-TITULO-2 AFTER ADVANCING 1
  113.            WRITE REG-REPORTE FROM WS-GUIONES AFTER ADVANCING 1.
  114.        030-FIN. EXIT.
  115.  
  116.        040-PROCESO.
  117.            MOVE STUDENT-ID TO WS-STUDENT-ID
  118.            MOVE NOMBRE TO WS-STUDENT-NAME
  119.            MOVE INITIALS TO WS-INITIALS
  120.            MOVE DATEOFBIRTH TO WS-DATEOFBIRTH
  121.            MOVE COURSE-ID TO WS-COURSE-ID
  122.            MOVE GENDER TO WS-GENDER
  123.  
  124.            *>DISPLAY WS-STUDENT-NAME.
  125.           *>DISPLAY REG-STUDENT.
  126.            WRITE REG-REPORTE FROM WS-STUDENT-DETALLE AFTER ADVANCING 1.
  127.  
  128.            *>DISPLAY WS-STUDENT-DETALLE
  129.           *>DISPLAY "VALOR ES " SW-FIN.
  130.  
  131.        040-LEE.
  132.            READ STUDENT INTO STUDENT-DETALLE AT END
  133.                 MOVE "FIN" TO SW-FIN.
  134.  
  135.        040-FIN. EXIT.
  136.  
  137.        050-FINAL.
  138.           *>DISPLAY SW-FIN
  139.            CLOSE STUDENT REPORTE.
  140.        050-FIN. EXIT.

Kuk 10 de diciembre de 2024 18:13

@Sergio, lo primero, el código es mejor publicarlo directamente en tu post para que sea visible sin necesidad de descargar archivos.

Declara los ficheros de la siguiente manera (aquí lo importante es la palabra clave "LINE"):
Código COBOL:
  1.        INPUT-OUTPUT SECTION.
  2.        FILE-CONTROL.
  3.            SELECT STUDENT ASSIGN TO "STUDENTS.txt"
  4.            ORGANIZATION LINE SEQUENTIAL.
  5.            SELECT REPORTE ASSIGN TO "REPORTE1.txt"
  6.            ORGANIZATION LINE SEQUENTIAL.
  7.  
  8.        DATA DIVISION.
  9.        FILE SECTION.
  10.        FD  STUDENT.
  11.        01  REG-STUDENT     PIC X(60).
  12.        FD  REPORTE.
  13.        01  REG-REPORTE     PIC X(400).

Si quieres ver lo que está leyendo, la parte del READ la puedes modificar así:
Código COBOL:
  1.        040-LEE.
  2.            READ STUDENT INTO STUDENT-DETALLE
  3.                AT  END
  4.                    MOVE "FIN" TO SW-FIN
  5.                
  6.                NOT AT END
  7.                    DISPLAY STUDENT-DETALLE
  8.            END-READ
  9.            .

Sergio 10 de diciembre de 2024 18:38

Buenas tardes @Kuk,

Muchas gracias por el aporte. Es mi 1er foro :verg:

He realizado los cambios en la INPUT-OUTPUT SECTION y DATA DIVSION

Código COBOL:
  1. INPUT-OUTPUT SECTION.
  2. FILE-CONTROL.
  3.     SELECT STUDENT ASSIGN TO "STUDENTS.txt"
  4.     ORGANIZATION LINE SEQUENTIAL.
  5.     SELECT REPORTE ASSIGN TO "REPORTE1.txt"
  6.     ORGANIZATION LINE SEQUENTIAL.
  7.  
  8. DATA DIVISION.
  9. FILE SECTION.
  10. FD  STUDENT.
  11. 01  REG-STUDENT     PIC X(60).
  12. FD  REPORTE.
  13. 01  REG-REPORTE     PIC X(400).

Sin embargo sigue sin leer el 2o registro. Lee el primer registro y parece que no llega a leer el 2o, no aparece en el display del AT END ni NOT AT END que he puesto para controlar que registro está leyendo. En el fichero de entrada están ambos registros en la misma línea. El fichero de entrada tenía 32 registros. Lo acorté a 2 para comprobar porque no estaba leyendo el siguiente registro.

No sé que falta para que reconozca el 2º registro.

Kuk 10 de diciembre de 2024 18:46

@Sergio,

El fichero que has colgado en tu primer post son 32 registros. Si es el mismo que usas, debería funcionar, a mi me funciona bien, lo he probado con el mismo compilador.

Ojo, en tu código el fichero de entrada se llama "1.STUDENTS.txt" mientras que el fichero que has colgado se llama "STUDENTS.txt".
Creo que se te ha colado lo del "1.".

También no uses caminos completos, sólo con el nombre del fichero vale, los tomara/creará en el mismo directorio que el programa.


La franja horaria es GMT +2. Ahora son las 02:00.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.