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