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.
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.