7.- Consulta con Scroll
Vamos a preparar una consulta por pantalla, de nuestros contactos, en forma de scroll, con posibilidad de seleccionar uno directamente y además utilizando: flecha arriba, flecha abajo, avanza página, retrocede página, inicio y fin. Para ello previamente introduciremos todos los códigos de nuestra agenda en una tabla.

Esta rutina podréis aplicarla sobre cualquier archivo que tengáis por grande que sea. Veréis como es muy sencilla y además los resultados son muy buenos.

Las frases en éste color son comentarios.

Antes de seguir os indico que tendremos que aumentar la Working, con mas variables, que aquí os detallo su explicación. Así como un par de líneas necesarias para que el programa pueda venir a esta parte.

»» NUEVAS VARIABLES Nuevas variables para incluir en la Working-Storage Section.
Tabla que contendrá los códigos de nuestra agenda, le he puesto un tope de 5000 pero si vais a tener mas solo tenéis que ampliar el OCCURS.
      01  TABLACON.
           02  TCON PIC 9(4) OCCURS 5000 TIMES.


Variables para controlar la tabla y el scroll.      
      01  CCCPIC 9999.
      01  TOPE PIC 9999.
      01  TOPT PIC 9999.
      01  CABE PIC 9999.
      01  LIUPIC 99.
      01  LU  PIC 99.
      01  LO PIC 99.
      01  LIOPIC 99.


Variable que nos indica si la consulta es por código o por nombre.
      01  ALFA PIC 9.

Línea de consulta.
      01  LINPA.
           02  LSOC    PIC ZZZZB.
           02  LNOM   PIC X(30)B.
           02  LPOS    PIC 99999B.
           02  LMAI    PIC X(30)
»» INCLUIR EN EL PARRAFO Solo incluir las que están en AZUL y en ese lugar. Con ella indicaremos que pulsando sobre F10, nos iremos a la consulta.
SOCI-CERO.
      DISPLAY SPACES LINE 2 COL 16 SIZE 40.
aqui indicamos que con F10 se puede ir a consulta.

      DISPLAY " CONSULTA" LINE 2 COL 22 LOW REVERSE.
      ACCEPT C4 LINE 2 COL 16 PROMPT LOW NO BEEP
          ON EXCEPTION ESCA NEXT SENTENCE.
      DISPLAY SPACES LINE 2 COL 16 SIZE 30.
aquí si ha pulsado F10 nos vamos a la consulta.

      IF ESCA = 10 MOVE 0 TO ALFA GO CARGASOC.
      IF ESCA = 27 GO SOCIFIN.
»» CARGA DEL ARCHIVO EN LA TABLA Vamos a cargar la tabla con los códigos. La presentación en pantalla la vamos a hacer en 10 líneas, con lo cual el último párrafo es para saber donde será el último sitio donde nos podamos situar.
Ponemos a 0 el contador, inicializamos la tabla, y dependiendo si la consulta es alfabética o no, hacemos un start del archivo por la clave correspondiente.
CARGASOC.
      CLOSE AGENDA OPEN INPUT AGENDA.
      MOVE 0 TO CCC TOPE TOPT INITIALIZE TABLACON.
      IF ALFA = 0 GO CARGACOD.
      IF ALFA = 1 GO CARGANOM.


Para consultas por código.
CARGACOD.
      MOVE 0 TO AGECOD.
      START AGENDA KEY NOT LESS KEYAGE INVALID KEY
          GO CARGASOCFIN.
      GO CARGASOC1.


Para consultas por nombre.
CARGANOM.
      MOVE 0 TO AGECOD1 MOVE SPACES TO AGENOM1.
      START AGENDA KEY NOT LESS KEYAGE1 INVALID KEY
         GO CARGASOCFIN.


Leemos el archivo por la clave correspondiente y rellenamos la tabla.
CARGASOC1.
      READ AGENDA NEXT RECORD AT END GO CARGASOC2.
      COMPUTE CCC = CCC + 1 MOVE AGECOD TO TCON (CCC).
      GO CARGASOC1.


Concluida la carga, calculamos los límites de elementos y de las pantallas.
CARGASOC2.
      MOVE CCC TO TOPT.
      IF CCC > 9 SUBTRACT 9 FROM CCC GIVING CABE ELSE
          MOVE 1 TO CABE.
      IF TOPT > 10 COMPUTE TOPE = TOPT - 9 ELSE MOVE 1 TO TOPE.
          MOVE 1 TO CCC.


Ahora reabrimos el fichero y si no hemos encontrado elementos (el archivo estaba vacío) regresamos a donde estábamos.
CARGASOCFIN.
      CLOSE AGENDA OPEN INPUT AGENDA.
      IF TOPE = 0 GO SOCI-CERO.
»» PANTALLA DE CONSULTA Y PRIMERA PAGINA Creamos la ventana donde irá la consulta y ponemos la cabecera, además vamos a incluir el número total de contactos que tenemos.
Creamos la ventana y la cabecera y pies de la pantalla donde irán los datos.
CONSULTA.
      MOVE " CONSULTA CONTACTOS " TO WINTIT.
      MOVE 14 TO WINLIN MOVE 74 TO WINCOL MOVE 20 TO WINTITLO.
      DISPLAY WCB LINE 5 COL 3 ERASE
          CONTROL "WINDOW-CREATE, BCOLOR=BLUE".
      DISPLAY " " LINE 1 ERASE.
      IF ALFA = 0 DISPLAY "POR NOMBRE" LINE 14 COL 2
          LOW REVERSE ELSE
          DISPLAY "POR CODIGO" LINE 14 COL 2 LOW REVERSE.
      DISPLAY "SELECCIONA" LINE 14 COL 19 LOW REVERSE.
      DISPLAY "TOTAL CONTACTOS .." LINE 14 COL 50.
      MOVE TOPT TO DC4 DISPLAY DC4 LINE 14 COL 69 LOW.

      DISPLAY "CODI" LINE 1 COL 2 LOW REVERSE.
      DISPLAY "NOMBRE                               " LINE 1 COL 7
          LOW REVERSE.
      DISPLAY "C.POS" LINE 1 COL 38 LOW REVERSE.
      DISPLAY "CORREO ELECTRONICO            " LINE 1 COL 44
          LOW REVERSE.
      DISPLAY "---- ------------------------------" LINE 2 COL 2.
      DISPLAY "----- ------------------------------" LINE 2 COL 38.
      DISPLAY "---- ------------------------------" LINE 13 COL 2
      DISPLAY "----- ------------------------------" LINE 13 COL 38.
      MOVE CCC TO CABE.
      MOVE CABE TO LU MOVE 3 TO LIU.
CONSUL1.
      MOVE CABE TO LO MOVE 3 TO LIO.
CONSUL2.
      MOVE TCON (LO) TO AGECOD LSOC.

Párrafo para extraer del fichero AGENDA, los datos para generar las líneas.
CONSUL3.
      READ AGENDA INVALID KEY MOVE SPACES TO AGENOM AGETEL.
      MOVE AGENOM TO LNOM.
      MOVE AGEPOS TO LPOS.
      MOVE AGEMAI TO LMAI.


Dibujamos las líneas justas que caben en la pantalla.
CONSUL4.
      DISPLAY LINPA LINE LIO COL 2 LOW.
      COMPUTE LO = LO + 1 COMPUTE LIO = LIO + 1.
      IF LO > TOPT GO CONSUL5.
      IF LIO > 12 GO CONSUL5 ELSE GO CONSUL2.
Esta indicará la línea sobre la que estamos, por eso va con LOW REVERSE.
CONSUL5.
      MOVE TCON (LU) TO AGECOD LSOC.
      PERFORM CONSUL3.
      DISPLAY LINPA LINE LIU COL 2 LOW REVERSE.

En este párrafo aceptamos la tecla a pulsar para cada una de las acciones posibles.
CONSUL6.
      ACCEPT OP LINE LIU COL 1 OFF NO BEEP 
          ON EXCEPTION ESCA NEXT SENTENCE.
      IF ESCA = 27 MOVE 0 TO C4  Si hemos pulsado nos vamos.
          DISPLAY WCB CONTROL "WINDOW-REMOVE" GO CONSULFIN.
      IF ESCA = 82 GO ACUFIN. Si hemos pulsado .
      IF ESCA = 54 GO ACUINI. Si hemos pulsado .
      IF ESCA = 52 GO ACUMENOS. Si hemos pulsado .
      IF ESCA = 53 GO ACUMAS. Si hemos pulsado .
      IF ESCA = 68 GO ACUMASS. Si hemos pulsado .
      IF ESCA = 67 GO ACUMENOSS. Si hemos pulsado .
Si pulsamos cambiamos la consulta de código a nombre o viceversa.

      IF ESCA = 9 IF ALFA = 0 MOVE 1 TO ALFA
          DISPLAY WCB CONTROL "WINDOW-REMOVE" GO CARGASOC
          ELSE
          IF ALFA = 1 MOVE 0 TO ALFA
          DISPLAY WCB CONTROL "WINDOW-REMOVE" GO CARGASOC.
Si hemos pulsado seleccionamos la línea y devolvemos el código a la pantalla de mantenimiento de nuestro fichero.
      IF ESCA = 13 OR ESCA = 55 DISPLAY WCB CONTROL "WINDOW-REMOVE"
          MOVE TCON (LU) TO C4 GO CONSULFIN.
      GO CONSUL6.
»» CONTROL DE LAS TECLAS PULSADAS Y MOVIMIENTO DEL SCROLL Dependiendo de la tecla pulsada vendremos a cada uno de éstos párrafos. Veamos como actúa cada uno.
Si pulsamos movemos la última pantalla y volvemos a dibujar.
ACUFIN.
      MOVE TOPE TO CABE.
      MOVE CABE TO LU
      MOVE 3 TO LIU GO CONSUL1.


Si pulsamos nos vamos al primer elemento de la tabla y volvemos a dibujar.
ACUINI.
      MOVE 1 TO CABE.
      MOVE CABE TO LU MOVE 3 TO LIU GO CONSUL1.


Si pulsamos avanzamos una posición, siempre teniendo en cuenta que no estamos en el final, ni que traspasamos los límites de la pantalla y volvemos a dibujar.
ACUMAS.
      IF LU = TOPT GO CONSUL6.
      COMPUTE LU = LU + 1.
      IF LU > TOPT SUBTRACT 1 FROM LU GO CONSUL5.
      IF LU = LO COMPUTE CABE = CABE + 1 GO CONSUL1.
      DISPLAY LINPA LINE LIU COL 2 LOW.
      COMPUTE LIU = LIU + 1 GO CONSUL5.


Si pulsamos avanzamos 10 posiciones (las que tiene la pantalla) comprobamos los límites y volvemos a dibujar.
ACUMASS.
      COMPUTE CABE = CABE + 10.
      IF CABE >= TOPE MOVE TOPE TO CABE.
      MOVE CABE TO LU MOVE 3 TO LIU GO CONSUL1.


Si pulsamos retrocedemos 10 posiciones (las que tiene la pantalla) comprobamos los límites y volvemos a dibujar.
ACUMENOSS.
      IF CABE > 10 SUBTRACT 10 FROM CABE ELSE MOVE 1 TO CABE.
      MOVE CABE TO LU MOVE 3 TO LIU GO CONSUL1.


Si pulsamos retrocedemos una posición, controlamos los límites y volvemos a dibujar.
ACUMENOS.
      IF LU = 1 GO CONSUL6.
      COMPUTE LU = LU - 1.
      IF LU < CABE SUBTRACT 1 FROM CABE GO CONSUL1.
      DISPLAY LINPA LINE LIU COL 2 LOW.
      COMPUTE LIU = LIU - 1 GO CONSUL5.


Aqui llegamos si hemos pulsado entonces seleccionamos el código y volvemos al mantenimiento, mostrando el registro seleccionado.
CONSULFIN.
      CLOSE AGENDA OPEN I-O AGENDA.
      GO SOCI-MIRA.
Programa Agenda (Imagen 4)


Evidentemente si queremos hacer la pantalla mas grande solo tendremos que tener en cuenta cambiar los valores máximos del scroll. Así como si queremos que aparezcan menos campos u otros campos, solo con cambiar la cabecera y la variable LINPA, lo habréis conseguido. Creo que es una manera muy sencilla de hacerlo y que se puede entender bien. Yo desde que la hice, hace ya bastantes años la sigo utilizando con unos resultados excelentes. Por supuesto se puede ampliar mas y dar mas opciones de clasificación, pero eso ya os lo dejo a vosotros.

Para el próximo capítulo, veremos como generar un listado por impresora.



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=76