PDA

Ver la Versión Completa : [Sintaxis] Problema al leer siguiente registro


Sergio
10 de diciembre de 2024, 14:03
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.


IDENTIFICATION DIVISION.
PROGRAM-ID. SeqReadNo88.
*>AUTHOR. SERGIO.
*>INSTALLATION. CURSO COBOL.
*>DATE-WRITTEN. 26/09/2024.
*>DATE-COMPILED.
*>SECURITY. NO ES CONFIDENCIAL.
*>--------------------------------------------------------------*
*>OBJETIVO:LEER FICHERO Y VOLCAR DATOS EN FICHERO DE SALIDA *
*>--------------------------------------------------------------*

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-3083.
OBJECT-COMPUTER. IBM-3083.

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO "C:\COBOL\Archivos\1.STUDENTS.txt".
SELECT REPORTE ASSIGN TO "C:\COBOL\Archivos\REPORTE1.txt".

DATA DIVISION.
FILE SECTION.
FD STUDENT
*>LABEL RECORDS ARE STANDARD
RECORD CONTAINS 60 CHARACTERS
BLOCK CONTAINS 0 RECORDS.
*>DATA RECORD IS REG_EMPLEADOS.
01 REG-STUDENT PIC X(60).
FD REPORTE
*>LABEL RECORDS ARE STANDARD
RECORD CONTAINS 400 CHARACTERS
BLOCK CONTAINS 0 RECORDS.
*>DATA RECORD IS REG_REPORTE.
01 REG-REPORTE PIC X(400).

WORKING-STORAGE SECTION.
01 STUDENT-DETALLE.
05 STUDENT-ID PIC 9(7).
05 NOMBRE PIC X(8).
05 INITIALS PIC X(2).
05 DATEOFBIRTH.
06 YEAR PIC 9(4).
06 MONTH PIC 9(2).
06 DIA PIC 9(2).
05 COURSE-ID PIC X(4).
05 GENDER PIC X(1).

01 SW-FIN PIC X(3) VALUE SPACES.

01 WS-TITULO-1.
05 FILLER PIC X(45) VALUE SPACES.
05 WS-TIT PIC X(16) VALUE "DATOS DE ALUMNOS".
05 FILLER PIC X(27) VALUE SPACES.

01 WS-GUIONES.
05 FILLER PIC X(1) VALUE SPACES.
05 FILLER PIC X(120) VALUE ALL "-".
05 FILLER PIC X(1) VALUE SPACES.

01 WS-TITULO-2.
05 FILLER PIC X(04) VALUE SPACES.
05 NUMERO PIC X(6) VALUE "NUMERO".
05 FILLER PIC X(20) VALUE SPACES.
05 APELLIDO PIC X(8) VALUE "APELLIDO".
05 FILLER PIC X(10) VALUE SPACES.
05 INICIALES PIC X(9) VALUE "INICIALES".
05 FILLER PIC X(10) VALUE SPACES.
05 DATESOFBIRTH PIC X(14) VALUE "AÑO NACIMIENTO".
05 FILLER PIC X(10) VALUE SPACES.
05 CODIGOCURSO PIC X(12) VALUE "CODIGO CURSO".
05 FILLER PIC X(10) VALUE SPACES.
05 GENERO PIC X(12) VALUE "GENERO".

01 WS-STUDENT-DETALLE.
05 FILLER PIC X(04) VALUE SPACES.
05 WS-STUDENT-ID PIC 9(7).
05 FILLER PIC X(20) VALUE SPACES.
05 WS-STUDENT-NAME PIC X(8).
05 FILLER PIC X(13) VALUE SPACES.
05 WS-INITIALS PIC X(2).
05 FILLER PIC X(16) VALUE SPACES.
05 WS-DATEOFBIRTH.
10 YEAR PIC 9(4).
10 MONTH PIC 9(2).
10 DIA PIC 9(2).
05 FILLER PIC X(18) VALUE SPACES.
05 WS-COURSE-ID PIC X(4).
05 FILLER PIC X(16) VALUE SPACES.
05 WS-GENDER PIC X(1).

LINKAGE SECTION.

PROCEDURE DIVISION.
010-INICIO.
PERFORM 020-ABRE-ARCHIVOS THRU 020-FIN
PERFORM 030-TITULOS THRU 030-FIN
PERFORM 040-LEE THRU 040-FIN
PERFORM 040-PROCESO THRU 040-FIN
UNTIL SW-FIN EQUAL "FIN".
PERFORM 050-FINAL THRU 050-FIN
GOBACK.

020-ABRE-ARCHIVOS.
OPEN INPUT STUDENT
OUTPUT REPORTE.
020-FIN. EXIT.

030-TITULOS.
WRITE REG-REPORTE FROM WS-TITULO-1 AFTER ADVANCING 1
WRITE REG-REPORTE FROM WS-GUIONES AFTER ADVANCING 1
WRITE REG-REPORTE FROM WS-TITULO-2 AFTER ADVANCING 1
WRITE REG-REPORTE FROM WS-GUIONES AFTER ADVANCING 1.
030-FIN. EXIT.

040-PROCESO.
MOVE STUDENT-ID TO WS-STUDENT-ID
MOVE NOMBRE TO WS-STUDENT-NAME
MOVE INITIALS TO WS-INITIALS
MOVE DATEOFBIRTH TO WS-DATEOFBIRTH
MOVE COURSE-ID TO WS-COURSE-ID
MOVE GENDER TO WS-GENDER

*>DISPLAY WS-STUDENT-NAME.
*>DISPLAY REG-STUDENT.
WRITE REG-REPORTE FROM WS-STUDENT-DETALLE AFTER ADVANCING 1.

*>DISPLAY WS-STUDENT-DETALLE
*>DISPLAY "VALOR ES " SW-FIN.

040-LEE.
READ STUDENT INTO STUDENT-DETALLE AT END
MOVE "FIN" TO SW-FIN.

040-FIN. EXIT.

050-FINAL.
*>DISPLAY SW-FIN
CLOSE STUDENT REPORTE.
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"):
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO "STUDENTS.txt"
ORGANIZATION LINE SEQUENTIAL.
SELECT REPORTE ASSIGN TO "REPORTE1.txt"
ORGANIZATION LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 REG-STUDENT PIC X(60).
FD REPORTE.
01 REG-REPORTE PIC X(400).


Si quieres ver lo que está leyendo, la parte del READ la puedes modificar así:

040-LEE.
READ STUDENT INTO STUDENT-DETALLE
AT END
MOVE "FIN" TO SW-FIN

NOT AT END
DISPLAY STUDENT-DETALLE
END-READ
.

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


INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO "STUDENTS.txt"
ORGANIZATION LINE SEQUENTIAL.
SELECT REPORTE ASSIGN TO "REPORTE1.txt"
ORGANIZATION LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 REG-STUDENT PIC X(60).
FD REPORTE.
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.