8.- Opción de Listado
En la opción de listado, antes de pasar directamente a imprimir, vamos a sacar una ventana con una serie de opciones para hacer el listado de varias maneras. Esto es lo que vamos a ver en éste capítulo. Para ello vamos a utilizar una ventana para hacer las preguntas y a 2 de ellas responderemos con un menú de opciones. Para ello aumentaremos de nuevo la Working-Storage con nuevas variables.

Las frases en éste color son comentarios.

Modificaremos el párrafo LISTADO, que hasta ahora solo nos indicaba que habíamos cogido esa opción. Gracias a éstas preguntas, podremos generar el listado de varias formas y no tener que hacer programas distintos para distintos listados, si lo depuramos mucho mas se pueden conseguir realmente cosas interesantes. Vamos a conseguir sacar el listado ordenado por cuatro campos, además pudiendo elegir en cada caso una opción valida, así como incluir separadores para cada cambio de clave y elegir porque tipo de impresora saldrá o pantalla.

»» NUEVAS VARIABLES Nuevas variables para incluir en la Working-Storage Section.
Estas tablas contendrán las opciones para conseguir un listado mas personalizado.
      01   TABLALISTADO.
            02   FILLER PIC X(24) VALUE " CODIGONOMBRE ".
            02   FILLER PIC X(24) VALUE " POBLACION PROVINCIA ".
      01   LISTADOTABLA REDEFINES TABLALISTADO.
            02   ELELIS PIC X(12) OCCURS 4 TIMES.
      01   TABLAPORLIS.
            02   FILLER PIC X(30) VALUE " IMPRESORA HP OTRA IMPRESORA".
            02   FILLER PIC X(15) VALUE " PANTALLA".
      01   LISPORTABLA REDEFINES TABLAPORLIS.
            02   ELEPOR PIC X(15) OCCURS 3 TIMES.


Estas variables, son para saber que opciones hemos escogido.
     01   LISCLA PIC 9.
      01   LISPOR PIC X.
      01   LISSEP PIC X.
      01   DESDEPIC 9(4).
      01   HASTAPIC 9(4).
      01   DEPOBPIC X(20).
      01   DEPROPIC X(15).
»» MODIFICAR PARRAFO El PARRAFO LISTADO, que antes solo indicaba que habíamos escogido esa opción será sustituido por todo lo que salga a partir de aquí.
En principio, creamos una ventana donde nos preguntara, por el tipo de listado que queramos generar.
LISTADO.
      MOVE 7 TO WINLIN MOVE 35 TO WINCOL.
      MOVE " LISTADO " TO WINTIT MOVE 9 TO WINTITLO.
      MOVE WCB TO WIN (2).
      DISPLAY WIN (2) LINE 13 COL 35 LOW ERASE CONTROL
          "WINDOW-CREATE, FCOLOR=WHITE, BCOLOR=BROWN".
LISTA0.
      DISPLAY "CLASIFICAR POR.." LINE 1 COL 2.
      DISPLAY "SEPARADOR ?? ..." LINE 4 COL 2.
      DISPLAY "IMPRIMIR POR ..." LINE 5 COL 2.
      ...
Programa Agenda (Imagen 5)

Como habréis podido comprobar el tipo de programación que he utilizado no es nada estructurado y utilizo mucho la sentencia GO.
En la actualidad no programo así, pero aquí se muestra tal y como lo hacía antes. Los programas funcionan correctamente y exactamente igual, pero me he dado cuenta que la programación estructurada es mucho mas fácil de leer y entender.
»» RESPUESTA A LAS PREGUNTAS Veamos como aceptamos las diferentes opciones que nos propone el listado, si creéis que se pueden añadir mas, me lo decís y las preparo.
Para la primera pregunta, ordenar por, generamos otra ventana con las opciones posibles.      MOVE 0 TO LI.
      MOVE 4 TO WINLIN MOVE 12 TO WINCOL.
      MOVE SPACES TO WINTIT MOVE 0 TO WINTITLO.
      MOVE WCB TO WIN (3).
      DISPLAY WIN (3) LINE 13 COL 56 LOW ERASE
          CONTROL "WINDOW-CREATE, FCOLOR=WHITE, BCOLOR=BLUE".
LISTA1.
      ADD 1 TO LI IF LI > 4 GO LISTA2.
      DISPLAY ELELIS (LI) LINE LI COL 1 LOW.
      GO LISTA1.
LISTA2.
      IF LI > 4 MOVE 1 TO LI.
      IF LI < 1 MOVE 4 TO LI.
      DISPLAY ELELIS (LI) LINE LI COL 1 LOW REVERSE.
LISTA3.
      ACCEPT OP LINE LI COL 1 OFF NO BEEP
          ON EXCEPTION ESCA NEXT SENTENCE.
      DISPLAY ELELIS (LI) LINE LI COL 1 LOW.
      IF ESCA = 53 ADD 1 TO LI GO LISTA2.
      IF ESCA = 52 SUBTRACT 1 FROM LI GO LISTA2.
      IF ESCA = 27 DISPLAY WIN (3) CONTROL "WINDOW-REMOVE"
          GO LISTAFIN.
      IF ESCA = 13 NEXT SENTENCE ELSE GO LISTA2.
      DISPLAY WIN (3) CONTROL "WINDOW-REMOVE".
      MOVE LI TO LISCLA.
      DISPLAY ELELIS (LI) LINE 1 COL 20 LOW.
Según cojamos una u otra opción, se nos plantearán unas preguntas distintas, por eso nos vamos a párrafos distintos.
      IF LISCLA = 1 OR LISCLA = 2 GO LISTA31.
      IF LISCLA = 3 GO LISTA33.
      IF LISCLA = 4 GO LISTA34.


Estos dos párrafos se ejecutarán en el caso de haber seleccionado clasificar por nombre o por código, entonces se nos pedirán un DESDE y un HASTA para nuestro listado.
LISTA31.
      DISPLAY "DESDE .. " LINE 2 COL 2.
      DISPLAY "HASTA .. " LINE 2 COL 21.
      ACCEPT DESDE LINE 2 COL 12 PROMPT LOW NO BEEP
          ON EXCEPTION ESCA NEXT SENTENCE.
      IF ESCA = 27 GO LISTA0.
      IF DESDE = 0 DISPLAY "LISTAR TODOS "
          LINE 2 COL 12 LOW GO LISTA4.
      MOVE DESDE TO DC4 DISPLAY DC4 LINE 2 COL 12 LOW.
LISTA32.
      ACCEPT HASTA LINE 2 COL 32 PROMPT LOW NO BEEP
          ON EXCEPTION ESCA NEXT SENTENCE.
      IF ESCA = 27 GO LISTA31.
      IF DESDE > HASTA GO LISTA32.
      MOVE HASTA TO DC4 DISPLAY DC4 LINE 2 COL 32 LOW.
      GO LISTA4.


Si hemos seleccionado clasificar por POBLACION, nos pedirá que le indiquemos una, por si solo queremos listar los de esa población o sino todos.
LISTA33.
      DISPLAY "POBLACION .." LINE 2 COL 2.
      ACCEPT DEPOB LINE 2 COL 21 LOW NO BEEP ECHO
          ON EXCEPTION ESCA NEXT SENTENCE.
      IF ESCA = 27 GO LISTA0.
      IF DEPOB = SPACES DISPLAY "LISTAR TODOS "
          LINE 2 COL 21 LOW GO LISTA4.
      GO LISTA4.


Si hemos seleccionado clasificar por PROVINCIA, nos pedirá que le indiquemos una, por si solo queremos listar los de esa provincia o sino todos.
LISTA34.
      DISPLAY "PROVINCIA .." LINE 2 COL 2.
      ACCEPT DEPRO LINE 2 COL 21 LOW NO BEEP ECHO
          ON EXCEPTION ESCA NEXT SENTENCE.
      IF ESCA = 27 GO LISTA0.
      IF DEPOB = SPACES DISPLAY "LISTAR TODOS "
          LINE 2 COL 21 LOW GO LISTA4.


Aquí preguntaremos si deseamos separador en el listado, cada vez que cambie la clave por la que hemos seleccionado clasificar, esto es muy útil, por ejemplo si lo hacemos por Población o por Provincia, porque cada vez que cambie el valor, le indicaremos que realice un subtotal y una separación.
LISTA4.
      IF LISCLA = 1 MOVE "N" TO OP ELSE MOVE "S" TO OP.
      ACCEPT OP LINE 4 COL 21 UPDATE NO BEEP LOW
          ON EXCEPTION ESCA NEXT SENTENCE.
      IF ESCA = 27 DISPLAY " " LINE 4 COL 21 GO LISTA0.
      IF OP = "S" OR OP = "N" NEXT SENTENCE ELSE GO LISTA4.
      MOVE OP TO LISSEP.


Volvemos a crear otra ventana, para ofrecernos las opciones del listado, por Impresora HP, Otra impresora o por pantalla.
LISTA5.
      MOVE 3 TO WINLIN MOVE 15 TO WINCOL.
      MOVE SPACES TO WINTIT MOVE 0 TO WINTITLO.
      MOVE WCB TO WIN (4).
      DISPLAY WIN (4) LINE 18 COL 56 LOW ERASE
          CONTROL "WINDOW-CREATE, FCOLOR=WHITE, BCOLOR=BLUE".
      MOVE 0 TO LI.
LISTA51.
      ADD 1 TO LI IF LI > 3 GO LISTA52.
      DISPLAY ELEPOR (LI) LINE LI COL 1 LOW.
      GO LISTA51.
LISTA52.
      IF LI > 3 MOVE 1 TO LI.
      IF LI < 1 MOVE 3 TO LI.
      DISPLAY ELEPOR (LI) LINE LI COL 1 LOW REVERSE.
LISTA53.
      ACCEPT OP LINE LI COL 1 OFF NO BEEP
          ON EXCEPTION ESCA NEXT SENTENCE.
      DISPLAY ELEPOR (LI) LINE LI COL 1 LOW.
      IF ESCA = 53 ADD 1 TO LI GO LISTA52.
      IF ESCA = 52 SUBTRACT 1 FROM LI GO LISTA52.
      IF ESCA = 27 DISPLAY WIN (4) CONTROL "WINDOW-REMOVE"
          GO LISTA4.
      IF ESCA = 13 NEXT SENTENCE ELSE GO LISTA52.
      DISPLAY WIN (4) CONTROL "WINDOW-REMOVE".
      MOVE LI TO LISPOR.
      DISPLAY ELEPOR (LI) LINE 5 COL 20 LOW.


Preguntamos si todo es correcto y si es así nos dispondríamos a desarrollar el listado. Pero eso lo veremos en otro capítulo.
LISTA7.
      DISPLAY "TODO CORRECTO ?" LINE 7 COL 2.
      ACCEPT OP LINE 7 COL 23 PROMPT LOW NO BEEP
          ON EXCEPTION ESCA NEXT SENTENCE.
      DISPLAY SPACES LINE 7 SIZE 35.
      IF OP = "N" OR ESCA = 27 GO LISTA5.
      IF OP NOT = "S" GO LISTA7.
LISTA8.
      DISPLAY "PROXIMO CAPITULO, EL LISTADO"
          LINE 7 COL 2 LOW.
      ACCEPT OP LINE 2 COL 1 OFF NO BEEP.


Párrafo para abandonar el listado.
LISTAFIN.
      DISPLAY WIN (2) CONTROL "WINDOW-REMOVE".
      GO TRES.
Programa Agenda (Imagen 6)

Espero que os guste la idea de preseleccionar una serie de opciones antes de lanzar el listado, como veis, así nos podemos ahorrar muchos listados, ya que en uno solo, podemos obtener varios. En el próximo capítulo, veremos el desarrollo necesario para hacer realidad lo que hemos seleccionado en ésta ventana previa.



Este artículo proviene de Cobol en español
http://www.escobol.com

La dirección de esta noticia es:
http://www.escobol.com/modules.php?name=Sections&op=viewarticle&artid=77