Iniciar Sesión

Ver la Versión Completa : [Compilador] No puedo leer archivos.


dariodr
9 de marzo de 2023, 03:50
Buenas coboleros, otra vez por aqui.
Tengo dos codigos: uno para crear y agregar datos a un archivo y otro para leer el archivo, pero a la hora de leer el archivo me aparecen errores. Dejo los dos codigos.
NOTA: Son archivos indexados.

Codigo para crear archivo.
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OPTIONAL EMPLEADOS-ARCHIVO
ASSIGN TO "emple.dat"
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD EMPLEADOS-ARCHIVO.
01 EMPLEADOS-REGISTRO.
05 EMPLEADOS-ID PIC X(6).
05 EMPLEADOS-NOMBRE PIC X(25).
05 EMPLEADOS-APELLIDOS PIC X(35).
05 EMPLEADOS-EDAD PIC X(3).
05 EMPLEADOS-TELEFONO PIC X(9).
05 EMPLEADOS-DIRECCION PIC X(35).
WORKING-STORAGE SECTION.
01 IDENTIFICADOR PIC X(37)
VALUE "Introduce un ID del nuevo empleado: ".
01 NOMBRE PIC X(35)
VALUE "Introduce un nombre del empleado: ".
01 APELLIDOS PIC X(25)
VALUE "Introduce los apellidos: ".
01 EDAD PIC X(20)
VALUE "Introduce la edad: ".
01 TELEFONO PIC X(33)
VALUE "Introduce un numero de telefono: ".
01 DIRECCION PIC X(26)
VALUE "Introduce una direccion: ".
01 SI-NO PIC X.
01 ENTRADA PIC X.

PROCEDURE DIVISION.
INICIO-PROGRAMA.
PERFORM PROCEDIMIENTO-APERTURA.
MOVE "S" TO SI-NO.
PERFORM AGREGAR-REGISTROS UNTIL SI-NO = "N".
PERFORM PROCEDIMIENTO-CIERRE.
FIN-PROGRAMA.
STOP RUN.

PROCEDIMIENTO-APERTURA.
OPEN EXTEND EMPLEADOS-ARCHIVO.

PROCEDIMIENTO-CIERRE.
CLOSE EMPLEADOS-ARCHIVO.

AGREGAR-REGISTROS.
MOVE "N" TO ENTRADA.
PERFORM OBTENER-CAMPOS UNTIL ENTRADA = "S".
PERFORM ESCRIBIR-REGISTRO.
PERFORM REINICIAR.

OBTENER-CAMPOS.
MOVE SPACE TO EMPLEADOS-REGISTRO.
DISPLAY IDENTIFICADOR " ? ".
ACCEPT EMPLEADOS-ID.
DISPLAY NOMBRE " ? ".
ACCEPT EMPLEADOS-NOMBRE.
DISPLAY APELLIDOS " ? ".
ACCEPT EMPLEADOS-APELLIDOS.
DISPLAY EDAD " ? ".
ACCEPT EMPLEADOS-EDAD.
DISPLAY TELEFONO "?".
ACCEPT EMPLEADOS-TELEFONO
DISPLAY DIRECCION.
ACCEPT EMPLEADOS-DIRECCION.
PERFORM CONTINUAR.

CONTINUAR.
MOVE "S" TO ENTRADA.
IF EMPLEADOS-NOMBRE = SPACE
MOVE "N" TO ENTRADA
END-IF.

ESCRIBIR-REGISTRO.
WRITE EMPLEADOS-REGISTRO.

REINICIAR.
DISPLAY "Desea almacenar otro registro s/n".
ACCEPT SI-NO.
IF SI-NO = "s"
MOVE "S" TO SI-NO.
IF SI-NO NOT = "S"
MOVE "N" TO SI-NO.


Codigo para leer archivo
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPLEADOS-ARCHIVO
ASSIGN TO "emple.dat"
ORGANIZATION IS INDEXED
RECORD KEY IS EMPLEADOS-ID
ACCESS MODE IS DYNAMIC.

DATA DIVISION.
FILE SECTION.
FD EMPLEADOS-ARCHIVO.
01 EMPLEADOS-REGISTRO.
05 EMPLEADOS-ID PIC X(6).
05 EMPLEADOS-NOMBRE PIC X(25).
05 EMPLEADOS-APELLIDOS PIC X(35).
05 EMPLEADOS-EDAD PIC X(3).
05 EMPLEADOS-TELEFONO PIC X(9).
05 EMPLEADOS-DIRECCION PIC X(35).
WORKING-STORAGE SECTION.
77 LEE-TODO PIC X.

PROCEDURE DIVISION.
INICIO-PROGRAMA.
PERFORM PROCEDIMIENTO-APERTURA.
MOVE "0" TO LEE-TODO.
PERFORM LEE-SIGUIENTE-REGISTRO.
IF LEE-TODO = "1"
DISPLAY "No se encontraron registros en el archivo."
ELSE
PERFORM MUESTRA-CAMPOS UNTIL LEE-TODO = "1".
PERFORM PROCEDIMIENTO-DE-CIERRE.
STOP RUN.

PROCEDIMIENTO-APERTURA.
OPEN I-O EMPLEADOS-ARCHIVO.

PROCEDIMIENTO-DE-CIERRE.
CLOSE EMPLEADOS-ARCHIVO.

MUESTRA-CAMPOS.
DISPLAY "ID: " EMPLEADOS-ID.
DISPLAY "Nombre: " EMPLEADOS-NOMBRE.
DISPLAY "Apellidos: " EMPLEADOS-APELLIDOS.
DISPLAY "Edad: " EMPLEADOS-EDAD.
DISPLAY "Telefono: " EMPLEADOS-TELEFONO.
DISPLAY "Direccion: " EMPLEADOS-DIRECCION.

LEE-SIGUIENTE-REGISTRO.
READ EMPLEADOS-ARCHIVO NEXT RECORD
AT END MOVE "1" TO LEE-TODO.


Error que aparece en rmcobol
888

JCantero
9 de marzo de 2023, 08:26
@dariodr, dices "NOTA: Son archivos indexados."

No. En el primer código abres un fichero secuencial. En el segundo código abres un fichero indexado.

Revisa eso y cuentanos.....



Cambia el fichero del primer código a indexado. No podrás hacer un "open extend". Tienes que hacer un "open output" si no existe o quieres crearlo de nuevo y un "open i-o" si quieres que permanezca la información que contiene.



Operaciones permitidas en ficheros cobol dependiendo su estructura y modo de apertura:

Dynamic son ficheros indexados.

Random son ficheros relativos ( no los recomiendo )

889


Te recomiendo leas con detenimiento este mantenimiento de fichero de clientes de @FPAIX y que preguntes lo que no entiendas.

[Información] Ejemplos de manejo de archivos y tecla de funcion (https://www.cobolforo.es/showthread.php?1594-Ejemplos-de-manejo-de-archivos-y-tecla-de-funcion)

JCantero
9 de marzo de 2023, 14:37
@dariodr, intensa seguir este ejemplo y me vas preguntando lo que no entiendas para hacer funcionar a tu programa.
[Información] Ejemplo de Mantenimiento para RM/Cobol y OpenCobol (https://www.cobolforo.es/showthread.php?1619-Ejemplo-de-Mantenimiento-para-RM-Cobol-y-OpenCobol&p=8757#post8757)

dariodr
10 de marzo de 2023, 02:12
Hola JCantero, modifique el primer programa para hacerlo en forma secuencial y funciono.
Tambien modifique un poco el segundo programa quedando asi.
Todo funciona perfectamente.
Salu2.

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPLEADOS-ARCHIVO
ASSIGN TO "emple.dat"
ORGANIZATION IS INDEXED
RECORD KEY IS EMPLEADOS-ID
ACCESS MODE IS DYNAMIC.

DATA DIVISION.
FILE SECTION.
FD EMPLEADOS-ARCHIVO.
01 EMPLEADOS-REGISTRO.
05 EMPLEADOS-ID PIC X(6).
05 EMPLEADOS-NOMBRE PIC X(25).
05 EMPLEADOS-APELLIDOS PIC X(35).
05 EMPLEADOS-EDAD PIC X(3).
05 EMPLEADOS-TELEFONO PIC X(9).
05 EMPLEADOS-DIRECCION PIC X(35).
WORKING-STORAGE SECTION.
77 LEE-TODO PIC X VALUE 'N'.

PROCEDURE DIVISION.
INICIO-PROGRAMA.
PERFORM PROCEDIMIENTO-APERTURA.
PERFORM LEE-SIGUIENTE-REGISTRO UNTIL LEE-TODO = 'S'.
PERFORM PROCEDIMIENTO-DE-CIERRE.
STOP RUN.

PROCEDIMIENTO-APERTURA.
OPEN I-O EMPLEADOS-ARCHIVO.

PROCEDIMIENTO-DE-CIERRE.
CLOSE EMPLEADOS-ARCHIVO.

MUESTRA-CAMPOS.
DISPLAY "ID: " EMPLEADOS-ID.
DISPLAY "Nombre: " EMPLEADOS-NOMBRE.
DISPLAY "Apellidos: " EMPLEADOS-APELLIDOS.
DISPLAY "Edad: " EMPLEADOS-EDAD.
DISPLAY "Telefono: " EMPLEADOS-TELEFONO.
DISPLAY "Direccion: " EMPLEADOS-DIRECCION.

LEE-SIGUIENTE-REGISTRO.
READ EMPLEADOS-ARCHIVO NEXT RECORD
AT END
MOVE 'S' TO LEE-TODO
NOT AT END
PERFORM MUESTRA-CAMPOS
END-READ.

Josber
10 de marzo de 2023, 10:23
@dariodr ya le vas pillando un poco el aire al tema, ánimo que no es difícil :):silba:, ahora el problema que tienes es que, si hay más de un registro, te va a "pegar" un pantallazo mostrando los datos y va a ir al siguiente registro, o como es en éste caso, te va a hacer un "scroll" la pantalla, mostrándote un registro tras otro, sin darte tiempo a leerlos, así, hasta que llegues al final del fichero, deberías poner un ACCEPT en LEE-SIGUIENTE-REGISTRO, para que se pare a cada lectura y el operador, tenga que pulsar una tecla para ir al siguiente registro, yo incluiría esto

en la WORKING-STORAGE SECTION

01 TECLA PIC X VALUE SPACES.

y después de END-READ, (al final de LEE-SIGUIENTE-REGISTRO),

DISPLAY "Pulse 'F' para terminar, otra tecla para continuar ... " WITH NO ADVANCING.
ACCEPT TECLA.
DISPLAY " ". *> Éste DSIPLAY, es para que haya una línea de separación entre registros
IF TECLA = "F" OR TECLA = "f"
MOVE "S" TO LEE-TODO
ELSE
MOVE SPACES TO TECLA LEE-TODO
END-IF.

Un salu2.-