3.- Eventos de la ventana
EMPEZANDO A PROGRAMAR

Una vez hemos aprendido a diseñar y colocar componentes en nuestras ventanas, ha llegado el momento de empezar a introducir el código fuente necesario para que nuestra apliación sea algo mas que diseño.

Os vuelvo a recordar que esta programación orientada a eventos, es algo diferente de la tradicional y por lo tanto, habrá parte de código que pongamos en nuestra ventana y parte que irá dentro de los eventos de los componentes.

Para empezar vamos a programar la ventana principal. Pinchamos sobre el botón derecho del ratón sobre cualquier parte de la ventana teniendo en cuenta que no estemos sobre ningún componente. Se nos desplegará un menú con las distintas opciones y nosotros pinchamos sobre Procedure.

A continuación se nos muestra una lista de todos los eventos disponibles para la ventana. Vamos a programar. El primer evento en programar será FILE-CONTROL, así que nos situamos sobre el y pinchamos en OK. Para aclararnos un poco, voy a hacer una tabla con los eventos y su programación:

Evento Programación Ayuda
FILE-CONTROL SELECT AGENDA ASSIGN TO "AGENDA.DAT"
ORGANIZATION INDEXED ACCESS DYNAMIC
RECORD KEY KEYAGE FILE STATUS STAAGE.
Definición de nuestros archivos.
FILE FD  AGENDA  GLOBAL EXTERNAL
     LABEL RECORD STANDARD.
01  REGAGE.
     02  KEYAGE.
          03  AGECOD PIC 9999.
     02  AGENOM     PIC X(30).
     02  AGEDOM     PIC X(30).
     02  AGEPOS     PIC 99999.
     02  AGEPOB     PIC X(20).
     02  AGEPRO     PIC X(15).
     02  AGEGEN     PIC X.
     02  AGETIP     PIC 9.
     02  AGETEL     PIC X(20).
     02  AGEMOV     PIC X(20).
     02  AGEMAI     PIC X(30).
     02  AGEWEB     PIC X(40).
Descripción de los ficheros a utilizar en nuestra aplicación. Al ponerle GLOBAL EXTERNAL conseguimos que los valores de los campos se pasen de una ventana a otra y por todos los controles de la ventana.
WORKING 01  STAAGE      GLOBAL PIC XX.
01  MENSAJE IS  GLOBAL.
     02  FILLER  PIC X(7) VALUE "ERROR: ".
     02  NUMSTA  PIC 99BB.
     02  FILLER  PIC X(15) VALUE "POR EL MOTIVO: ".
     02  NOMSTA  PIC X(15).
01  TABLA GLOBAL.
      02  TCOD PIC 9(4) OCCURS 3000 TIMES.
01  CCC         GLOBAL PIC 9999.
01  TOPE        GLOBAL PIC 9999.
01  AHIVA   PIC 9(4) GLOBAL EXTERNAL.
Variable de estado.
Mensaje en caso de error al acceder al fichero.
Tabla las con claves de nuestro fichero.
Contador.
Tope de contador.
Variable.
OPENED ENVIRONMENT DIVISION.
DATA        DIVISION.
WORKING-STORAGE SECTION.
01  MENSAJE.
     02  FILLER PIC X(30) VALUE "SE VA CREAR EL           ARCHIVO AGENDA".
01  TITULO.
      02  FILLER PIC X(6) VALUE "ERROR".  
01  ESTILO PIC S9(4) COMP-5.
PROCEDURE   DIVISION.
DECLARATIVES.
INICIO SECTION.
      USE AFTER ERROR PROCEDURE ON AGENDA.
END DECLARATIVES.
      ADD POW-DMICONEXCLAMATION POW-DMOK              GIVING ESTILO.      OPEN INPUT AGENDA
     IF STAAGE = "35"
     CALL DISPLAYMESSAGE OF PRIMERA USING MENSAJE             TITULO ESTILO
     OPEN OUTPUT AGENDA.
     CLOSE AGENDA.      OPEN I-O AGENDA.
     CALL ADDSTRING OF AGE-TIP USING "PERSONAL   ".
     CALL ADDSTRING OF AGE-TIP USING "PROFESIONAL".
     CALL ADDSTRING OF AGE-TIP USING "FAMILIAR   ".
     CALL ADDSTRING OF AGE-TIP USING "EMPRESAS   ".
     CALL ADDSTRING OF AGE-TIP USING "SANITARIO  ".
     CALL "CARGAR".
Lo que se ejecutará justo al abrir la ventana. Como véis lleva su propia Working independiente de la otra.   Usamos las Declaratives para controlar el status del fichero. Si el status es 35 significa que no existe y nos saca una ventana indicándonoslo.
A continuación abirmos el archivo como I-O y cargamos el combobox con los tipos de contacto que vamos a tener.
Hacemos una llamada a la rutina CARGAR.
CLOSE ENVIRONMENT DIVISION.
DATA        DIVISION.
PROCEDURE   DIVISION.
       CLOSE AGENDA.
Al cerrar la ventana, también cerramos nuestro fichero. Lo último que se hace.
CLOSECHILD ENVIRONMENT DIVISION.
DATA        DIVISION.
WORKING-STORAGE SECTION.
01  ESTILO PIC S9(4) COMP-5.
PROCEDURE   DIVISION.
      MOVE POW-ON TO POW-ENABLE OF PRIMERA.
      IF AHIVA > 0 GO SUERTE.
      CALL SETFOCUS OF AGE-COD.
      EXIT PROGRAM.
SUERTE.
      MOVE AHIVA TO POW-NUMERIC OF AGE-COD.
      MOVE AHIVA TO AGECOD.
      READ AGENDA NOT INVALID KEY CALL "EXISTE".
      CALL "PONCCC".
      EXIT PROGRAM.
Esto se realizará cada vez que se cierre una ventana hija de ésta. La ponemos activa. Comprobamos si nos viene con un código y si es así procedemos a mostrarlo y sino se va de nuevo a pedir el código.


Bien, espero que hayais entendido mas o menos todo lo que hemos introducido. Recordad el evento CLOSE se realiza cuando se cierra la aplicación y el CLOSECHILD, cuando se cierra una de las ventanas hija.

Fijaros como controlamos si el estatus del fichero es 35 para hacer un OPEN OUTPUT y por lo tanto crear el fichero siempre que no exista.

Lo mas complicado de entender debe de ser el evento CLOSECHILD. Si recordáis tenemos una ventana que es de consulta en la cual salen todos nuestros contactos en una tabla y pinchando sobre uno de ellos se va y nos lo muestra en la ventana principal, lo podéis ver en el ejecutable directamente. Pues bien, la varibale ahiva, lo que nos da es el número de contacto sobre el que hemos pinchado dos veces en la consulta, por eso al cerrar la ventana hija comprubo si el valor de ahiva es mayor que 0 y entonces leo el registro seleccionado.

El valor de ahiva puede ser 0 si cerramos la ventana de consulta sin pinchar sobre ningún contacto o bien si hemos abieto la ventana de Acerca de.. ya que el tratemiento será el mismo porque ambas ventanas son hijas de la principal.

Si seguís teniendo alguna duda, antes de continuar me lo decís y lo explico mejor. La idea es que vosotros mismo podáis realizar una aplicación similar a ésta y para ello es mejor que comprendáis todo.



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