8.- Clasificando y FIN
EL EVENTO OPENED

En el capítulo anterior nos quedo por el evento que se produce al abrir la ventana, es decir, el que se produce en el OPENED. En el vamos a rellenar la tabla con los registros que tenemos en el fichero de Agenda y además crearemos el gráfico y totalizaremos por tipos de contactos.

En primer lugar nos definiremos una Working propia para trabajar sobre algunas variables, como contadores y la tabla con los tipos de contactos. Para seguir con la estructura de programación que he utilizado durante todo el curso, voy a utilizar párrafos y sentencias GOTO, pero tengo intención de hacer un especial sobre programación estructurada en la que explicaré las diferencias entre un tipo de programación y otro, con ejemplos, así que ahora seguiré como siempre.

Fijaros que el párrafo UNO, lo utilizamos para leer el fichero de principio a fin e ir rellenando los campos que componen la tabla. El párrafo DOS lo utilizamos para construir el gráfico tomando como valor máximo el del tipo de contacto mayor.

PROGRAMACION EVENTO OPENED
      ENVIRONMENT DIVISION.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01  COLUMNAS PIC 9999.
      01  CUENTA   PIC 999.
      01  TIPO1    PIC 9(4).
      01  TIPO2    PIC 9(4).
      01  TIPO3    PIC 9(4).
      01  TIPO4    PIC 9(4).
      01  TIPO5    PIC 9(4).
      01  DEBA     PIC 9(4).
      01  MAX      PIC 9(4).
      01  GENH     PIC 9(4).
      01  GENM     PIC 9(4).
      01  TIPO     PIC X(12).
      01  LNUMERO.
             02  LNUM PIC ZZ.ZZ9.
      01  TABLATIPOS.
            02  FILLER PIC X(15) VALUE "PERSONAL       ".
            02  FILLER PIC X(15) VALUE "PROFESIONAL".
            02  FILLER PIC X(15) VALUE "FAMILIAR".
            02  FILLER PIC X(15) VALUE "EMPRESAS".
            02  FILLER PIC X(15) VALUE "SANITARIO".
      01  TABLITIPOS REDEFINES TABLATIPOS.
            02  ELETIP PIC X(15) OCCURS 5 TIMES.

      PROCEDURE DIVISION.
      INICIO SECTION.
             CLOSE AGENDA.
             OPEN INPUT AGENDA.
             OPEN OUTPUT CLASI.
             MOVE 0 TO POW-VISIBLE OF TABLA.
             MOVE 0 TO CCC TIPO1 TIPO2 TIPO3 TIPO4 TIPO5 GENH GENM.
      UNO.
             READ AGENDA NEXT RECORD AT END GO DOS.
             ADD 1 TO CCC.
             MOVE CCC TO POW-ROWS OF TABLA.
             CALL SETCELLNUMERIC OF TABLA USING AGECOD CCC 1
             MOVE AGECOD TO CLACOD.
             CALL SETCELLTEXT OF TABLA USING AGENOM CCC 2
             MOVE AGENOM TO CLANOM.
             CALL SETCELLTEXT OF TABLA USING AGEDOM CCC 3
             MOVE AGEDOM TO CLADOM.
             CALL SETCELLNUMERIC OF TABLA USING AGEPOS CCC 4
             MOVE AGEPOS TO CLAPOS.
             CALL SETCELLTEXT OF TABLA USING AGEPOB CCC 5
             MOVE AGEPOB TO CLAPOB.
             CALL SETCELLTEXT OF TABLA USING AGEPRO CCC 6
             MOVE AGEPRO TO CLAPRO.
             MOVE ELETIP (AGETIP) TO TIPO.
             CALL SETCELLTEXT OF TABLA USING TIPO CCC 7
             MOVE TIPO TO CLATIP.
             CALL SETCELLTEXT OF TABLA USING AGETEL CCC 8
             MOVE AGETEL TO CLATEL.
             CALL SETCELLTEXT OF TABLA USING AGEMOV CCC 9
             MOVE AGEMOV TO CLAMOV.
             CALL SETCELLTEXT OF TABLA USING AGEMAI CCC 10
             MOVE AGEMAI TO CLAMAI.
             WRITE REGCLA.

             EVALUATE AGETIP
                   WHEN 1 ADD 1 TO TIPO1
                   WHEN 2 ADD 1 TO TIPO2
                   WHEN 3 ADD 1 TO TIPO3
                   WHEN 4 ADD 1 TO TIPO4
                   WHEN 5 ADD 1 TO TIPO5
             END-EVALUATE
             EVALUATE AGEGEN
                   WHEN "H" ADD 1 TO GENH
                   WHEN "M" ADD 1 TO GENM
             END-EVALUATE
             GO UNO.

      DOS.
              MOVE 1 TO POW-VISIBLE OF TABLA.
              MOVE CCC  TO LNUM MOVE LNUMERO TO POW-TEXT OF TOTAL.
              MOVE GENH TO LNUM MOVE LNUMERO TO POW-TEXT OF DEH.
              MOVE GENM TO LNUM MOVE LNUMERO TO POW-TEXT OF DEM.
              IF TIPO1 > TIPO2 AND TIPO1 > TIPO3 AND TIPO1 > TIPO4 AND TIPO1 > TIPO5
                   COMPUTE MAX = TIPO1 + 2.
              IF TIPO2 > TIPO1 AND TIPO2 > TIPO3 AND TIPO2 > TIPO4 AND TIPO2 > TIPO5
                   COMPUTE MAX = TIPO2 + 2.
              IF TIPO3 > TIPO1 AND TIPO3 > TIPO2 AND TIPO3 > TIPO4 AND TIPO3 > TIPO5
                   COMPUTE MAX = TIPO3 + 2.
              IF TIPO4 > TIPO1 AND TIPO4 > TIPO2 AND TIPO4 > TIPO3 AND TIPO4 > TIPO5
                   COMPUTE MAX = TIPO4 + 2.
              IF TIPO5 > TIPO1 AND TIPO5 > TIPO2 AND TIPO5 > TIPO3 AND TIPO5 > TIPO4
                   COMPUTE MAX = TIPO5 + 2.
              MOVE MAX TO POW-UPPER OF GRAFICO.
              MOVE TIPO1 TO LNUM MOVE LNUMERO TO POW-TEXT OF DE1.
              MOVE TIPO1 TO POW-DATA (1) OF GRAFICO.
              MOVE POW-RED TO POW-DATACOLOR (1) OF GRAFICO.
              MOVE TIPO2 TO LNUM MOVE LNUMERO TO POW-TEXT OF DE2.
              MOVE TIPO2 TO POW-DATA (2) OF GRAFICO.
              MOVE POW-BLUE TO POW-DATACOLOR (2) OF GRAFICO.
              MOVE TIPO3 TO LNUM MOVE LNUMERO TO POW-TEXT OF DE3.
              MOVE TIPO3 TO POW-DATA (3) OF GRAFICO.
              MOVE POW-BLACK TO POW-DATACOLOR (3) OF GRAFICO.
              MOVE TIPO4 TO LNUM MOVE LNUMERO TO POW-TEXT OF DE4.
              MOVE TIPO4 TO POW-DATA (4) OF GRAFICO.
              MOVE POW-DARKGREEN TO POW-DATACOLOR (4) OF GRAFICO.
              MOVE TIPO5 TO LNUM MOVE LNUMERO TO POW-TEXT OF DE5.
              MOVE TIPO5 TO POW-DATA (5) OF GRAFICO.
              MOVE POW-YELLOW TO POW-DATACOLOR (5) OF GRAFICO.
              CLOSE AGENDA CLASI OPEN I-O AGENDA.
              EXIT PROGRAM.


Con los eventos vistos hasta el momento al llamar a la pantalla de consultas desde la pantalla principal nos saldrá perfectamente ésta pantalla. Pero sigamos con los demás eventos.

Para abandonar la pantalla, pulsaremos sobre el botón salir y producirá el siguiente evento. La variable AHIVA, es la que vamos a utilizar para pasar el valor de un contacto si es que pinchamos sobre el para que nos vuelva a la pantalla de mantenimiento. En este caso al darle a salir, le mandamos 0.

Control: SALIR
Evento : CLICK
Programación
     ENVIRONMENT DIVISION.
     DATA        DIVISION.
     PROCEDURE   DIVISION.
            MOVE 0 TO AHIVA
            CALL CLOSESHEET OF CONSULTA.


Para imprimir la tabla utilizamos el botón listar y se producirá el siguiente evento. En este caso utilizamos una ventana de confirmación previa y fijaros de que forma tan simple conseguimos un listado muy bueno de nuestro fichero con el mínimo esfuerzo. Aunque no será aplicable a todos los casos, si que en muchos de ellos nos va a servir.

Control: LISTAR
Evento : CLICK
Programación
     ENVIRONMENT DIVISION.
     DATA        DIVISION.
     PROCEDURE   DIVISION.
            ADD POW-DMYESNO POW-DMICONQUESTION GIVING ESTILO
            CALL DISPLAYMESSAGE OF CONSULTA USING "Listar ?" "Mensaje" ESTILO
            IF PROGRAM-STATUS = POW-DMRYES GO UNO ELSE GO FINALIZAR.
     UNO.
            CALL OPENPRINTER OF PRINTCON
            CALL WRITESHEET OF PRINTCON
            CALL CLOSEPRINTER OF PRINTCON
            EXIT PROGRAM.
      FINALIZAR.
            EXIT PROGRAM.


Ahora vamos a ver la programación del evento DBCLICK en la tabla. Con el podremos hacer dos cosas. Una es seleccionar un contacto para llevarlo a la pantalla de mantenimiento, para lo cual comprobamos que la fila sobre la que se ha hecho el DBCLICK no sea la 0, entonces nos envía al párrafo UNO donde salimos de ésta ventana enviando los datos del código del contacto en la variable AHIVA, de tal manera que al entrar el foco de nuevo en la pantalla de mantenimiento se ejecutará en esa el evento CLOSECHILD y como la variable AHIVA lleva un valor hará lo indicado, que es mostrar dicho contacto. Si por el contrario hemos pinchado sobre la fila 0, le indicamos que queremos clasificar por alguna columna, entonces capturamos la columna y hacemos un sort por el valor de dicha columna, y volvemos a recargar la tabla con los valores clasificados del fichero de SORT.

Control: TABLA
Evento : DBCLICK
Programación
     ENVIRONMENT DIVISION.
     INPUT-OUTPUT SECTION.
     FILE-CONTROL.
           SELECT ORDEN ASSIGN TO SORTWK01.
      DATA        DIVISION.
      FILE SECTION.
      SD  ORDEN.
      01  REGORD.
            02  ORDCOD PIC 9999.
            02  ORDNOM PIC X(30).
            02  ORDDOM PIC X(30).
            02  ORDPOS PIC 99999.
            02  ORDPOB PIC X(20).
            02  ORDPRO PIC X(15).
            02  ORDTIP PIC X(12).
            02  ORDTEL PIC X(20).
            02  ORDMOV PIC X(20).
            02  ORDMAI PIC X(30).
      WORKING-STORAGE SECTION.
      01  INDICE  PIC S9(8) COMP-5.
      01  FILA    PIC 9999.
      01  COLUMNA PIC 99.

     PROCEDURE   DIVISION.
           MOVE POW-CLICKROW OF TABLA TO FILA.     
           MOVE POW-CLICKCOL OF TABLA TO COLUMNA.
           IF FILA NOT = 0 GO UNO.
           IF COLUMNA = 1 SORT ORDEN ON ASCENDING KEY ORDCOD
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 2 SORT ORDEN ON ASCENDING KEY ORDNOM
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 3 SORT ORDEN ON ASCENDING KEY ORDDOM
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 4 SORT ORDEN ON ASCENDING KEY ORDPOS
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 5 SORT ORDEN ON ASCENDING KEY ORDPOB
               USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 6 SORT ORDEN ON ASCENDING KEY ORDPRO
               USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 7 SORT ORDEN ON ASCENDING KEY ORDTIP
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 8 SORT ORDEN ON ASCENDING KEY ORDTEL
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 9 SORT ORDEN ON ASCENDING KEY ORDMOV
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
           IF COLUMNA = 10 SORT ORDEN ON ASCENDING KEY ORDMAI
                USING CLASI OUTPUT PROCEDURE RELLENA ELSE
          GO DOS.
          EXIT PROGRAM.

     UNO.
           MOVE FILA TO CCC.
           CALL GETCELLNUMERIC OF TABLA USING AHIVA FILA 1.
           CALL CLOSESHEET OF CONSULTA.
           EXIT PROGRAM.
     DOS.
           EXIT PROGRAM.

     RELLENA SECTION.
            MOVE 1 TO INDICE.
    VER.
           RETURN ORDEN AT END GO TO FINVER.
           MOVE ORDCOD TO POW-NUMERIC(INDICE 1) OF TABLA.
           MOVE ORDNOM TO POW-TEXT(INDICE 2) OF TABLA.
           MOVE ORDDOM TO POW-TEXT(INDICE 3) OF TABLA.
           MOVE ORDPOS TO POW-NUMERIC(INDICE 4) OF TABLA.
           MOVE ORDPOB TO POW-TEXT(INDICE 5) OF TABLA.
           MOVE ORDPRO TO POW-TEXT(INDICE 6) OF TABLA.
           MOVE ORDTIP TO POW-TEXT(INDICE 7) OF TABLA.
           MOVE ORDTEL TO POW-TEXT(INDICE 8) OF TABLA.
           MOVE ORDMOV TO POW-TEXT(INDICE 9) OF TABLA.
           MOVE ORDMAI TO POW-TEXT(INDICE 10) OF TABLA.
           ADD 1 TO INDICE.
           GO VER.
     FINVER.
           EXIT.


Con esto se da por concluida la ventana de consultas y su programación, como habéis podido comprobar no ha sido muy complicada, a partir de aqui podéis implementar todo lo que deseéis, mas campos, mas controles, cualquier cosa siempre es mejorable.

VENTANA ACERCA DE

Por último vamos a crear una ventana con información sobre la aplicación, una ventana pequeña que solo nos mostrará datos sobre el programa y un botón para salir de ella, es la típica pantalla Acerca de... Esta pantalla se llamará desde la ventana principal.

Al igual que para crear la ventana de consulta, primero seleccionamos la opción New, del menú de File. En esta ventana vamos a colocar un Extend Image, donde colocamos el logotipo de la página que lo habréis bajado en el archivo totico.zip, que se llama cobol.bmp. También podéis colocar la imagen que vosotros queráis intentando que quede adaptada al tamaño de la ventana.

Además colocamos 2 labels indicando el nombre del programa, la versión y el autor y para finalizar un Bitmap Button, que será el que utilicemos para salir de la ventana.

Para el estilo de la ventana marcamos: Pop-up Windows, Thin y Title Bar. La llamamos ACERCA y en el título de la misma le ponemos Acerca de ....

El aspecto que debe de tener una vez la hayais completado debe de ser algo así.

Ventana Acerca de ...


El único evento que tendremos que programar será el del botón de salir y será el siguiente:

Control: SALIR
Evento : CLICK
Programación
     ENVIRONMENT DIVISION.
     DATA        DIVISION.
     PROCEDURE   DIVISION.
            CALL CLOSESHEET OF ACERCA.


El Bitmap Button, tendrá la imagen icook, marcado como resource y no como file. Y nos servirá para salir de ésta ventana.

Una vez concluido el diseño de la ventana, pinchamos sobre Project, Edit y a continuación pulsamos sobre el botón Add, para añadir esta ventana al proyecto y así poder compilar y ver como funciona. Una vez añadida pulsamos sobre el botón Ok y ya podemos ver en la pequeña ventana del proyecto que tenemos en la pantalla, como esa ventana está incluida.



FIN DEL CURSO

Con este capítulo se da por finalizado el curso de PowerCobol. Solo espero que os haya servido y que hayais aprendido a utilizarlo y sacarle provecho a la potencia de este compilador para Windows. A partir de ahora nuestras aplicaciones tendrán otra visión, otra perspectiva mas amigable, sencilla y por supuesto bonita.

Tengo que reconocer que el dejar para el final estos capítulos ha implicado que tuviera que retomar de nuevo el PowerCobol 3, ya que en la actualidad programo sobre la versión 5. Esto supongo que ha dado lugar a una explicación menos clara y efectiva que en los anteriores capítulos. Por lo tanto os pido un poco de mas atención para comprenderlo y por fin podáis terminar el proyecto.

Un saludo a todos los que hayais llegado hasta el final y hayais conseguido realizar el proyecto AGENDA en su totalidad. A partir de este momento estais preparados para embarcaros en los desarrollos que deseies con PowerCobol.



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