Gracias Rui Pinto (Rapinto)
COBOL Foro
Foro dedicado a COBOL, a la Programación y a la Informática.
  COBOL Foro > IDE-s y compiladores COBOL > MicroFocus COBOL > Visual Cobol
Visual Cobol El último IDE de MicroFocus basado en Eclipse y Plugin para Visual Studio.
Comunicados
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Información] I/O Error al ejecutar una base de datos DestinedBroken Visual Cobol 11 2 de febrero de 2022 10:13
[Sintaxis] URGENTE: Base de Datos en MySql en Red Hrmcobol PowerCOBOL (ActiveX, v4 - v11) 10 21 de agosto de 2021 14:30
Base de datos .mdb Lobosauseda Bases de datos 4 26 de agosto de 2019 08:36
[Sintaxis] Abrir o visualizar Base de datos Cobol Anuack COBOL - General 0 11 de julio de 2017 10:08
[Sintaxis] Ayuda para interactuar con base de Datos Breew PowerCOBOL (ActiveX, v4 - v11) 19 28 de enero de 2016 21:46
Respuesta
 
Herramientas

  #1
Antiguo 1 de diciembre de 2021, 17:37
IDENTIFICATION DIVISION
DestinedBroken
 Acabo de llegar...
ENVIRONMENT DIVISION
Avatar de DestinedBroken
DATA DIVISION
octubre 2021
16.02.2022 10:57
PROCEDURE DIVISION
Posts: 28
Enviado: 16
Recibido: 4
Soluciones: 0
Reputación: 0
DestinedBroken is an unknown quantity at this point
Predeterminado 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:



Con otra base de datos pruebo y pasa más de lo mismo:


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.
DestinedBroken no ha iniciado sesión   Responder Con Cita
Mejores respuestas Soluciones: 1
  #2
Antiguo 1 de diciembre de 2021, 19:57
IDENTIFICATION DIVISION
JCantero
 Senior
Activista del Foro: Activista del Foro - Razón: Por participación activa  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Razón: Por muchos agradecimientos de parte de los Foreros 
ENVIRONMENT DIVISION
Avatar de JCantero
DATA DIVISION
junio 2016
Albacete
56 años
19.05.2022 19:49
PROCEDURE DIVISION
Posts: 246
Enviado: 83
Recibido: 170
Soluciones: 11
Reputación: 23
JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road
Predeterminado

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.
JCantero no ha iniciado sesión   Responder Con Cita
  #3
Antiguo 2 de febrero de 2022, 10:47
IDENTIFICATION DIVISION
DestinedBroken
 Acabo de llegar...
ENVIRONMENT DIVISION
Avatar de DestinedBroken
DATA DIVISION
octubre 2021
16.02.2022 10:57
PROCEDURE DIVISION
Posts: 28
Enviado: 16
Recibido: 4
Soluciones: 0
Reputación: 0
DestinedBroken is an unknown quantity at this point
Predeterminado

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.



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...
DestinedBroken no ha iniciado sesión   Responder Con Cita
  #4
Antiguo 2 de febrero de 2022, 12:15
IDENTIFICATION DIVISION
Josber
 Super Moderador
Activista del Foro: Activista del Foro - Razón: Por aportar manuales y enriquecer   Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Razón: Por muchos agradecimientos 
ENVIRONMENT DIVISION
Avatar de Josber
DATA DIVISION
febrero 2015
Alicante
20.05.2022 10:40
PROCEDURE DIVISION
Posts: 631
Enviado: 296
Recibido: 328
Soluciones: 45
Reputación: 34
Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road
Predeterminado

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í

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.
Josber no ha iniciado sesión   Responder Con Cita
  #5
Antiguo 3 de febrero de 2022, 01:48
IDENTIFICATION DIVISION
dariodr
 Acabo de llegar...
ENVIRONMENT DIVISION
Avatar de dariodr
DATA DIVISION
noviembre 2018
52 años
20.05.2022 03:26
PROCEDURE DIVISION
Posts: 16
Enviado: 3
Recibido: 1
Soluciones: 0
Reputación: 0
dariodr is an unknown quantity at this point
Predeterminado

@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.
dariodr no ha iniciado sesión   Responder Con Cita
  #6
Antiguo 3 de febrero de 2022, 14:25
IDENTIFICATION DIVISION
DestinedBroken
 Acabo de llegar...
ENVIRONMENT DIVISION
Avatar de DestinedBroken
DATA DIVISION
octubre 2021
16.02.2022 10:57
PROCEDURE DIVISION
Posts: 28
Enviado: 16
Recibido: 4
Soluciones: 0
Reputación: 0
DestinedBroken is an unknown quantity at this point
Predeterminado

@Josber,

Citación del post de Josber Ver Mensaje
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".



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

Citación del post de Josber Ver Mensaje
- (02) Abrir FICHERO
Código COBOL:
  1. open input empleados-archivo
ya hecho


Citación del post de Josber Ver Mensaje
- (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á).


Citación del post de Josber Ver Mensaje
- (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.


Citación del post de Josber Ver Mensaje
(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 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.
DestinedBroken no ha iniciado sesión   Responder Con Cita
  #7
Antiguo 3 de febrero de 2022, 18:48
IDENTIFICATION DIVISION
Josber
 Super Moderador
Activista del Foro: Activista del Foro - Razón: Por aportar manuales y enriquecer   Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Razón: Por muchos agradecimientos 
ENVIRONMENT DIVISION
Avatar de Josber
DATA DIVISION
febrero 2015
Alicante
20.05.2022 10:40
PROCEDURE DIVISION
Posts: 631
Enviado: 296
Recibido: 328
Soluciones: 45
Reputación: 34
Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road
Predeterminado
1 usuarios han marcado este post como "Solución"

Citación del post de DestinedBroken Ver Mensaje
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.-
Josber no ha iniciado sesión   Responder Con Cita
  #8
Antiguo 4 de febrero de 2022, 13:20
IDENTIFICATION DIVISION
JCantero
 Senior
Activista del Foro: Activista del Foro - Razón: Por participación activa  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Razón: Por muchos agradecimientos de parte de los Foreros 
ENVIRONMENT DIVISION
Avatar de JCantero
DATA DIVISION
junio 2016
Albacete
56 años
19.05.2022 19:49
PROCEDURE DIVISION
Posts: 246
Enviado: 83
Recibido: 170
Soluciones: 11
Reputación: 23
JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road JCantero is on a distinguished road
Predeterminado

@Josber,

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

Vamos a intentar ayudarle.

JCantero no ha iniciado sesión   Responder Con Cita
  #9
Antiguo 4 de febrero de 2022, 13:53
IDENTIFICATION DIVISION
Josber
 Super Moderador
Activista del Foro: Activista del Foro - Razón: Por aportar manuales y enriquecer   Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Razón: Por muchos agradecimientos 
ENVIRONMENT DIVISION
Avatar de Josber
DATA DIVISION
febrero 2015
Alicante
20.05.2022 10:40
PROCEDURE DIVISION
Posts: 631
Enviado: 296
Recibido: 328
Soluciones: 45
Reputación: 34
Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road Josber is on a distinguished road
Predeterminado

Citación del post de JCantero Ver Mensaje
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

Josber no ha iniciado sesión   Responder Con Cita
  #10
Antiguo 5 de febrero de 2022, 21:54
IDENTIFICATION DIVISION
Kuk
 Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
diciembre 2014
Madrid
37 años
21.05.2022 00:00
PROCEDURE DIVISION
Posts: 1.990
Enviado: 687
Recibido: 850
Soluciones: 100
Reputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

Citación del post de DestinedBroken Ver Mensaje
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



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk no ha iniciado sesión   Responder Con Cita
Respuesta


Usuarios activos actualmente viendo este tema: 1 (0 miembros y 1 visitantes)
 
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



La franja horaria es GMT +1. Ahora son las 07:22.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2022, Jelsoft Enterprises Ltd.