Marengo97
30 de julio de 2023, 04:43
Hola, estoy escribiendo un programa que contiene un registro de libros para agregar, quitar, buscar, etc.. todo iba bien hasta que escribi la seccion de file status para que el programa
pueda saber si es necesario crear un archivo en caso que este no existe, se que puedo hacer funcionar el programa sin hacer esto pero como una buena practica quiero aprender a usar los file status.
El problema en cuestion esta al ingresar en la opcion 3,en el parrafo VER-LIBROS coloque un if para determinar si F-NOEXISTE-REG es TRUE disparar un mensaje de error, y en caso que no,que proceda a leer el archivo y mostrar todo lo que contiene, si elimino el archivo y presiono 3 me muestra ese error a la perfeccion pero si creo el archivo o el archivo ya existe de antemano luego no ingresa a la seccion 3, o simplemente se saltea el if o simplemente no me muestra ningun libro a pesar de haber ingresado algunos.
Aqui dejo mi codigo, cualquier ayuda, consejo, cosa que mejorar se agradece..
IDENTIFICATION DIVISION.
PROGRAM-ID. LIBRERIA.
AUTHOR. LUCAS GALEANO.
DATE-WRITTEN 9/7/2023.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT REG-LIBROS ASSIGN TO "REGISTRO-LIBROS.DAT"
ORGANIZATION IS INDEXED
RECORD KEY IS LIBRO-ID
ACCESS MODE IS DYNAMIC
file status FS-REGISTRO-LIBROS.
DATA DIVISION.
FILE SECTION.
FD REG-LIBROS.
01 DATOS-LIBRO.
05 LIBRO-ID PIC 999 VALUE ZEROS.
05 NOMBRE PIC X(20) VALUE SPACES.
05 EDITORIAL PIC X(20) VALUE SPACES.
05 ESTADO PIC X(12) VALUE SPACES.
*05 FECHA-INGRESO.
* 10 DIA PIC 99 VALUE ZEROS.
* 10 MES PIC X(10) VALUE SPACES.
* 10 AÑO PIC 9999 VALUE ZEROS.
* 05 FECHA-ALQUILER.
* 10 DDIA PIC 99 VALUE ZEROS.
* 10 MMES PIC X(10) VALUE SPACES.
* 10 AAÑO PIC 9999 VALUE ZEROS.
WORKING-STORAGE SECTION.
*Codigos de error del archivo.
01 FS-REGISTRO-LIBROS PIC XX.
88 ESTA-REG VALUE "00" "02".
88 N-ESTA-REG VALUE "23".
88 F-NOEXISTE-REG VALUE "35".
*Variables del programa.
77 CONTINUAR PIC X.
77 CONTINUAR-REG PIC X.
77 OPC PIC X VALUE SPACES.
77 LIMPIAR PIC X(80) VALUE SPACES.
77 N PIC 99.
PROCEDURE DIVISION.
DECLARATIVES.
FILE-ERROR SECTION.
USE AFTER STANDARD ERROR PROCEDURE ON REG-LIBROS.
IF FS-REGISTRO-LIBROS EQUALS "35" THEN
SET F-NOEXISTE-REG TO TRUE
END-IF.
END DECLARATIVES.
MENU.
PERFORM UNTIL CONTINUAR = "N"
PERFORM LIMPIAR-PANTALLA
DISPLAY "ADMINISTRADOR DE CATALOGO" AT LINE 1 COL 1 WITH
REVERSE-VIDEO
DISPLAY " " AT LINE 3 COL 1
DISPLAY "1.Registrar libro" AT LINE 4 COL 1
DISPLAY "2.Eliminar libro" AT LINE 5 COL 1
DISPLAY "3.Ver catalogo" AT LINE 6 COL 1
DISPLAY "4.Crear nuevo registro" AT LINE 7 COL 1
DISPLAY "0.Salir" AT LINE 8 COL 1
DISPLAY " " AT LINE 9 COL 1
DISPLAY "Ingrese tecla ( )" AT LINE 10 COL 1 WITH
REVERSE-VIDEO
ACCEPT OPC AT LINE 10 COL 16 WITH
PROMPT UNDERLINE
EVALUATE OPC
WHEN 1 PERFORM REGISTRAR-LIBRO
* WHEN 2 PERFORM ELIMINAR-LIBRO
WHEN 3 PERFORM VER-LIBROS
WHEN 4 PERFORM CREAR-ARCHIVO
WHEN 0 MOVE "N" TO CONTINUAR
END-EVALUATE
END-PERFORM.
CLOSE REG-LIBROS.
STOP RUN.
REGISTRAR-LIBRO.
MOVE "S" TO CONTINUAR-REG.
INITIALIZE DATOS-LIBRO.
PERFORM LIMPIAR-PANTALLA.
*INTERFAZ MENU DE INGRESO DE DATOS
DISPLAY "Numero de serie:" AT LINE 1 COL 1.
DISPLAY "Nombre:" AT LINE 2 COL 1.
DISPLAY "Editorial:" AT LINE 3 COL 1.
DISPLAY "Estado:" AT LINE 4 COL 1.
DISPLAY
"presione enter sin ingresar datos para salir al menu"
AT LINE 7 COL 12
WITH REVERSE-VIDEO.
DISPLAY "Numero de serie :" AT LINE 1 COL 1 WITH
REVERSE-VIDEO.
ACCEPT LIBRO-ID WITH PROMPT UNDERLINE UPDATE AT LINE 1 COL 25.
IF LIBRO-ID EQUALS 000 MOVE "N" TO CONTINUAR-REG
END-IF.
IF CONTINUAR-REG EQUALS "S"
DISPLAY "Numero de serie :" AT LINE 1 COL 1
DISPLAY LIBRO-ID AT LINE 1 COL 25
DISPLAY "Nombre :" AT LINE 2 COL 1 WITH REVERSE-VIDEO
ACCEPT NOMBRE AT LINE 2 COL 25
DISPLAY "Nombre: " AT LINE 2 COL 1
DISPLAY NOMBRE AT LINE 2 COL 25
DISPLAY "Editorial :" AT LINE 3 COL 1 WITH REVERSE-VIDEO
ACCEPT EDITORIAL AT LINE 3 COL 25
DISPLAY "Editorial :" AT LINE 3 COL 1
DISPLAY EDITORIAL AT LINE 3 COL 25
DISPLAY "Estado :" AT LINE 4 COL 1 WITH REVERSE-VIDEO
ACCEPT ESTADO AT LINE 4 COL 25
DISPLAY "Estado :" AT LINE 4 COL 1
DISPLAY ESTADO AT LINE 4 COL 25
PERFORM ABRIR-IO-ARCHIVO
WRITE DATOS-LIBRO INVALID KEY
REWRITE DATOS-LIBRO INVALID KEY
DISPLAY "ERROR AL REGISTRAR DATOS"
END-WRITE
PERFORM CERRAR-ARCHIVO
END-IF.
VER-LIBROS.
PERFORM LIMPIAR-PANTALLA
PERFORM ABRIR-IO-ARCHIVO
IF F-NOEXISTE-REG THEN
PERFORM LIMPIAR-PANTALLA
DISPLAY "ERROR, NO EXISTE UN ARCHIVO DE REGISTROS" AT LINE 1
COL 1
DISPLAY "PRESIONE ENTER PARA VOLVER AL MENU()" AT LINE 10
COL 1
ACCEPT OPC AT LINE 11 COL 36
ELSE
PERFORM LIMPIAR-PANTALLA
READ REG-LIBROS KEY IS LIBRO-ID
AT END MOVE HIGH-VALUE TO DATOS-LIBRO
PERFORM VARYING N FROM 1 BY 1 UNTIL DATOS-LIBRO = HIGH-VALUE
DISPLAY DATOS-LIBRO AT LINE N COL 1
READ REG-LIBROS KEY IS LIBRO-ID
AT END MOVE HIGH-VALUE TO DATOS-LIBRO
END-PERFORM
ADD 1 TO N
DISPLAY "PRESIONE ENTER PARA REGRESAR AL MENU" AT LINE N
COL 1
ACCEPT OPC AT LINE 15
PERFORM CERRAR-ARCHIVO
END-IF.
LIMPIAR-PANTALLA.
PERFORM VARYING N FROM 1 BY 1 UNTIL N>24
DISPLAY LIMPIAR AT LINE N COLUMN 1
END-PERFORM.
CREAR-ARCHIVO.
OPEN OUTPUT REG-LIBROS.
CERRAR-ARCHIVO.
CLOSE REG-LIBROS.
ABRIR-IO-ARCHIVO.
OPEN I-O REG-LIBROS.
pueda saber si es necesario crear un archivo en caso que este no existe, se que puedo hacer funcionar el programa sin hacer esto pero como una buena practica quiero aprender a usar los file status.
El problema en cuestion esta al ingresar en la opcion 3,en el parrafo VER-LIBROS coloque un if para determinar si F-NOEXISTE-REG es TRUE disparar un mensaje de error, y en caso que no,que proceda a leer el archivo y mostrar todo lo que contiene, si elimino el archivo y presiono 3 me muestra ese error a la perfeccion pero si creo el archivo o el archivo ya existe de antemano luego no ingresa a la seccion 3, o simplemente se saltea el if o simplemente no me muestra ningun libro a pesar de haber ingresado algunos.
Aqui dejo mi codigo, cualquier ayuda, consejo, cosa que mejorar se agradece..
IDENTIFICATION DIVISION.
PROGRAM-ID. LIBRERIA.
AUTHOR. LUCAS GALEANO.
DATE-WRITTEN 9/7/2023.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT REG-LIBROS ASSIGN TO "REGISTRO-LIBROS.DAT"
ORGANIZATION IS INDEXED
RECORD KEY IS LIBRO-ID
ACCESS MODE IS DYNAMIC
file status FS-REGISTRO-LIBROS.
DATA DIVISION.
FILE SECTION.
FD REG-LIBROS.
01 DATOS-LIBRO.
05 LIBRO-ID PIC 999 VALUE ZEROS.
05 NOMBRE PIC X(20) VALUE SPACES.
05 EDITORIAL PIC X(20) VALUE SPACES.
05 ESTADO PIC X(12) VALUE SPACES.
*05 FECHA-INGRESO.
* 10 DIA PIC 99 VALUE ZEROS.
* 10 MES PIC X(10) VALUE SPACES.
* 10 AÑO PIC 9999 VALUE ZEROS.
* 05 FECHA-ALQUILER.
* 10 DDIA PIC 99 VALUE ZEROS.
* 10 MMES PIC X(10) VALUE SPACES.
* 10 AAÑO PIC 9999 VALUE ZEROS.
WORKING-STORAGE SECTION.
*Codigos de error del archivo.
01 FS-REGISTRO-LIBROS PIC XX.
88 ESTA-REG VALUE "00" "02".
88 N-ESTA-REG VALUE "23".
88 F-NOEXISTE-REG VALUE "35".
*Variables del programa.
77 CONTINUAR PIC X.
77 CONTINUAR-REG PIC X.
77 OPC PIC X VALUE SPACES.
77 LIMPIAR PIC X(80) VALUE SPACES.
77 N PIC 99.
PROCEDURE DIVISION.
DECLARATIVES.
FILE-ERROR SECTION.
USE AFTER STANDARD ERROR PROCEDURE ON REG-LIBROS.
IF FS-REGISTRO-LIBROS EQUALS "35" THEN
SET F-NOEXISTE-REG TO TRUE
END-IF.
END DECLARATIVES.
MENU.
PERFORM UNTIL CONTINUAR = "N"
PERFORM LIMPIAR-PANTALLA
DISPLAY "ADMINISTRADOR DE CATALOGO" AT LINE 1 COL 1 WITH
REVERSE-VIDEO
DISPLAY " " AT LINE 3 COL 1
DISPLAY "1.Registrar libro" AT LINE 4 COL 1
DISPLAY "2.Eliminar libro" AT LINE 5 COL 1
DISPLAY "3.Ver catalogo" AT LINE 6 COL 1
DISPLAY "4.Crear nuevo registro" AT LINE 7 COL 1
DISPLAY "0.Salir" AT LINE 8 COL 1
DISPLAY " " AT LINE 9 COL 1
DISPLAY "Ingrese tecla ( )" AT LINE 10 COL 1 WITH
REVERSE-VIDEO
ACCEPT OPC AT LINE 10 COL 16 WITH
PROMPT UNDERLINE
EVALUATE OPC
WHEN 1 PERFORM REGISTRAR-LIBRO
* WHEN 2 PERFORM ELIMINAR-LIBRO
WHEN 3 PERFORM VER-LIBROS
WHEN 4 PERFORM CREAR-ARCHIVO
WHEN 0 MOVE "N" TO CONTINUAR
END-EVALUATE
END-PERFORM.
CLOSE REG-LIBROS.
STOP RUN.
REGISTRAR-LIBRO.
MOVE "S" TO CONTINUAR-REG.
INITIALIZE DATOS-LIBRO.
PERFORM LIMPIAR-PANTALLA.
*INTERFAZ MENU DE INGRESO DE DATOS
DISPLAY "Numero de serie:" AT LINE 1 COL 1.
DISPLAY "Nombre:" AT LINE 2 COL 1.
DISPLAY "Editorial:" AT LINE 3 COL 1.
DISPLAY "Estado:" AT LINE 4 COL 1.
DISPLAY
"presione enter sin ingresar datos para salir al menu"
AT LINE 7 COL 12
WITH REVERSE-VIDEO.
DISPLAY "Numero de serie :" AT LINE 1 COL 1 WITH
REVERSE-VIDEO.
ACCEPT LIBRO-ID WITH PROMPT UNDERLINE UPDATE AT LINE 1 COL 25.
IF LIBRO-ID EQUALS 000 MOVE "N" TO CONTINUAR-REG
END-IF.
IF CONTINUAR-REG EQUALS "S"
DISPLAY "Numero de serie :" AT LINE 1 COL 1
DISPLAY LIBRO-ID AT LINE 1 COL 25
DISPLAY "Nombre :" AT LINE 2 COL 1 WITH REVERSE-VIDEO
ACCEPT NOMBRE AT LINE 2 COL 25
DISPLAY "Nombre: " AT LINE 2 COL 1
DISPLAY NOMBRE AT LINE 2 COL 25
DISPLAY "Editorial :" AT LINE 3 COL 1 WITH REVERSE-VIDEO
ACCEPT EDITORIAL AT LINE 3 COL 25
DISPLAY "Editorial :" AT LINE 3 COL 1
DISPLAY EDITORIAL AT LINE 3 COL 25
DISPLAY "Estado :" AT LINE 4 COL 1 WITH REVERSE-VIDEO
ACCEPT ESTADO AT LINE 4 COL 25
DISPLAY "Estado :" AT LINE 4 COL 1
DISPLAY ESTADO AT LINE 4 COL 25
PERFORM ABRIR-IO-ARCHIVO
WRITE DATOS-LIBRO INVALID KEY
REWRITE DATOS-LIBRO INVALID KEY
DISPLAY "ERROR AL REGISTRAR DATOS"
END-WRITE
PERFORM CERRAR-ARCHIVO
END-IF.
VER-LIBROS.
PERFORM LIMPIAR-PANTALLA
PERFORM ABRIR-IO-ARCHIVO
IF F-NOEXISTE-REG THEN
PERFORM LIMPIAR-PANTALLA
DISPLAY "ERROR, NO EXISTE UN ARCHIVO DE REGISTROS" AT LINE 1
COL 1
DISPLAY "PRESIONE ENTER PARA VOLVER AL MENU()" AT LINE 10
COL 1
ACCEPT OPC AT LINE 11 COL 36
ELSE
PERFORM LIMPIAR-PANTALLA
READ REG-LIBROS KEY IS LIBRO-ID
AT END MOVE HIGH-VALUE TO DATOS-LIBRO
PERFORM VARYING N FROM 1 BY 1 UNTIL DATOS-LIBRO = HIGH-VALUE
DISPLAY DATOS-LIBRO AT LINE N COL 1
READ REG-LIBROS KEY IS LIBRO-ID
AT END MOVE HIGH-VALUE TO DATOS-LIBRO
END-PERFORM
ADD 1 TO N
DISPLAY "PRESIONE ENTER PARA REGRESAR AL MENU" AT LINE N
COL 1
ACCEPT OPC AT LINE 15
PERFORM CERRAR-ARCHIVO
END-IF.
LIMPIAR-PANTALLA.
PERFORM VARYING N FROM 1 BY 1 UNTIL N>24
DISPLAY LIMPIAR AT LINE N COLUMN 1
END-PERFORM.
CREAR-ARCHIVO.
OPEN OUTPUT REG-LIBROS.
CERRAR-ARCHIVO.
CLOSE REG-LIBROS.
ABRIR-IO-ARCHIVO.
OPEN I-O REG-LIBROS.