Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Micro Focus COBOL Visual COBOL y DEV-HUB
Visual COBOL y DEV-HUB El último IDE de MicroFocus basado en Eclipse y MS Visual Studio.
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Duda] I/O Error al ejecutar una base de datos DestinedBroken Visual COBOL y DEV-HUB 11 2 de febrero de 2022 11:13
[Sintaxis] URGENTE: Base de Datos en MySql en Red Hrmcobol PowerCOBOL (ActiveX, v4 - v11) 10 21 de agosto de 2021 15:30
Base de datos .mdb Lobosauseda Bases de datos 4 26 de agosto de 2019 09:36
[Sintaxis] Abrir o visualizar Base de datos Cobol Anuack COBOL - General 0 11 de julio de 2017 11:08
[Sintaxis] Ayuda para interactuar con base de Datos Breew PowerCOBOL (ActiveX, v4 - v11) 19 28 de enero de 2016 22:46

Respuesta
 
Herramientas

  #11
Antiguo 9 de febrero de 2022, 09:49
DestinedBroken
Forero Junior
Última Actividad 16.02.2022 11:57
Posts Posts: 28
Likes enviados Enviados: 16
Likes recibidos Recibidos: 4

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:

Código:
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:

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(6).
  16.          05 empleados-nombre pic x(25).
  17.          05 empleados-apellidos pic x(35).
  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.            move zeroes to MAXIMO-REGISTROS
  31.            open input empleados-archivo
  32.            perform lee-siguiente-registro
  33.            perform muestra-campos
  34.            perform lee-siguiente-registro
  35.              until fin-del-archivo = "0"
  36.            close empleados-archivo
  37.            stop run
  38.            .
  39.  
  40.        muestra-campos.
  41.            if MAXIMO-REGISTROS = 5
  42.                perform siguiente-pagina
  43.            end-if
  44.            display "ID:" empleados-id
  45.            display "Nombre:" empleados-nombre
  46.            display "Apellidos:" empleados-apellidos
  47.            display "Edad:" empleados-edad
  48.            display "Telefono:" empleados-telefono
  49.            display "Direccion:" empleados-direccion
  50.            
  51.            ADD 1 TO MAXIMO-REGISTROS
  52.            .
  53.  
  54.        lee-siguiente-registro.
  55.            read empleados-archivo next record
  56.                at end
  57.                    move "0" to FIN-DEL-ARCHIVO
  58.                    display "*****FIN DEL FICHERO******"
  59.                not at end
  60.                   perform muestra-campos
  61.            end-read
  62.            .
  63.        siguiente-pagina.
  64.            display
  65.              "Presiona ENTER para ver la siguiente pagina..."
  66.            accept siguiente
  67.            move zeroes to MAXIMO-REGISTROS
  68.  
  69.        end program BB_DD_2.
DestinedBroken is offline   Responder Con Cita
  #12
Antiguo 10 de febrero de 2022, 20:50
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

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

Código COBOL:
  1.        identification division.
  2.        program-id. BB-DD-2.
  3.  
  4.        environment division.
  5.        configuration section.
  6.        input-output section.
  7.        file-control.
  8.            select optional empleados-archivo
  9.            assign to "f:\empleados-escritura.dat"
  10.            organization is line sequential.
  11.  
  12.        data division.
  13.        file section.
  14.        fd empleados-archivo.
  15.        01 empleados-registro.
  16.          05 empleados-id pic x(6).
  17.          05 empleados-nombre pic x(25).
  18.          05 empleados-apellidos pic x(35).
  19.          05 empleados-edad pic x(3).
  20.          05 empleados-telefono pic x(9).
  21.          05 empleados-direccion pic x(35).
  22.  
  23.        working-storage section.
  24.  
  25.        01 FIN-DEL-ARCHIVO PIC X value "1".
  26.        01 MAXIMO-REGISTROS PIC 99 value zeroes.
  27.        01 siguiente PIC X.
  28.  
  29.        procedure division.
  30.        empieza-programa.
  31.            move zeroes to MAXIMO-REGISTROS.
  32.            open input empleados-archivo.
  33.      *    perform lee-siguiente-registro
  34.      *    perform muestra-campos
  35.            perform lee-siguiente-registro
  36.                    until fin-del-archivo = "0".
  37.            close empleados-archivo.
  38.            stop run.
  39.  
  40.        muestra-campos.
  41.            if MAXIMO-REGISTROS = 4
  42.                perform siguiente-pagina
  43.            end-if.
  44.            display "ID:" empleados-id
  45.            display "Nombre:" empleados-nombre
  46.            display "Apellidos:" empleados-apellidos
  47.            display "Edad:" empleados-edad
  48.            display "Telefono:" empleados-telefono
  49.            display "Direccion:" empleados-direccion.
  50.            
  51.            ADD 1 TO MAXIMO-REGISTROS.
  52.  
  53.        lee-siguiente-registro.
  54.            read empleados-archivo next record
  55.                at end
  56.                    move "0" to FIN-DEL-ARCHIVO
  57.                    display "*****FIN DEL FICHERO******"
  58.                not at end
  59.                   perform muestra-campos
  60.            end-read.
  61.  
  62.        siguiente-pagina.
  63.            display
  64.              "Presiona ENTER para ver la siguiente pagina...".
  65.            accept siguiente no beep.
  66.            move zeroes to MAXIMO-REGISTROS.
  67.      *
  68.        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.-
Josber is offline   Responder Con Cita
  #13
Antiguo 10 de febrero de 2022, 23:19
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@Josber, yo creo que se ha liado un poco pero lo que quería hacer es esto:

Código COBOL:
  1.           open input empleados-archivo
  2.          
  3.           perform lee-siguiente-registro
  4.  
  5.           perform until fin-del-archivo = "0"
  6.               perform muestra-campos
  7.               perform lee-siguiente-registro    
  8.           end-perform
  9.          
  10.           close empleados-archivo



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 is offline   Responder Con Cita
  #14
Antiguo 11 de febrero de 2022, 09:50
DestinedBroken
Forero Junior
Última Actividad 16.02.2022 11:57
Posts Posts: 28
Likes enviados Enviados: 16
Likes recibidos Recibidos: 4

@Josber,

Nada más que vi en tu código
Código COBOL:
  1. 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:

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


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

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



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...
DestinedBroken is offline   Responder Con Cita
  #15
Antiguo 11 de febrero de 2022, 11:22
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@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

Cuarto, la lógica de lectura de un fichero de manera secuencial es la siguiente:
  1. lees el fichero
  2. dentro del bucle: 1 - muestras campos, 2 - vuelves a leer
  3. 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)

Pulsar la imagen para la versión amplia
Nombre:  VC_CMD_BUFFER.png
Vistas: 84
Tamaño:  45,0 KB

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

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


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.



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 is offline   Responder Con Cita
  #16
Antiguo 11 de febrero de 2022, 12:16
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

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.-
Josber is offline   Responder Con Cita
  #17
Antiguo 16 de febrero de 2022, 11:54
DestinedBroken
Forero Junior
Última Actividad 16.02.2022 11:57
Posts Posts: 28
Likes enviados Enviados: 16
Likes recibidos Recibidos: 4

@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:


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~
DestinedBroken is offline   Responder Con Cita
  #18
Antiguo 18 de febrero de 2022, 16:38
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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



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 is offline   Responder Con Cita
Respuesta



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 13:03.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.