Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol GnuCOBOL (OpenCOBOL)
GnuCOBOL (OpenCOBOL) El compilador gratuito y Open Source cada vez más popular.
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Duda] Problemas con NetExpress 3.1 jjmunuce Micro Focus COBOL 5 28 de mayo de 2024 21:16
[Duda] COBOL problema con READ, status = 46 Marengo97 COBOL - General 6 7 de febrero de 2023 19:46
[Componente] Problemas con vbscript Fito PowerCOBOL (ActiveX, v4 - v11) 10 9 de marzo de 2022 11:42
[Compilador] Problemas con los *.SE/*.FD Socavi PowerCOBOL (ActiveX, v4 - v11) 8 23 de agosto de 2021 22:47
[Compilador] Problemas con el DEBUG Josber PowerCOBOL (ActiveX, v4 - v11) 3 12 de abril de 2015 21:16

Respuesta

  #1
Antiguo 30 de julio de 2023, 04:43
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0
Predeterminado [AYUDA] problemas con file-status
0 Inactivo Inactivo

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..
Código COBOL:
  1.        IDENTIFICATION DIVISION.
  2.  
  3.        PROGRAM-ID.                 LIBRERIA.
  4.        AUTHOR.                     LUCAS GALEANO.
  5.        DATE-WRITTEN                9/7/2023.
  6.  
  7.        ENVIRONMENT DIVISION.
  8.        INPUT-OUTPUT SECTION.
  9.        FILE-CONTROL.
  10.            SELECT REG-LIBROS ASSIGN TO "REGISTRO-LIBROS.DAT"
  11.                                ORGANIZATION IS INDEXED
  12.                                RECORD KEY IS LIBRO-ID
  13.                                ACCESS MODE IS DYNAMIC
  14.                                file status FS-REGISTRO-LIBROS.
  15.  
  16.        DATA DIVISION.
  17.        FILE SECTION.
  18.  
  19.        FD REG-LIBROS.
  20.  
  21.        01 DATOS-LIBRO.
  22.            05 LIBRO-ID PIC 999     VALUE ZEROS.
  23.            05 NOMBRE   PIC X(20)   VALUE SPACES.
  24.            05 EDITORIAL PIC X(20)  VALUE SPACES.
  25.            05 ESTADO   PIC X(12)   VALUE SPACES.
  26.      *05 FECHA-INGRESO.
  27.      *     10 DIA  PIC 99 VALUE ZEROS.
  28.      *     10 MES  PIC X(10) VALUE SPACES.
  29.      *     10 AÑO  PIC 9999 VALUE ZEROS.
  30.      * 05 FECHA-ALQUILER.
  31.      *     10 DDIA PIC 99 VALUE ZEROS.
  32.      *     10 MMES PIC X(10) VALUE SPACES.
  33.      *     10 AAÑO PIC 9999 VALUE ZEROS.
  34.  
  35.        WORKING-STORAGE SECTION.
  36.      *Codigos de error del archivo.
  37.        01 FS-REGISTRO-LIBROS PIC XX.
  38.            88 ESTA-REG         VALUE "00" "02".
  39.            88 N-ESTA-REG       VALUE "23".
  40.            88 F-NOEXISTE-REG   VALUE "35".
  41.      *Variables del programa.    
  42.        77 CONTINUAR PIC X.
  43.        77 CONTINUAR-REG PIC X.
  44.        77 OPC       PIC X VALUE SPACES.
  45.        77 LIMPIAR   PIC X(80) VALUE SPACES.
  46.        77 N         PIC 99.
  47.  
  48.        PROCEDURE DIVISION.
  49.        DECLARATIVES.
  50.            FILE-ERROR SECTION.
  51.                USE AFTER STANDARD ERROR PROCEDURE ON REG-LIBROS.
  52.                IF FS-REGISTRO-LIBROS EQUALS "35" THEN
  53.                    SET F-NOEXISTE-REG TO TRUE
  54.                END-IF.
  55.        END DECLARATIVES.
  56.        MENU.
  57.  
  58.            PERFORM UNTIL CONTINUAR = "N"
  59.            PERFORM LIMPIAR-PANTALLA
  60.            DISPLAY "ADMINISTRADOR DE CATALOGO" AT LINE 1 COL 1 WITH
  61.                                                            REVERSE-VIDEO
  62.            DISPLAY " "                         AT LINE 3 COL 1
  63.            DISPLAY "1.Registrar libro"         AT LINE 4 COL 1
  64.            DISPLAY "2.Eliminar libro"          AT LINE 5 COL 1
  65.            DISPLAY "3.Ver catalogo"            AT LINE 6 COL 1
  66.            DISPLAY "4.Crear nuevo registro"    AT LINE 7 COL 1
  67.            DISPLAY "0.Salir"                   AT LINE 8 COL 1
  68.            DISPLAY " "                         AT LINE 9 COL 1
  69.            DISPLAY "Ingrese tecla ( )"         AT LINE 10 COL 1 WITH
  70.                                                            REVERSE-VIDEO
  71.            ACCEPT OPC                          AT LINE 10 COL 16 WITH
  72.                                                PROMPT UNDERLINE
  73.            EVALUATE OPC
  74.            WHEN 1 PERFORM REGISTRAR-LIBRO
  75.      *     WHEN 2 PERFORM ELIMINAR-LIBRO
  76.            WHEN 3 PERFORM VER-LIBROS
  77.            WHEN 4 PERFORM CREAR-ARCHIVO
  78.            WHEN 0 MOVE "N" TO CONTINUAR
  79.            END-EVALUATE
  80.            END-PERFORM.
  81.            CLOSE REG-LIBROS.
  82.            STOP RUN.
  83.  
  84.  
  85.        REGISTRAR-LIBRO.
  86.            MOVE "S" TO CONTINUAR-REG.
  87.            INITIALIZE DATOS-LIBRO.
  88.            PERFORM LIMPIAR-PANTALLA.
  89.      *INTERFAZ MENU DE INGRESO DE DATOS
  90.            DISPLAY "Numero de serie:" AT LINE 1 COL 1.
  91.            DISPLAY "Nombre:"       AT LINE 2 COL 1.
  92.            DISPLAY "Editorial:"    AT LINE 3 COL 1.
  93.            DISPLAY "Estado:"       AT LINE 4 COL 1.
  94.            DISPLAY
  95.            "presione enter sin ingresar datos para salir al menu"
  96.                                                AT LINE 7 COL 12
  97.                                                WITH REVERSE-VIDEO.
  98.  
  99.  
  100.            DISPLAY "Numero de serie    :" AT LINE 1 COL 1 WITH
  101.                                                           REVERSE-VIDEO.
  102.            ACCEPT LIBRO-ID WITH PROMPT UNDERLINE UPDATE AT LINE 1 COL 25.
  103.  
  104.            IF LIBRO-ID EQUALS 000 MOVE "N" TO CONTINUAR-REG
  105.                END-IF.
  106.  
  107.            IF CONTINUAR-REG EQUALS "S"
  108.            DISPLAY "Numero de serie    :" AT LINE 1 COL 1
  109.            DISPLAY LIBRO-ID            AT LINE 1 COL 25
  110.  
  111.            DISPLAY "Nombre    :"     AT LINE 2 COL 1 WITH REVERSE-VIDEO
  112.            ACCEPT NOMBRE               AT LINE 2 COL 25
  113.            DISPLAY "Nombre:    "       AT LINE 2 COL 1
  114.            DISPLAY NOMBRE              AT LINE 2 COL 25
  115.  
  116.            DISPLAY "Editorial    :"  AT LINE 3 COL 1 WITH REVERSE-VIDEO
  117.            ACCEPT EDITORIAL            AT LINE 3 COL 25
  118.            DISPLAY "Editorial    :"    AT LINE 3 COL 1
  119.            DISPLAY EDITORIAL           AT LINE 3 COL 25
  120.  
  121.            DISPLAY "Estado    :"     AT LINE 4 COL 1 WITH REVERSE-VIDEO
  122.            ACCEPT ESTADO               AT LINE 4 COL 25
  123.            DISPLAY "Estado    :"       AT LINE 4 COL 1
  124.            DISPLAY ESTADO              AT LINE 4 COL 25
  125.  
  126.  
  127.            PERFORM ABRIR-IO-ARCHIVO
  128.            WRITE DATOS-LIBRO INVALID KEY
  129.                REWRITE DATOS-LIBRO INVALID KEY
  130.                    DISPLAY "ERROR AL REGISTRAR DATOS"
  131.            END-WRITE
  132.            PERFORM CERRAR-ARCHIVO
  133.            END-IF.
  134.  
  135.        VER-LIBROS.
  136.            PERFORM LIMPIAR-PANTALLA
  137.            PERFORM ABRIR-IO-ARCHIVO
  138.            IF F-NOEXISTE-REG THEN
  139.            PERFORM LIMPIAR-PANTALLA
  140.            DISPLAY "ERROR, NO EXISTE UN ARCHIVO DE REGISTROS" AT LINE 1
  141.                                                            COL 1
  142.                                                            
  143.            DISPLAY "PRESIONE ENTER PARA VOLVER AL MENU()" AT LINE 10
  144.                                                            COL 1
  145.            ACCEPT OPC AT LINE  11 COL 36
  146.            ELSE
  147.            PERFORM LIMPIAR-PANTALLA
  148.            READ REG-LIBROS KEY IS LIBRO-ID
  149.            AT END MOVE HIGH-VALUE TO DATOS-LIBRO
  150.            PERFORM VARYING N FROM 1 BY 1 UNTIL DATOS-LIBRO = HIGH-VALUE
  151.            DISPLAY DATOS-LIBRO AT LINE N COL 1
  152.            READ REG-LIBROS KEY IS LIBRO-ID
  153.            AT END MOVE HIGH-VALUE TO DATOS-LIBRO
  154.            END-PERFORM
  155.            ADD 1 TO N
  156.            DISPLAY "PRESIONE ENTER PARA REGRESAR AL MENU" AT LINE N
  157.                                                           COL 1
  158.            ACCEPT OPC AT LINE 15
  159.            PERFORM CERRAR-ARCHIVO
  160.            END-IF.
  161.  
  162.  
  163.  
  164.  
  165.  
  166.        LIMPIAR-PANTALLA.
  167.            PERFORM VARYING N FROM 1 BY 1 UNTIL N>24
  168.                DISPLAY LIMPIAR AT LINE N COLUMN 1
  169.            END-PERFORM.
  170.  
  171.        CREAR-ARCHIVO.
  172.            OPEN OUTPUT REG-LIBROS.
  173.  
  174.        CERRAR-ARCHIVO.
  175.            CLOSE REG-LIBROS.
  176.  
  177.        ABRIR-IO-ARCHIVO.
  178.            OPEN I-O REG-LIBROS.
Marengo97 is offline   Responder Con Cita
  #2
Antiguo 30 de julio de 2023, 14:56
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

@Marengo97, eso es porque lees el registro con el valor de "LIBRO-ID" no existe y se sale.

Te adjunto código para leer todos de una mejor forma.

Modifica esta variable añadiendo un nuevo file status.

Código COBOL:
  1. *Codigos de error del archivo.
  2.        01 FS-REGISTRO-LIBROS PIC XX.
  3.            88 ESTA-REG         VALUE "00" "02".
  4.            88 N-ESTA-REG       VALUE "23".
  5.            88 F-NOEXISTE-REG   VALUE "35".
  6.            88  fin-reg value "10".

Y recorre el fichero de esta forma:

Código COBOL:
  1. VER-LIBROS.
  2.            PERFORM LIMPIAR-PANTALLA
  3.            PERFORM ABRIR-IO-ARCHIVO
  4.            IF F-NOEXISTE-REG THEN
  5.              PERFORM LIMPIAR-PANTALLA
  6.              DISPLAY "ERROR, NO EXISTE UN ARCHIVO DE REGISTROS" AT LINE 1
  7.                                                            COL 1
  8.                                                            
  9.              DISPLAY "PRESIONE ENTER PARA VOLVER AL MENU()" AT LINE 10
  10.                                                            COL 1
  11.              ACCEPT OPC AT LINE  11 COL 36
  12.            ELSE
  13.                PERFORM LIMPIAR-PANTALLA
  14.  
  15.                initialize libro-id
  16.                start reg-libros key is >= libro-id end-start
  17.                READ REG-LIBROS next record end-read
  18.  
  19.               PERFORM VARYING N FROM 1 BY 1 UNTIL fin-reg
  20.                     DISPLAY DATOS-LIBRO AT LINE N COL 1
  21.                     READ REG-LIBROS next record end-read
  22.              END-PERFORM
  23.              ADD 1 TO N
  24.              DISPLAY "PRESIONE ENTER PARA REGRESAR AL MENU" AT LINE N
  25.                                                           COL 1
  26.            ACCEPT OPC AT LINE 15
  27.            PERFORM CERRAR-ARCHIVO
  28.            END-IF.
  29.  

si tienes alguna duda hazmelo saber.
JCantero is offline   Responder Con Cita
  #3
Antiguo 30 de julio de 2023, 16:59
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

Funciona perfecto!
Podria explicarme como es que funciona?
Antes de aplicar el file status era bastante simple pero al parecer cambia el codigo de ver-libros al usarlo, entiendo los statement de initialize y start, no tanto el de next record, pero no entiendo la logica que aplicó, por ende no se por que funciona.
El uuunico error que encontre es que si creo el archivo, de no existir, entra en un loop infinito mostrando "000" al entrar a la opcion 3, pero al cerrar el programa y volver a ejecturlo funciona perfecto y muestra el registro vacio, como podria solucionarlo? Gracias.
Marengo97 is offline   Responder Con Cita
  #4
Antiguo 30 de julio de 2023, 17:11
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

Ya lo solucione, resulta que cuando creaba el archivo no lo cerraba luego de abrirlo y al ingresar en la opcion 3 yo indico que abre en modo I-O y eso rompia el programa, pero aun no entiendo su codigo en totalidad jaja.
Marengo97 is offline   Responder Con Cita
  #5
Antiguo 30 de julio de 2023, 17:54
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

@Marengo97, te explico.

Tu has hecho un bucle y siempre lees el mismo registro con el contenido de la clave "libro-id". No cambias libro-id. Otra cosa es que cambiaras el valor aumentandolo, pero realmente tendrias lecturas fallidas.

Cuando quieres recorrer un fichero completamente:

1) realiza un start con la clave deseada, para poner el cursor de lectura al principio. Aunque tu lo abres y se supone que esta al principio. Si tuvieras varias claves en el fichero, libro-id, nombre, editorial podrias leer secuencialmente por esa clave. Incluso no desde el principio sino desde un a determinada posicion.
2) read next lee el siguiente por la clave especificada en el start. Cuando llega al final mete un 10 en el file status.

NOTA. Para este bucle de lectura es recomendable hacer un "OPEN INPUT" en vez de "OPEN I-O" porque si hay varios usuarios trabajando te podrias encontrar un registro bloqueado. Entonces la solucion es leer con una apertura "open input" si no tendrias que hacer lecturas con la clausula "with no lock" para no bloquear registros ni encontrartelos bloqueados.

- - - Updated - - -

Metidos en el tema, suponte que deseas seleccionar un intevalo de libros:

accept libro-desde
accept libro-hasta

Código COBOL:
  1. VER-LIBROS.
  2.            PERFORM LIMPIAR-PANTALLA
  3.            PERFORM ABRIR-IO-ARCHIVO
  4.            IF F-NOEXISTE-REG THEN
  5.              PERFORM LIMPIAR-PANTALLA
  6.              DISPLAY "ERROR, NO EXISTE UN ARCHIVO DE REGISTROS" AT LINE 1
  7.                                                            COL 1
  8.                                                            
  9.              DISPLAY "PRESIONE ENTER PARA VOLVER AL MENU()" AT LINE 10
  10.                                                            COL 1
  11.              ACCEPT OPC AT LINE  11 COL 36
  12.            ELSE
  13.                PERFORM LIMPIAR-PANTALLA
  14.  
  15.                move libro desde to  libro-id
  16.                if libro-hasta = 0 then move 999 to libro-hasta end-if
  17.  
  18.                start reg-libros key is >= libro-id end-start
  19.                READ REG-LIBROS next record end-read
  20.  
  21.               PERFORM VARYING N FROM 1 BY 1 UNTIL fin-reg or libro-id  > libro-hasta
  22.                     DISPLAY DATOS-LIBRO AT LINE N COL 1
  23.                     READ REG-LIBROS next record end-read
  24.              END-PERFORM
  25.              ADD 1 TO N
  26.              DISPLAY "PRESIONE ENTER PARA REGRESAR AL MENU" AT LINE N
  27.                                                           COL 1
  28.            ACCEPT OPC AT LINE 15
  29.            PERFORM CERRAR-ARCHIVO
  30.            END-IF.
JCantero is offline   Responder Con Cita
  #6
Antiguo 30 de julio de 2023, 20:35
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

Muchas gracias cantero, lo voy a tener en cuenta.
Marengo97 is offline   Responder Con Cita
  #7
Antiguo 30 de julio de 2023, 21:44
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

@JCantero

Me encontre con un problema, si quiero registrar un libro en la opcion 1, suponete tengo dos libros, solo me muestra el ultimo que ingrese.
Marengo97 is offline   Responder Con Cita
  #8
Antiguo 30 de julio de 2023, 22:26
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

Ya lo solucione...estaba abriendo como output y me creaba un nuevo archivo cada vez, hace rato no uso cobol y me olvido cosas muy fundamentales
Marengo97 is offline   Responder Con Cita
Respuesta


Herramientas

Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:43.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.