Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   Visual COBOL y DEV-HUB (https://www.cobolforo.es/forumdisplay.php?f=36)
-   -   [Duda] No se imprime la base de datos (https://www.cobolforo.es/showthread.php?t=1412)

DestinedBroken 1 de diciembre de 2021 18:37

No se imprime la base de datos
 
Hola comunidad,

Al igual que introducir registros en una base de datos, he decidido crear un programa que me los imprima. Veo todo correcto, pero no entiendo por qué no se me imprimen bien.

He probado el Debug y por lo que puedo ver, los atributos de los registros "están corruptos" en el sentido de que no muestra correctamente los campos para cada valor. Como se puede ver a continuación, los valores aparecen cortados:

https://i.ibb.co/VC0WZQp/image.png

Con otra base de datos pruebo y pasa más de lo mismo:
https://i.ibb.co/SvKPM5w/image.png

Adjunto código:

Código COBOL:
  1.        program-id. BB_DD_2 as "lectura de la BB_DD_".
  2.  
  3.        environment division.
  4.        configuration section.
  5.        input-output section.
  6.        file-control.
  7.        select optional empleados-archivo
  8.            assign to "f:\empleados_escritura.dat"
  9.            organization is line sequential.
  10.  
  11.        data division.
  12.        file section.
  13.        fd empleados-archivo.
  14.        01 empleados-registro.
  15.          05 empleados-id pic x(9).
  16.          05 empleados-nombre pic x(25).
  17.          05 empleados-apellidos pic x(25).
  18.          05 empleados-edad pic x(3).
  19.          05 empleados-telefono pic x(9).
  20.          05 empleados-direccion pic x(35).
  21.  
  22.        working-storage section.
  23.  
  24.        01 FIN-DEL-ARCHIVO PIC X value "1".
  25.        01 MAXIMO-REGISTROS PIC 99 value zeroes.
  26.        01 siguiente PIC X.
  27.  
  28.        procedure division.
  29.        empieza-programa.
  30.            open input empleados-archivo
  31.            perform lee-siguiente-registro
  32.            perform muestra-campos
  33.            perform lee-siguiente-registro
  34.              until fin-del-archivo = "0"
  35.            close empleados-archivo
  36.            stop run
  37.            .
  38.  
  39.        muestra-campos.
  40.            if MAXIMO-REGISTROS = 10
  41.                perform siguiente-pagina
  42.            end-if
  43.            display "ID:" empleados-id
  44.            display "Nombre:" empleados-nombre
  45.            display "Apellidos:" empleados-apellidos
  46.            display "Edad:" empleados-edad
  47.            display "Telefono:" empleados-telefono
  48.            display "Direccion:" empleados-direccion
  49.            
  50.            ADD 1 TO MAXIMO-REGISTROS
  51.            .
  52.  
  53.        lee-siguiente-registro.
  54.            read empleados-archivo next record
  55.                at end
  56.                    move "0" to FIN-DEL-ARCHIVO
  57.            .
  58.        siguiente-pagina.
  59.            display
  60.              "Presiona cualquier tecla para ver la siguiente pagina..."
  61.            accept siguiente
  62.            move zeroes to MAXIMO-REGISTROS
  63.  
  64.        end program BB_DD_2.

JCantero 1 de diciembre de 2021 20:57

No esta corrupto.

Tu problema es que en el otro hilo creaste la fd asi:

Código COBOL:
  1. fd empleados-archivo.
  2.      *label etiqueta-antigua-para-cintas.
  3.        01 empleados-registro.
  4.          05 empleados-id pic x(6).
  5.          05 empleados-nombre pic x(25).
  6.          05 empleados-apellidos pic x(35).
  7.          05 empleados-edad pic x(3).
  8.          05 empleados-telefono pic x(9).
  9.          05 empleados-direccion pic x(35).

Y ahora lo estas displayando leyendo del fichero con otra estructura

Código COBOL:
  1.  fd empleados-archivo.
  2.        01 empleados-registro.
  3.          05 empleados-id pic x(9).
  4.          05 empleados-nombre pic x(25).
  5.          05 empleados-apellidos pic x(25).
  6.          05 empleados-edad pic x(3).
  7.          05 empleados-telefono pic x(9).
  8.          05 empleados-direccion pic x(35).

El "id" inicial tenia x(6) y el de listar pic x(9).

Te coge los 6 del id inicial + tres caracteres del nombre.

Y el resto de campos efectos colaterales del error primero de diseño

Deben de tener la misma estructura.

DestinedBroken 2 de febrero de 2022 11:47

Hola, perdón por la demora en responder. Ya estoy de vuelta.
@JCantero, gracias por el apunte. Ahora no tengo ese problema. Sin embargo, solo consigo que me muestre un registro, y no los 10 (o 5) por página.

https://i.ibb.co/8rbnZhn/c1.jpg

He estado dándole vueltas a la variable de control "maximo-registros", pero creo que funciona bien. Se inicializa a 0 en la Working y se va incrementando de 1 en 1 hasta llegar al tope (10) en la función "muestra-campos". Luego, tengo cuidado de borrarle el contenido en "siguiente-pagina."

Aprovecho para comentar también que me está rayando que "empleados-registro" (el nombre del archivo lógico) siga tachado, sin invocarlo ni una sola vez...

Josber 2 de febrero de 2022 13:15

A ver, no sé de donde habrás sacado el curso pero, más vale que lo tires a la basura y empieces uno de otro lado, porque éste tiene fallos de estructura de programación así "a puñaos".

El primero que veo, es la falta de uso del punto (.) para terminar una instrucción o en su caso el uso de un END-instrucción, en éste caso END-PERFORM y END-READ, ponlos en su sitio y quizás te cambie radicalmente la estructura del programa, porque, conforme está, en apariencia funciona bien, pero es como el comunismo, que en apariencia funciona bien, pero luego ...
Si no sabes donde ponerlos, dilo y te echamos una mano, que todos hemos pasado por ahí :bien:

En tu caso la estructura para hacer el programa es de las sencillas, la secuencia normal sería:

- (01) Inicializar a 0 la variable MAXIMO-REGISTROS, (que no lo haces)
- (02) Abrir FICHERO
- (03) Posicionarse al principio, (algo que no haces, y que en éste caso no sea necesario, por ser un fichero secuencial)
- (04) Leer fichero
- (05) Comprobar si es el último registro
- (06) Sí lo es STOP RUN
- (07) No lo es
- (08) Mostrar registro leído
- (09) Sumar uno a MAXIMO-REGISTROS
- (10) MAXIMO-REGISTRO = 10
- (11) Si es SÍ
- (12) Aceptar tecla para continuar
- (13) MAXIMO-REGISTROS = 0
- (14 ) Mostrar en pantalla registro leído
- (15) Volver al punto (04)
El punto 01, hazlo siempre porque, aunque en la WORKING, le asignes el valor 0 (cero) a la variable MAXIMO-REGISTROS, hay veces que, por culpa del demonio, falla, es un simple
Código COBOL:
  1. MOVE 0 TO MAXIMO-REGISTROS.

Posicionarse al principio del fichero, en éste caso no es obligatorio, porque nada más abrir el fichero, empiezas a leerlo, por lo que el puntero, debe de apuntar al principio del fichero, y además es un fichero secuencial, lo que no entiendo es el por qué lees 2 veces el fichero, se me escapa de la lógica.

En cuanto a lo de me está rayando que "empleados-registro", no entiendo qué quieres decir con lo de "seguir tachado", en éste caso empleado-registro, no se usa, porque es por decirlo de alguna manera un contenedor de las variables que tiene por debajo, las de nivel 05, por lo que no se invoca para nada, es como si la fiche la dividieses en bloques, por ejemplo un bloque con el nombre y los apellidos, otro bloque con dirección, población CP, etc, otro bloque con varios número de teléfono, etc.

dariodr 3 de febrero de 2022 02:48

@DestinedBroken, Hola, de donde has sacado esos ejercicios de COBOL, necesito una pagina o un foro hace tiempo que no programo en COBOL. Tendras el link de los ejercicios.
Saludos.

DestinedBroken 3 de febrero de 2022 15:25

@Josber,

Cita:

Citación del post de Josber (Mensaje 7487)
es la falta de uso del punto (.) para terminar una instrucción

Precisamente así vine aquí al comienzo y @Kuk me dijo que con que los pusiera al final de cada bloque era suficiente. Igual lo de poner end-XXX no lo he tenido que usar jamás y no veo su uso obligatorio. Supongo que dependerá del entorno donde trabajes.
En GNUCobol siempre se ponen puntos (o no, yo qué sé, ese IDE me fallaba mucho), de mientras, en VCobol, no da errores si no los pones de seguido. Solamente he tenido que usar el end-if como sentencia de finalizado para "cláusulas especiales".



Cita:

Citación del post de Josber (Mensaje 7487)
- (01) Inicializar a 0 la variable MAXIMO-REGISTROS, (que no lo haces)

Hecho :amigo:

Cita:

Citación del post de Josber (Mensaje 7487)
- (02) Abrir FICHERO

Código COBOL:
  1. open input empleados-archivo
ya hecho


Cita:

Citación del post de Josber (Mensaje 7487)
- (03) Posicionarse al principio, (algo que no haces, y que en este caso no sea necesario, por ser un fichero secuencial)

He buscado información al respecto y como dices, no es necesario en mi caso. Pero no solamente eso, sino que VCobol me tira error al parecer porque estoy utilizando archivos "Secuenciales". Además, no tendría la "key" o clave por la que empezar (aunque supongo que le puedo poner 0 y ya está).


Cita:

Citación del post de Josber (Mensaje 7487)
- (04) Leer fichero

Código COBOL:
  1. read empleados-archivo next record
  2.                at end
  3.                    move "0" to FIN-DEL-ARCHIVO
Eso está en la función "lee-siguiente-registro". Según el manual de "Andrés" (lo pillé de aquí del foro), la estructura está bien. En un manual de IBM me dice que no hace falta poner "next record", en fin, un lío.


Cita:

Citación del post de Josber (Mensaje 7487)
(05) Comprobar si es el último registro

¿Cómo se hace? He buscado, y solo he encontrado lo de "at end" en el read. En verdad, una vez que has leído el fichero ya se supone que has llegado al final.

He estado debugeando el código y he encontrado que se queda atascado en la sentencia del "read". Es decir, para el primer registro, lo saca correctamente, incrementa en 1 el "maximo-registros", pero no saca por consola el resto de los registros.

He probado aquí y allá, como intentar sacar los registros de 5 en 5 en vez que de 10 en 10 pero siempre obteniendo los mismos resultados.

@dariodr, Ya se están mosqueando conmigo por traer problemas por culpa de seguir un curso roto como para pasártelo :D :D Lo siguiente es que me baneen, a mí por colgarlo y a ti por seguirlo jajaja.
Veré por YT si hay algún cursillo free que esté bien explicado. Pero será lo típico de comprar uno en udemy (aunque le leí a un internauta que está muy lioso).

De aquí mismo he sacado buen material y orientación, lo que pasa es que los libros de programación se me hacen terribles para aprender un lenguaje. Yo soy más de practicar con teclado que leer 100 páginas con millones de explicaciones sobre palabras reservadas y demás.

Josber 3 de febrero de 2022 19:48

Cita:

Citación del post de DestinedBroken (Mensaje 7494)
Lo siguiente es que me baneen

Banearte por eso no pero, que el que ha hecho el curso, se merece una buena mano de bofetadas....

A ver, el END-READ, has de ponerlo, no para que termine de leer, si no, para indicarle que termine de hacer cosas, es como el END-IF, (o el punto en su caso), si no lo pones, el compilador puede presuponer que no se han terminado de hacer cosas y añadirlas en AT END, por ejemplo,

No es lo mismo

Código COBOL:
  1. READ fichero
  2.            NEXT RECORD
  3.                       AT END
  4.                             MOVE 0 TO FIN-FICHERO
  5.                       NOT AT END
  6.                                PERFORM MOSTRAR
  7. ADD 20 TO CONTADOR
  8. PERFORM COMPROBAR

que

Código COBOL:
  1. READ fichero
  2.            NEXT RECORD
  3.                       AT END
  4.                             MOVE 0 TO FIN-FICHERO
  5.                       NOT AT END
  6.                                PERFORM MOSTRAR
  7. END-READ
  8. ADD 20 TO CONTADOR
  9. PERFORM COMPROBAR

o el equivalente sin el END-READ, pero con sus correspondientes puntos (.) de fin de sentencia

Código COBOL:
  1. READ fichero
  2.            NEXT RECORD
  3.                       AT END
  4.                             MOVE 0 TO FIN-FICHERO
  5.                       NOT AT END
  6.                                PERFORM MOSTRAR.
  7. ADD 20 TO CONTADOR.
  8. PERFORM COMPROBAR.

En el primer caso, suma 20 a CONTADOR y va al párrafo COMPROBAR, mientras haya registros en el fichero, puesto que no encuentra nada que le diga que ha terminado el bloque de instrucciones en el READ, y en el segundo caso, sólo lo hace cuando haya termina de leer el fichero.

Los puntos y las sentencias END-...., no son obligatorias, pero si son muy esclarecedoras, para los que nos enseñamos COBOL, con la versión del 74, el poder usar un simple END-IF, END-READ o END-algo, fue uno de los mayores hitos en la programación con este lenguaje, si te descargas el manual que hice sobre POWER-COBOL, verás que, en todos los ejemplos que hay, y hay un buen montón, uso siempre las sentencias END, los puntos de fin de instrucción y la INDETANCIÓN, es algo a lo que me he acostumbrado y, ya no sé hacerlo de otra forma.

Un salu2.-

JCantero 4 de febrero de 2022 14:20

@Josber, :llora:

No espantes al personal, encima que le han timado por el curso no metas el dedo en la herida.

Vamos a intentar ayudarle.

:astro:

Josber 4 de febrero de 2022 14:53

Cita:

Citación del post de JCantero (Mensaje 7496)
Vamos a intentar ayudarle

En ello estamos, en ello, esperando a ver si pone los puntos y los END-algo en su sitio y ya le funciona la cosa

:mafia: :teclea:

Kuk 5 de febrero de 2022 22:54

Cita:

Citación del post de DestinedBroken (Mensaje 7494)
he sacado buen material y orientación

Mírate el manual el Andrés, nuestro amigo y Guru @Nitzer, que lo puedes encontrar aquí: [Información] COBOL - Por donde empezar desde 0 - COBOL Foro

Es bastante comprimido, y habla sólo de cosas importantes ;)


La franja horaria es GMT +2. Ahora son las 04:56.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.