4.- La Procedure
PROGRAMANDO LAS RUTINAS

Ya sabéis que cuando programamos con PowerCobol, en realidad estamos desarrollando una programación orientada a eventos, es decir los procesos se ejecutan cuando algún evento ha entrado en acción, por ejemplo al hacer clic con el ratón sobre algún Push Button, al introducir un texto en un Picture Edit, etc ... Pero también es posible que algunos de esos procesos se vayan a repetir en mas de una ocasión, entonces el hecho de copiarlos en cada evento no nos estaría facilitando la programación.

Para ello utiliza Power la Procedure de cada Sheet para introducir los procesos que no son propiedad de algún evento en concreto. En realidad son como pequeños programas alojados dentro del propio programa, ya que cada uno debe de tener un inicio con IDENTIFICATION DIVISION y un fin con END PROGRAM. Pero todas irán seguidas una debajo de otra dentro de la PROCEDURE DIVISION de la Sheet en que se vayan a utilizar.

En nuestro caso vamos a tener cuatro procedures, a continuación paso a explicaros el porque de cada una y su programación. Quiero hacer desde aquí una reflexión, ya que es un tema que nos puede interesar a todos, yo personalmento programo muy poco en programación estructurada, porque, por mi costumbre, porque nunca he programado en grupo y en la mayoría de los casos he sido autodidacta, por lo tanto me gustaría dejar claro que cada uno puede realizar los procesos como mejor sepa o como mejor se adapte a su manera de programar, yo utilizo el Go y para los ejemplos tengo que hacer uso de el.

RUTINA "EXISTE"

La primera se llama EXISTE y va a ser llamada siempre que introduzcamos un código de contacto que exista en nuestro fichero. Ya habéis que no existe en la aplicación un mantenimiento como tal, es decir con altas, bajas, consultas y modificaciones sino, que simplemente dependiendo del código que introduzcamos haremos una acción u otra. Si al introducir un código, éste no existe, nos permitirá darlo de alta y si por el contrario existe, se nos visualizará en pantalla y podremos modificarlo, consultarlo o borrarlo.

En nuestro caso, además al comenzar todos los campos de nuestro mantenimiento están desactivados para obligar a que solo se pueda introducir el código. Por eso en ésta rutina además de mover el contenido del registro a los controles de la pantalla, los ponemos en enable para poder entrar en ellos y además el botón de Grabar pasa a tener el texto Regrabar para indicar que se va a modificar.

Esta sería su programación.

Programación
        IDENTIFICATION DIVISION.
        PROGRAM-ID. EXISTE IS COMMON.
        ENVIRONMENT DIVISION.
        DATA DIVISION.
        PROCEDURE DIVISION.
        INICIO SECTION.
                MOVE 0 TO POW-ENABLE OF AGE-COD.
                MOVE AGECOD TO POW-NUMERIC OF AGE-COD.
                MOVE AGENOM TO POW-TEXT OF AGE-NOM.
                MOVE AGEDOM TO POW-TEXT OF AGE-DOM.
                MOVE AGEPOS TO POW-NUMERIC OF AGE-POS.
                MOVE AGEPOB TO POW-TEXT OF AGE-POB.
                MOVE AGEPRO TO POW-TEXT OF AGE-PRO.
                IF AGEGEN = "H" MOVE POW-ON TO POW-CHECK OF AGE-GEH
                        ELSE MOVE POW-ON TO POW-CHECK OF AGE-GEM.
                MOVE AGETIP TO POW-SELECT OF AGE-TIP.
                MOVE AGETEL TO POW-TEXT OF AGE-TEL.
                MOVE AGEMOV TO POW-TEXT OF AGE-MOV.
                MOVE AGEMAI TO POW-TEXT OF AGE-MAI.
                MOVE AGEWEB TO POW-TEXT OF AGE-WEB.
                MOVE 1 TO POW-ENABLE OF GRABAR.
                MOVE 1 TO POW-ENABLE OF L-GRABAR.
                MOVE 1 TO POW-ENABLE OF BORRAR.
                MOVE 1 TO POW-ENABLE OF L-BORRAR.
                MOVE 1 TO POW-ENABLE OF LISTAR.
                MOVE 1 TO POW-ENABLE OF L-LISTAR.
                MOVE 1 TO POW-ENABLE OF EMAIL.
                MOVE 1 TO POW-ENABLE OF L-EMAIL.
                MOVE 1 TO POW-ENABLE OF CANCELAR.
                MOVE 1 TO POW-ENABLE OF L-CANCELAR.
                MOVE 1 TO POW-ENABLE OF AGE-NOM.
                MOVE 1 TO POW-ENABLE OF AGE-DOM.
                MOVE 1 TO POW-ENABLE OF AGE-POB.
                MOVE 1 TO POW-ENABLE OF AGE-POS.
                MOVE 1 TO POW-ENABLE OF AGE-PRO.
                MOVE 1 TO POW-ENABLE OF AGE-GEH.
                MOVE 1 TO POW-ENABLE OF AGE-GEM.
                MOVE 1 TO POW-ENABLE OF AGE-TIP.
                MOVE 1 TO POW-ENABLE OF AGE-TEL.
                MOVE 1 TO POW-ENABLE OF AGE-MOV.
                MOVE 1 TO POW-ENABLE OF AGE-MAI.
                MOVE 1 TO POW-ENABLE OF AGE-WEB.
                MOVE "Regrabar" TO POW-TEXT OF L-GRABAR.
                CALL SETFOCUS OF CANCELAR.
                EXIT PROGRAM.
        END PROGRAM EXISTE.


RUTINA "CARGAR"

Esta segunda es una rutina un poco particular y es que a mi, me gusta siempre que voy a trabajar con un fichero y por supuesto siempre que no sea enormemente grande, me gusta cargarlo en una tabla y así el recorrido a través de él lo hago de manera mas rápida y segura. Con ellos conseguimos saber el número de registros que tenemos, al movernos hacia delante o hacia atrás ir con seguridad a los registros y la lectura siempre se hace directa sobre el registro en cuestión puesto que lo tenemos siempre en la tabla.

Como véis es una simple rutina con un contador y una tabla de un elemento para ir cargando los códigos de nuestra agenda. Al final guardamos en la variable tope el número de registros totales.

Esta rutina será llamada siempre que se haga un cambio en el fichero, es decir cuando demos un nuevo contacto de alta o cuando borremos alguno, para que la tabla siempre sea el reflejo del fichero. Esta acción es sumamente rápida en ningún caso ralentizará el programa.

Esta sería su programación.

Programación
        IDENTIFICATION DIVISION.
        PROGRAM-ID. CARGAR IS COMMON.
        ENVIRONMENT DIVISION.
        DATA DIVISION.
        PROCEDURE DIVISION.
        INICIO SECTION.
                MOVE 0 TO CCC.
                CLOSE AGENDA.
                OPEN INPUT AGENDA.
                INITIALIZE TABLA.
        UNO.
                READ AGENDA NEXT RECORD AT END GO DOS.
                ADD 1 TO CCC MOVE AGECOD TO TCOD (CCC).
                GO UNO.
        DOS.
                CLOSE AGENDA.
                OPEN I-O AGENDA.
                MOVE CCC TO TOPE MOVE 0 TO CCC.
                MOVE 1 TO POW-ENABLE OF AGE-COD.
                CALL SETFOCUS OF AGE-COD.
                EXIT PROGRAM.
        END PROGRAM CARGAR.


RUTINA "PARASALIR"

Esta rutina tiene poco que explicar, simplemente se encarga de sacar una ventana en la pantalla en la que nos pregunta si estamos de acuerdo en abandonar la aplicación.

Esta rutina la he puesto porque hay mas de un sitio desde el cual podemos salir, desde un botón en la pantalla principal y desde una opción del menú.

Esta sería su programación.

Programación
        IDENTIFICATION DIVISION.
        PROGRAM-ID. PARASALIR IS COMMON.
        ENVIRONMENT DIVISION.
        DATA        DIVISION.
        WORKING-STORAGE SECTION.
        01  ESTILO PIC S9(4) COMP-5.
        PROCEDURE   DIVISION.
                ADD POW-DMYESNO POW-DMICONQUESTION GIVING ESTILO
                CALL DISPLAYMESSAGE OF PRIMERA USING "Salir de la aplicación ?" "Mensaje" ESTILO.
                IF PROGRAM-STATUS = POW-DMRYES GO UNO ELSE GO FINALIZAR.
        UNO.
                CALL CLOSESHEET OF PRIMERA.
                EXIT PROGRAM.
        FINALIZAR.
                EXIT PROGRAM.
 END PROGRAM PARASALIR.


RUTINA "PONCCC"

Perdonad por los nombres, es la fuerza de la costumbre. Pero en realidad esta rutina lo que hace es tener siempre localizdo el elemento de la tabla que estamos utilizando. Es decir siempre que consultemos cualquier código la tabla también debe de posicionarse en ese punto. De esa manera en el momento en que pulsemos el botón de siguiente o anterior registro, lo haga teniendo como referencia el registro último que hemos consultado.

Así que lo único que hace es recorrer la table en busca del registro actual.

Esta sería su programación.

Programación
        IDENTIFICATION DIVISION.
        PROGRAM-ID. PONCCC IS COMMON.
        ENVIRONMENT DIVISION.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
        01  NADA PIC X.
        PROCEDURE DIVISION.
        INICIO SECTION.
              PERFORM VARYING CCC FROM 1 BY 1
                            UNTIL CCC = TOPE OR TCOD (CCC) = AGECOD
                            MOVE ' ' TO NADA
               END-PERFORM.
              EXIT PROGRAM.
        END PROGRAM PONCCC.


Finalizadas las explicaciones sobre la Sheet en los siguientes capítulos veremos la programación de los eventos de los controles que haya en pantalla. Como véis hasta ahora siempre hemos estado utilizando código perfectamente familiar para nosotros, por lo que podemos decir que el hecho de programar en Power no nos hace abandonar nuestro lenguaje habitual.



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