PDA

Ver la Versión Completa : [Duda] No se imprime la base de datos


DestinedBroken
1 de diciembre de 2021, 18:37
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:


program-id. BB_DD_2 as "lectura de la BB_DD_".

environment division.
configuration section.
input-output section.
file-control.
select optional empleados-archivo
assign to "f:\empleados_escritura.dat"
organization is line sequential.

data division.
file section.
fd empleados-archivo.
01 empleados-registro.
05 empleados-id pic x(9).
05 empleados-nombre pic x(25).
05 empleados-apellidos pic x(25).
05 empleados-edad pic x(3).
05 empleados-telefono pic x(9).
05 empleados-direccion pic x(35).

working-storage section.

01 FIN-DEL-ARCHIVO PIC X value "1".
01 MAXIMO-REGISTROS PIC 99 value zeroes.
01 siguiente PIC X.

procedure division.
empieza-programa.
open input empleados-archivo
perform lee-siguiente-registro
perform muestra-campos
perform lee-siguiente-registro
until fin-del-archivo = "0"
close empleados-archivo
stop run
.

muestra-campos.
if MAXIMO-REGISTROS = 10
perform siguiente-pagina
end-if
display "ID:" empleados-id
display "Nombre:" empleados-nombre
display "Apellidos:" empleados-apellidos
display "Edad:" empleados-edad
display "Telefono:" empleados-telefono
display "Direccion:" empleados-direccion

ADD 1 TO MAXIMO-REGISTROS
.

lee-siguiente-registro.
read empleados-archivo next record
at end
move "0" to FIN-DEL-ARCHIVO
.
siguiente-pagina.
display
"Presiona cualquier tecla para ver la siguiente pagina..."
accept siguiente
move zeroes to MAXIMO-REGISTROS

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:


fd empleados-archivo.
*label etiqueta-antigua-para-cintas.
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).


Y ahora lo estas displayando leyendo del fichero con otra estructura


fd empleados-archivo.
01 empleados-registro.
05 empleados-id pic x(9).
05 empleados-nombre pic x(25).
05 empleados-apellidos pic x(25).
05 empleados-edad pic x(3).
05 empleados-telefono pic x(9).
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 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,

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".



- (01) Inicializar a 0 la variable MAXIMO-REGISTROS, (que no lo haces)
Hecho :amigo:

- (02) Abrir FICHERO
open input empleados-archivo ya hecho


- (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á).


- (04) Leer fichero

read empleados-archivo next record
at end
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.


(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 (https://www.cobolforo.es/forumdisplay.php?f=44) 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
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

READ fichero
NEXT RECORD
AT END
MOVE 0 TO FIN-FICHERO
NOT AT END
PERFORM MOSTRAR
ADD 20 TO CONTADOR
PERFORM COMPROBAR

que

READ fichero
NEXT RECORD
AT END
MOVE 0 TO FIN-FICHERO
NOT AT END
PERFORM MOSTRAR
END-READ
ADD 20 TO CONTADOR
PERFORM COMPROBAR

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

READ fichero
NEXT RECORD
AT END
MOVE 0 TO FIN-FICHERO
NOT AT END
PERFORM MOSTRAR.
ADD 20 TO CONTADOR.
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
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
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 (https://www.cobolforo.es/showthread.php?t=301&p=1470)

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

DestinedBroken
9 de febrero de 2022, 09:49
Hola de nuevo gente,

Marqué la solución de @Josber como solución porque en verdad fue quien hizo que me corriera el código, pero no funciona del todo bien. Es decir, a la hora de mostrar los registros del fichero hay 2 en concreto que no muestra, "se los salta" por así decirlo.

Adjunto el fichero "empleados_escritura.dat" que estoy usando:


1 jorge perez gonzalez 25 225019357calle prueba 2
02 jorge_javier vazquez 59 650298033estudios tele5
03 maria del carmen gomez del castillo 33 205369550avenidas de las rosas 34, 40 dcha
04 alvaro narvaez sikkenga 24 663059842urb. parque giralda
05 eva maria gomez gomez 56 556200498parque amatista
06 pepito grillo 100666 en tu cabeza
07 sdasd afsasdfdf 55 564684318sdaasdasd
08 antonio gomez jurado 29 569023558calle de los milagros 45
09 rodrigo guzman del campo 36 46582238 calle de ejemplo
10 Gerardo lopez alvarez 64 954025933calle de los descubrimientos 123
11 jorge moreno diaz 55 239651022avenida de las marquesinas, 45
12 ismael del campo gordillo 45 665239125glorieta del carmen sin perdon
14 alfonso parra gomez 56 569022146avenida de las infantas
55 antonella de la cruz jimenez 25 690258167calle de las parras marchitas 38 4a
56 juanito villaparra de los montes 56 690453002avenidas de las pi¤as 45a izq
57 jorge montado gutierrez 37 620453228camino de las hesperides 3


Y como he dejado el código del programa tras algunos retoques. Ok, sé que faltan puntos y end-XXX pero no estoy seguro de donde ponerlos sin que se me ponga todo en rojo:


program-id. BB_DD_2 as "lectura de la BB_DD_".

environment division.
configuration section.
input-output section.
file-control.
select optional empleados-archivo
assign to "f:\empleados_escritura.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 FIN-DEL-ARCHIVO PIC X value "1".
01 MAXIMO-REGISTROS PIC 99 value zeroes.
01 siguiente PIC X.

procedure division.
empieza-programa.
move zeroes to MAXIMO-REGISTROS
open input empleados-archivo
perform lee-siguiente-registro
perform muestra-campos
perform lee-siguiente-registro
until fin-del-archivo = "0"
close empleados-archivo
stop run
.

muestra-campos.
if MAXIMO-REGISTROS = 5
perform siguiente-pagina
end-if
display "ID:" empleados-id
display "Nombre:" empleados-nombre
display "Apellidos:" empleados-apellidos
display "Edad:" empleados-edad
display "Telefono:" empleados-telefono
display "Direccion:" empleados-direccion

ADD 1 TO MAXIMO-REGISTROS
.

lee-siguiente-registro.
read empleados-archivo next record
at end
move "0" to FIN-DEL-ARCHIVO
display "*****FIN DEL FICHERO******"
not at end
perform muestra-campos
end-read
.
siguiente-pagina.
display
"Presiona ENTER para ver la siguiente pagina..."
accept siguiente
move zeroes to MAXIMO-REGISTROS

end program BB_DD_2.

Josber
10 de febrero de 2022, 20:50
hay 2 en concreto que no muestra, "se los salta" por así decirlo

A ver Destined, esos que se "salta", creo que no es que se los salte, si no que la condición que le has puesto al contador con MAXIMO-REGISTROS = 5, (en la línea tuya número 41), creo que debe de ser 4 en vez de 5, ya que no te cogen 5 registros en pantalla, las pantallas en modo texto, como máximo admiten 24 líneas x 80 columnas, (25 x 132 en algunas tty's especiales), y tú muestras 5 registros a 6 líneas por registro, son 30 líneas, te sobran 6.

He copiado tu código lo he modificado un poco, y sin modificarlo, funciona correctamente, yo lo he modificado para esclarecerlo un poco, poner (puntos, ect) a mi me ha quedado así y funciona perfectamente


identification division.
program-id. BB-DD-2.

environment division.
configuration section.
input-output section.
file-control.
select optional empleados-archivo
assign to "f:\empleados-escritura.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 FIN-DEL-ARCHIVO PIC X value "1".
01 MAXIMO-REGISTROS PIC 99 value zeroes.
01 siguiente PIC X.

procedure division.
empieza-programa.
move zeroes to MAXIMO-REGISTROS.
open input empleados-archivo.
* perform lee-siguiente-registro
* perform muestra-campos
perform lee-siguiente-registro
until fin-del-archivo = "0".
close empleados-archivo.
stop run.

muestra-campos.
if MAXIMO-REGISTROS = 4
perform siguiente-pagina
end-if.
display "ID:" empleados-id
display "Nombre:" empleados-nombre
display "Apellidos:" empleados-apellidos
display "Edad:" empleados-edad
display "Telefono:" empleados-telefono
display "Direccion:" empleados-direccion.

ADD 1 TO MAXIMO-REGISTROS.

lee-siguiente-registro.
read empleados-archivo next record
at end
move "0" to FIN-DEL-ARCHIVO
display "*****FIN DEL FICHERO******"
not at end
perform muestra-campos
end-read.

siguiente-pagina.
display
"Presiona ENTER para ver la siguiente pagina...".
accept siguiente no beep.
move zeroes to MAXIMO-REGISTROS.
*
end program BB-DD-2.

Te he "anulado", esa doble lectura que haces al principio del programa, primero lees un registro y luego creas un bucle para leer desde el segundo hasta el último, no entiendo por qué lo haces así, pero desde luego, no es lo correcto. La anulación ha sido "comentando" la línea, no sé si te habrán explicado para qué sirve la columna 7 pero, entre otras muchas cosas, cuando pones un asterisco en esa columna, esa línea pasa a ser ignorada por el compilador, es lo que se llama comentar una línea.
El "no beep", que he puesto al final del ACCEPT, es para que no pite cada vez que pida pulsar la tecla

Dime si hay algo que no entiendas o no tengas claro.

Un salu2.-

Kuk
10 de febrero de 2022, 23:19
@Josber, yo creo que se ha liado un poco pero lo que quería hacer es esto:


open input empleados-archivo

perform lee-siguiente-registro

perform until fin-del-archivo = "0"
perform muestra-campos
perform lee-siguiente-registro
end-perform

close empleados-archivo

DestinedBroken
11 de febrero de 2022, 09:50
@Josber,

Nada más que vi en tu código identification division ya supe por qué me instabas a usar tanto los puntos. Trabajamos con IDEs diferentes. MicroFocus COBOL para Eclipse te crea una "Plantilla" al vacío cuando creas un nuevo fichero .cbl. "El compilador suyo" no necesita escribir el nombre de la primera división, al igual que funciona correctamente sin poner puntos al final de las sentencias. Diferencias tontas, vaya.

Por otra parte, no tenía ni idea de esto:

las pantallas en modo texto, como máximo admiten 24 líneas x 80 columnas, (25 x 132 en algunas tty's especiales), y tú muestras 5 registros a 6 líneas por registro, son 30 líneas, te sobran 6.

Cambiando MAXIMO-REGISTROS a 4 me salen los registros perfectamente por consola, en orden y sin tabulaciones extrañas. Pero no termina de funcionar a la perfección. El campo "ID" del primer registro nunca sale:
https://i.ibb.co/qJJ7SQH/cmd1.jpg

primero lees un registro y luego creas un bucle para leer desde el segundo hasta el último, no entiendo por qué lo haces así
Porque así estaba en el ejercicio del curso. A mí tampoco me terminaba de convencer, pero no terminaba de encontrar la manera de reajustar el párrafo ese de código. Ahora que lo veo corregido, "muestra-campos" ya está dentro de la rutina "lee-siguiente-registro". Debió ser que se me quedó ahí descolgado una vez modifiqué la rutina de leer el registro (aspecto donde también me echaste un cable).

El "no beep", que he puesto al final del ACCEPT, es para que no pite cada vez que pida pulsar la tecla
Recién me entero que el ordenador tiene que pitar. A mí nunca me pasa :confused:


@Kuk, no funciona tu código:

https://i.ibb.co/Hd185hd/cmd3.jpg

Independientemente de eso, el programa lo único que tiene que hacer ese mostrar cada X veces (MAXIMO-REGISTROS) los registros de un fichero. Por lo que diagnosticó @Josber se leía el primero y luego se recorrían todos en bucle, en vez de arreglar eso y meterlos todos dentro del bucle. Es una tontería, recuerdo que cuando comencé con Java también la cagaba en estas memeces...

Kuk
11 de febrero de 2022, 11:22
@DestinedBroken, a ver vamos a clararlo todo porque se está liando un poco la cosa.

Primero, los puntos. Los puntos eran necesarios cuando no existían los terminadores explícitos de las instrucciones, es decir los END-IF, END-PERFORM etc. no eran aceptados por el compilador. EL estándar ANS74 trajo estos terminadores explícitos eliminando la necesidad de usar los puntos como terminadores de instrucción.

La desventaja de los puntos es que se ven mal, y siendo Cobol un lenguaje que se basa en palabras inglesas y no en signos y derivados como es el caso de otros lenguajes, los puntos son difíciles de detectar y sobre todo de controlar. Es por ello que cualquier compilador de hoy en día que usa estándares >= ANS74 no obliga a usar los puntos en la PROCEDURE DIVISION dentro del párrafo. El único punto obligatorio es el del fin de párrafo, nada más. Y te recomiendo NO usar los puntos sino poner uno sólo en una línea nueva al final del párrafo (cada párrafo, lógicamente) para que sea bien visible.

Segundo, la pantalla. @Josber se refiere a la SCREEN SECTION, es decir a que tengamos una interfaz definida y la usemos de pantalla. Efectivamente, por herencia son 24x80. Ahora, si simplemente quieres hacer DYSPLAY como System.out.println(), puedes hacer tantos como quieras sin restricción alguna. Solo que dependiendo de la consola/terminal y su buffer, te irá guardando las últimas X líneas, no tiene más.

Tercero, sobre que MF Cobol acepta y no... Todo depende del Dialecto seleccionado. Un dialecto viene a ser un juego de reglas y directivas de compilación para respetar un estándar o comportamiento de un compilador específico. Por defecto, y es lógico, el dialecto en Visual COBOL es el de Micro Focus, que es extremadamente permisivo. Language Features - Dialect (https://www.microfocus.com/documentation/visual-cobol/VC40/EclWin/HRCDRHCDIR05.html)

Cuarto, la lógica de lectura de un fichero de manera secuencial es la siguiente:


lees el fichero
dentro del bucle: 1 - muestras campos, 2 - vuelves a leer
si la lectura ha sido correcta, vuelve a iterar, si no, sale del bucle


Ojo. Bajo Windows, la consola no es tan ortodoxa como bajo Linux, bajo Windows incluso diría que está bastante mal hecha, va a su bola. Por tanto, si no usas SCREEN SECTION no esperes gran cosa, porque a veces el comportamiento no es del todo adecuado. En todo caso, lo primero que tienes que hacer es incrementar el buffer de la consola a 900 por ejemplo (estará en 50 por defecto)

728

Mira el programa, lo he modificado, lo pruebas y me dices:

identification division.
program-id. BB-DD-2.

environment division.
configuration section.
input-output section.
file-control.
select optional empleados-archivo
assign to "f:\empleados-escritura.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 FIN-DEL-ARCHIVO PIC X value "1".
01 MAXIMO-REGISTROS PIC 99 value zeroes.
01 siguiente PIC X.

procedure division.

move zeroes to MAXIMO-REGISTROS.
open input empleados-archivo.

perform lee-siguiente-registro

perform until fin-del-archivo = "0"
perform muestra-campos
perform lee-siguiente-registro
end-perform

close empleados-archivo

goback
.

muestra-campos.
if MAXIMO-REGISTROS = 4
perform siguiente-pagina
end-if

display "ID: " empleados-id
display "Nombre: " empleados-nombre
display "Apellidos: " empleados-apellidos
display "Edad: " empleados-edad
display "Telefono: " empleados-telefono
display "Direccion: " empleados-direccion

ADD 1 TO MAXIMO-REGISTROS
.

lee-siguiente-registro.
read empleados-archivo next record
at end
move "0" to FIN-DEL-ARCHIVO

display "*****FIN DEL FICHERO******"
end-read
.

siguiente-pagina.
display
"Presiona ENTER para ver la siguiente pagina..."
accept siguiente no beep.
display erase
move zeroes to MAXIMO-REGISTROS
.




Y por último, lo de la paginación, lo que haces normalmente no se hace nunca, lo he dejado para no modificar tu programa mucho. Pero la paginación se usa sólo con SCREEN SECTION. el DISPLAY "simple" sólo se usa para los tests o en tratamientos Batch.

Josber
11 de febrero de 2022, 12:16
Por cierto, usé el antiguo compilador RM-Cobol85 versión 5 para MS-DOS, porque era el que más a mano tenía y, ese es más estricto con el terma de las divisiones, los puntos, etc.
Los compiladores de hoy en día, ya no lo son tanto, PWC, por ejemplo, no necesita que exista ni IDENTIFICATION DIVISION, ni ENVIRONMENT DIVISION, tampoco es necesario cortar antes de llegar a la columna 72 y alguna cosilla más, son ventajas que se han ido añadiendo pero, cuando coges un compilador que usa ANS85, como el que yo he usado, te dan error por todos los sitios, en tu caso, supongo que el que estás usando, usará ANS2010, por lo que no será tan estricto.

Un salu2.-

DestinedBroken
16 de febrero de 2022, 11:54
@Kuk,

El tema de los puntos y los END-XXX lo había entendido a la perfección. Solamente estaba hablando con @Josber sobre cómo yo los trataba. Efectivamente, uso solamente los puntos al final del párrafo y los terminadores END cuando es necesario. No siempre que sea. Si entender lo entiendo bien, pero este es el foro de Micro Focus con Eclipse, donde la sintaxis funciona diferente a compiladores antiguos. Normal que en un ambiente de trabajo tengas problemas, pero no en otros.

La consola ya es un problema que se me está repitiendo demasiado. ¿Recuerdas al principio cuando te lo comenté por aquí? Me echaste una mano con la creación de un .gnt en vez de un .exe y demás. Ahora parece que, no solo tiene un comportamiento errático como has dicho, sino que no puedo estar seguro si el que no me aparezca una línea por consola es mi culpa como programador, o culpa de la consola de Windows. Cambié el buffer a 900, pero no hay ningún cambio en la ejecución del programa.

Y sobre el programa, pues lo he vuelto a probar y no me funciona:
https://i.ibb.co/qN8KC58/nofunciona.jpg

A todo esto, estoy leyéndome el manual de Andrés poco a poco. Intento compaginarlo con uno de IBM que encontré por aquí. Pero si veo que ni mi propio entorno me permite trabajar en condiciones, tendré que dejar COBOL.

Saludos~

Kuk
18 de febrero de 2022, 16:38
@DestinedBroken, lo que tienes que hacer no montar lógica con la pantalla sin SCREEN SECTION y simplemente hacer aparecer algunas cosas en al pantalla. Si lo que pretendes es hacer verificaciones de muchos datos, escríbelos en un fichero de salida y te evitas los dolores de cabeza con este tema.