Escolar Documentos
Profissional Documentos
Cultura Documentos
Propiedades: Sern las distintas opciones que puede tener un objeto y pueden
ser comunes o distintas segn el tipo de objeto. Sern propiedades, el color, la
altura, la anchura, el ttulo, el tipo de letra, si est o no disponible, si est o no
visible, etc ... Las propiedades suelen tener un nombre pre-definido por el
lenguaje que lo haya designado. Muchas de las propiedades tendrn un valor de
tipo SI-NO. Estas propiedades normalmente se podrn establecer tanto en
tiempo de diseo como en tiempo de ejecucin, es decir, cuando se disea la
pantalla y desde el control del programa, esto es una gran ventaja como
veremos mas adelante.
Eventos: Sern las acciones del usuario sobre el programa. Como el click sobre
un Push-Button, pulsar Return o Tab en un Edit, etc .... Al producirse el evento,
se ejecutar todo lo que le hayamos programado y actuar en consecuencia.
Todo esto, lo que nos va a suponer, es que vamos a perder un poco el "control" sobre
nuestro programa, puesto que ya no lo vamos a ver como siempre en un editor y de
una manera secuencial, sino que cada evento y propiedades tendrn que ser vistas por
separado. Pero os aseguro que eso no es un inconveniente, digamos que al principio es
un poco chocante. En los prximos captulos ir explicando el funcionamiento de
PowerCobol en su versin 3, la compilacin, la ejecucin, los objetos o controles, las
propiedades y todo lo necesario para generar nuestras aplicaciones en ste entorno de
desarrollo.
CAPTITULO 2. LA PRIMERA VENTANA.
Al abrir el Fujitsu PowerCobol (en adelante Power), nos sale automaticamente una
ventana denominada SHEET en blanco y las ventanas de control que tengamos por
defecto, pueden ser la de Status, la de Font, la de Color y la de Item, Si alguna no se
abre o bien otra queremos cerrarla, bastar con activarla en el menu Tool.
Sobre sta primera ventana ya podemos empezar a poner nuestros controles u objetos
y darles vida. Pero antes de nada aprendamos mas acerca de la ventana, que en
realidad es otro objeto mas de nuestra aplicacin.
Veamos cuales son sus propiedades.
aplicacin. Adems quiero aadir que por ejemplo, si luego algn componente
determinado va a utilizar alguna variable exclusiva la podremos definir para ese
componente y no para el resto de programa. Recordad que la ventana sobre la
que estamos hablando es otro componente de nuestro programa para POWER.
Eso significa tambin que si definimos una variable como: 01 SALUDO PIC
X(30). Esa variable no la podremos utilizar en un campo de nuestra ventana,
ya que al no definirla como GLOBAL, le indicamos al compilador que solo se
utilizar en la ventana como componente, pero no en el resto del programa, por
lo cual lo mas razonable es definirlas todas como GLOBAL. El ponerle
EXTERNAL, har la misma funcin que conseguiamos con la LINKAGE SECTION.
PROCEDURE: OJO !!! Atencin, aqu se van a definir las rutinas que luego
podremos llamar desde nuestro programa, en ningn caso, lo que aqu se
ponga, se ejecutar por si solo. Yo me tir dos das preguntndome porque no
se ejecutaban las sentencias que pona aqu. Imaginaros las rutinas que hacis
para luego llamarlas con CALL, pues bien eso mismo es sto,, hasta hay que
definirlas completamente es decir con IDENTIFICATION, PROGRAM-ID, etc .. Un
ejemplo:
IDENTIFICATION DIVISION.
PROGRAM-ID. LIMPIAR IS COMMON.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
INICIO SECTION.
MOVE 0 TO POW-NUMERIC OF CODIGO.
MOVE SPACES TO POW-TEXT OF NOMBRE.
MOVE SPACES TO POW-TEXT OF DIRECCION.
MOVE SPACES TO POW-TEXT OF POBLACION.
EXIT PROGRAM.
END PROGRAM LIMPIAR.
Si veis la estructura es similar a un pequeo programa. Para luego
llamarlo desde cualquier parte, simplemente CALL "LIMPIAR" en este
caso porque ese es su nombre. En este caso lo que har ser mover a
espacios y a ceros el contenido de los controles que se indican (CODIGO,
NOMBRE, DIRECCION y POBLACION.
desde sta. Es decir si desde sta ventana principal llamamos a otra. Justo al
cerrarse esta nueva y antes de pasar el control a la principal se ejecutar este
apartado.
Una vez explicado esto podemos empezar a colocar los objetos que deseemos en
nuestra ventana. Recordad todo bien, en la PROCEDURE irn las rutinas que queramos
llamar luego desde el programa, en OPENED, ir lo que deseemos que el programa
realice antes de mostrar la ventana. Y en toda la DATA, cualquier dato que queramos
que sea portable a cualquiera de los componentes del programa, lo declararemos con
GLOBAL y si adems queremos que sea portable a otras ventanas, adems de GLOBAL,
le pondremos EXTERNAL. Esto es algo muy importante.
Tenis que tener en cuenta que cada ventana es un programa independiente (por
llamarlo de alguna forma) es decir que los datos y variables si no las defins con
EXTERNAL, no se correspondern. En Acucobol o RM, siempre que abrimos una
ventana desde un programa, ste sigue teniendo el control y no hay porque definir
nada nuevo, aqu NO, aqu cada ventana es un programa.
Solo los mensajes que podremos displayar en ventanas pequeas, del tipo (SI / NO),
(ACEPTAR / CANCELAR ) formarn parte de nuestro programa o ventana.
Una vez creada la ventana, lo siguiente que debemos de hacer es incorporarla a
nuestro Proyecto y estar lista para ser ejecutada.
En el siguiente curso, voy a explicar como se llaman las variables que hacen referencia
a las propiedades de los controles mas usuales, para despus realizar un pequeo
programa y ver como funciona.
CAPTITULO 3. OBJETOS O CONTROLES.
Objeto: Ser todo aquello que definamos grficamente en nuestro programa, sern
objetos un Push-Button, un Label, un Combobox, una Tabla, una Imagen, etc .... Cada
objeto deber de tener un nombre como si de una variable se tratara. En principio el
programa asignar un nombre por defecto pero nosotros podremos variarlo y darle el
que mas nos apetezca, ese nombre ser el que utilicemos para todo lo que haga
referencia a ese objeto. Las pantallas que diseemos sern los contenedores de
objetos, es decir donde definamos todos los objetos que deseemos en nuestra
aplicacin. Pero a su vez tambin ser un objeto con sus propiedades, sus mtodos y
sus eventos. En cada aplicacin puede haber mas de una pantalla, pero una ser
siempre la principal.
Veamos una lista de los objetos que nos presenta PowerCobol, en sta versin 3 y una
pequea explicacin de para que sirven.
Al final de la pgina explicar para que sirven las diferentes opciones de estilo que
tienen los objetos, para casi todos son las mismas. Y cuando acta cada evento
OBJETO
DESCRIPCION
LABEL: Un Label, es una etiqueta, un
comentario o cualquier cosa que
EVENTOS
- CLICK
- CHANGE
- CHANGE
- EDIT
- RETURN
- RETURN
- EDIT
- CLICK
- CLICK
- CLICK
- DBLCLICK
- SELCHANGE
CHANGE
SELCHANGE
EDIT
RETURN
CHANGE
ENDSCROLL
CHANGE
ENDSCROLL
TIMER
CLICK
DBLCLICK
EDIT
RETURN
DDECHANGE
CLICK
CLICK
CHANGE
CLICK
CHANGE
CLICK
DBCLICK
STARTANIME
ENDANIME
SELCHANGE
CHANGE
SELCHANGE
DBCLICK
SELCHANGE
CLICK
SELCHANGE
EDIT
RETURN
CLICK
DBCLICK
CHANGE
Ya sabis que pulsando sobre el botn derecho del ratn y siempre que estemos sobre
un objeto, nos aparecer un men con el cual nos podremos dirigir tanto al estilo del
objeto como a las procedures de cada evento.
Los campos que tenemos dentro de Style, son casi iguales en todos los casos, voy a
explicar los mas comunes:
Respecto a versiones posteriores (yo ahora tengo la 5), hay que hacer
notar que los eventos aumentan en nmero considerable y que los
objetos son mas y algunos se han integrado con otros.
CAPTITULO 4. PROPIEDADES.
Propiedad: Cada una de las opciones que puede tener un objeto y pueden ser
comunes o distintas segn el tipo de objeto. Sern propiedades, el color, la altura, la
anchura, el ttulo, el tipo de letra, si est o no disponible, si est o no visible, etc ... Las
propiedades suelen tener un nombre pre-definido por el lenguaje que lo haya
designado. Muchas de las propiedades tendrn un valor de tipo SI-NO.
Las propiedades se ajustan normalmente en tiempo de diseo, pero por muchos
motivos ser necesario cambiarlas tambin en tiempo de ejecucin, para cambiar estas
propiedades utilizaremos nuestro comando de COBOL, MOVE. De tal manera que lo
haremos igual que cuando le damos un valor a una variable.
El formato para referirnos a las propiedades de un objeto ser el siguiente:
MOVE valor TO propiedad OF control.
En el caso de PowerCobol, las nombres de las propiedades estn predefinidas y todas
empiezan por la palabra POW- seguida del nombre de la propiedad. En las propiedades
de tipo SI-NO, podemos utilizar para el "NO" el valor "0" o tambin la palabra
reservada de PowerCobol, POW-OFF, para el caso del "SI" podremos utilizar "1" o
tambin POW-ON.
A continuacin voy a explicar y poner algunos ejemplos de las mas utilizadas.
PROPIEDAD
POW-ACTIVATE
POW-BACKCOLOR
POW-BORDER
POW-CHECK
POW-COLS
POW-COUNT
POW-DATA
POW-DATACOLOR
POW-ENABLE
POW-NUMERIC
POW-PRNENABLE
POW-ROW
POW-ROWS
POW-SELECT
DESCRIPCION
Solo se aplica al objeto timer y sirve para iniciarlo o pararlo.
MOVE POW-ON TO POW-ACTIVATE OF RELOJ.
Para indicar el color de fondo de un objeto, aplicable a la mayora
de ellos. Podemos utilizar POW-RED (rojo), POW-BLUE (azul), etc..
Tambin para colorear celdas de una tabla.
MOVE POW-RED TO POW-BACKCOLOR OF NOMBRE.
MOVE POW-BLUE TO POW-BACKCOLOR (1,1) OF TABLA.
Para que aparezca el objeto con borde, Label, Edit, Image, y algn
otro.
MOVE POW-ON TO POW-BORDERE OF CAMPO.
En los objetos RadioButton, CheckButton y Menu, indica si esta o
no chequeado.
MOVE POW-ON TO POW-CHECK OF ACTIVO.
Contiene el nmero de columnas de una tabla.
MOVE POW-COLS OF TABLA TO COLUMNAS.
En los ListBox, ComboBox y dems objetos con listas, nos
devuelve el nmero de elementos que tiene.
MOVE POW-COUNT OF LISTA1 TO ELEMENTOS.
En los Graph, el valor de cada una de los elementos del grfico.
MOVE 30 TO POW-DATA (3) OF GRAFICO.
En los Graph, el color de cada una de los elementos del grfico.
MOVE POW-RED TO POW-DATACOLOR (3) OF GRAFICO.
En todos los objetos, para ponerlos en activos o pasivos.
MOVE POW-ON TO POW-ENABLE OF GRAFICO.
Introduce un valor numrico en los objetos PictureEdit y Table.
MOVE 14 TO POW-NUMERIC(3,3) OF TABLA.
En todos los objetos, indican si van a ser imprimibles con el objeto
Print.
MOVE 1 TO POW-PRNENABLE OF NOMBRE.
Nos devuelve el nmero de linea que tiene el foco en una tabla.
MOVE POW-ROW OF TABLA TO LINEA.
Le indicamos el nmero de lneas que tiene una tabla.
MOVE 130 TO POW-ROWS OF TABLA.
En los objetos de listas ListBox, ComboBox, nos indica el elemento
que est seleccionado.
MOVE POW-SELECT OF LISTA TO ELEMENTO.
VALORES
POW-ON
POW-OFF
POW-RED
POW-BLUE
POW-BLACK
etc .....
- POW-ON
- POW-OFF
- POW-ON
- POW-OFF
- Valor numrico.
(devuelve valor)
- Valor numrico.
(devuelve valor)
- Valor numrico.
- POW-RED
(resto de colores)
- POW-ON
- POW-OFF
- Valor numrico.
- POW-ON
- POW-OFF
- Valor numrico.
(devuelve valor)
- Valor numrico.
- Valor numrico.
POW-TEXT
POW-TEXTCOLOR
POW-VISIBLE
- POW-RED
(resto de colores)
- Valor
alfanumrico.
- POW-ON
- POW-OFF
Existen muchas mas propiedades, pero se irn viendo en el ejemplo que empezaremos
a desarrollar. Este captulo est mas enfocado hacia el modo de introduccin de datos
en las propiedades que a la explicacin de todas ellas.
Con estas propiedades adems de hacer el MOVE, se puede programar, es decir, por
ejemplo podemos preguntar por ellas:
IF POW-SELECT OF LISTA = 1 MOVE "HA SELECCIONADO LA
OPCION 1" TO POW-TEXT OF ETIQUETA.
IF POW-SELECT OF LISTA = 2 MOVE "HA SELECCIONADO LA
OPCION " TO POW-TEXT OF ETIQUETA.
Del mismo modo que tambin podemos coger los datos de esas propiedades para en
nuestro programa hacer con ellos lo que deseemos. Por ejemplo:
MOVE POW-TEXT OF ETIQUETA TO NOMBRE.
Con estos ejemplos simples, tendramos que al final la variable NOMBRE definida en
nuestra WORKING, como alfanumrica tendra el valor dependiendo de la opcin
seleccionada en el ListBox llamado LISTA. Y tambin el objeto Label llamado Etiqueta
contendra ese mismo valor.
El prximo captulo estar dedicado a la utilizacin de los mtodos y luego empezar
con el desarrollo de un programa completo, igual que se hizo en la seccin
programando, es decir, tendremos la misma agenda, pero ahora en formato grfico de
Windows.
CAPTITULO 5. METODOS.
Mtodo: Son procedimientos que ya vienen programados por el lenguaje y nosotros
solo tendremos que llamarlos para que acten. Son mtodos, aadir campos a un
Combobox, enviar el foco a cualquier objeto, abrir una ventana, cerrarla, etc ... Como
veremos cada uno de los objetos puede tener sus propios mtodos.
Para acceder a todos los mtodos se utilizar la sentencia CALL, quedando su formato
de la siguente manera:
CALL mtodo OF objeto USING parmetros.
A continuacin vamos a explicar algunos de los mtodos mas habituales. Pero como
siempre os digo, en los ejemplos prcticos es donde mejor se comprende todo.
METODO
DESCRIPCION
ADDSTRING
ADDSTRING256
ALARM
CLEARLIST
OPENPRINTER
WHITESHEET
CLOSEPRINTER
CLOSESHEET
DELETESTRING
DISPLAYMESSAGE
GETCELLNUMERIC
GETCELLTEXT
OPENSHEET
SETCELLNUMERIC
SETCELLTEXT
SETFOCUS
Existen muchos mas mtodos, pero estos son los mas utilizados. Veamos como un
ejemplo sencillo como rellenaramos un ListBox a partir de una tabla definida en la
Working. Siendo LISTA l nombre que tiene nuestro ComboBox o ListBox. Y adems
tenemos una tabla con dos columnas, en la primera introducimos el nmero y en la
segunda su nombre.
WORKING-STORAGE SECTION.
01 TABLA.
02 FILLER PIC X(10) VALUE "PRIMERO".
02 FILLER PIC X(10) VALUE "SEGUNDO".
02 FILLER PIC X(10) VALUE "TERCERO".
02 FILLER PIC X(10) VALUE "CUARTO".
02 FILLER PIC X(10) VALUE "QUINTO".
01 TABLITA REDEFINES TABLA.
02 ELEMEN PIC X(10) OCCURS 5 TIMES.
01 CONTA PIC 9.
01 CAMPO PIC X(10).
...
PROCEDURE DIVISION.
INICIO.
MOVE 0 TO CONTA.
UNO.
ADD 1 TO CONTA IF CONTA > 5 GO DOS.
* aqui cargamos el ComboBox.
1
2
3
4
5
PRIMERO
SEGUNDO
TERCERO
CUARTO
QUINTO
DISPLAYMESSAGE
Con este mtodo de PowerCobol, conseguimos que se nos muestre una ventana
independiente pero sin perder el control sobre la que tenemos activa. Son las tpicas
ventanas de confirmacin de Windows y tienen unos parmetros pre-asignados. A
continuacin vamos a ver algunos ejemplos y como quedan en la prctica.
Su formato, como cualquier otro mtodo es el siguiente:
CALL DISPLAYMESSAGE OF nombredeventana USING texto ttulo estilo.
o
o
IF PROGRAM-STATUS = POW-DMRYES
MOVE "HAS PULSADO SI" TO POW-TEXT
OF TEXTODEEXPLICACION.
IF PROGRAM-STATUS = POW-DMRNO
MOVE "HAS PULSADO NO" TO POW-TEXT
OF TEXTODEEXPLICACION.
Si no os habis bajado todos los iconos que vamos a utilizar en la aplicacin, este es
un buen momento para hacerlo. Podis encontrar el enlace al final de la pantalla,
debis descomprimir el archivo totico.zip en la misma carpeta.
Ahora creamos nuestra primera ventana: File-New, una vez abierta le dis al botn
derecho del ratn sobre ella, pinchamos sobre Style y ponemos lo siguiente:
Pulsamos Ok y como color de fondo seleccionamos el que mas nos guste, si queris
respetar el que tiene, lo agregis a la paleta de colores es: 198,198,255.
Una vez realizado hacemos: File-Save as, y le damos el nombre de agenda.win. A
continuacin nos vamos a Project-Edit, pinchamos sobre Add y aadimos la pantalla al
proyecto, como va a ser la pantalla con la que arranque la aplicacin marcamos la
casilla, Starting Sheet.
PRIMERA COMPILACION.
Ahora ya, podramos por ejemplo, compilar y ejecutar, aunque obviamente no nos iba
a hacer nada, pero Power ya reconoce un proyecto completo. Podis hacer una prueba,
le dis Project - Build y luego Project - Run.
A partir de ahora para ejecutar bastar solo con dar a Run, si ha habido alguna
modificacin se compilar automaticamente.
Tenis que tener en cuenta que Project-Compile, actuar sobre la ventana activa,
mientras que Project-Build, compilar todas las ventanas del proyecto.
Project-Link y Project-Make, se encargan de generar el ejecutable para su ejecucin.
Para un proyecto pequeo podemos hacer siempre Build, pero si es muy largo, para
depurar errores iremos compilando ventana a ventana.
Quizs haya sido un poco lioso lo que he explicado o quizs algo demasiado simple que
ya todos conocis, pero creo que siempre es bueno refrescar las ideas y dar la
oportunidad de ayudar al que empieza desde la nada.
LAS IMAGENES.
Cuando utilizamos imagenes en PowerCobol, podemos usarlas como imagenes
independientes, o bien como un recurso propio de la apliacin, me explico: Una imagen
puede ir con la aplicacin en un archivo mas y llamarla as en nuestra apliacin o bien
que las imagenes se integren en el ejecutable de la apliacin y no vayan como archivos
independientes. La diferencia estar en el tamao del ejecutable, pero en cambio,
Label: Sern lo que siempre ponamos con DISPLAY. Con ellas pondremos
todos los nombres de los campos que vamos a introducir, Cdigo, Nombre,
Domicilio, Poblacin, etc .... Podis ponerlo donde queris, sin dejaros ninguno
o ponerlo como yo lo he hecho en el ejemplo.
Group Box: Son las cajas que facilitan la agrupacin de controles, aunque en
esta versin solo sirven para eso, para decorar, clarifica an ms la informacin.
Picture Edit: Son las cajas donde vamos a aceptar los datos, es decir lo que
sustituye a los ACCEPT. Sin duda lo mas importante y el mas utilizado.
Radio Button: Botones de opcin para elegir entre varios, por eso he aadido
el campo gnero.
Combo Box: Caja de opciones, lo he utilizado para sealar el tipo de contacto.
Bitmap Button: Son los botones que harn los procesos.
Una vez los tengas colocados, es el momento de asignarles un nombre, ese nombre es
importante y har referencia al control. Los nombres si debemos de darlos igual, para
que luego en la programacin no haya problemas.
LABEL
A los Label con el nombre del campo se le puede dejar el nombre que se le asigne
PowerCobol. Mejor veamos esta imagen que corresponde al Label de Cdigo.
As es como deben de ir todos los Labels, solo cambiando el Text, que har referencia a
cada uno de nuestros campos.
PICTURE EDIT
En los Picture Edit, donde introduciremos los campos, su nombre ser el mismo que el
nombre del campo del registro pero con un guin enmedio.
Por ejemplo el Picture Edit del Cdigo se llamar AGE-COD. Veamos otra imagen.
Aqu fijaros que algo muy importante es PICTURE String, que nos indicar como se
mostrar el dato una vez introducido. Por eso he elegido ste control y no el Edit
normal. En este caso PIC ZZZ9B.
Adems debis de pulsar sobre el botn Event y aseguraros que las casillas estn as:
Con sta ventana le indicamos cuando se efectuar el evento Return, es decir cuando
el campo se dar por aceptado. La primera casilla indica que lo har al pulsar ENTER
(activada). La segunda que lo har cuando el foco est en otro control (desactivada).
La tercera indica que se producir cuando se rellene todo el campo con su longitud
(activada).
Con esto conseguimos que los Picture Edit, funcionen igual que los ACCEPT
tradicionales.
A continuacin pongo los valores de todos los estilos de los Picture Edit:
Campo
Nombre
Picture String
Cdigo
AGE-COD
ZZZ9B
Nombre
AGE-NOM
X(30)
Domicilio
AGE-DOM
X(30)
Poblacin
AGE-POB
X(20)
Cdigo Postal
AGE-POS
9(5)B
Provincia
AGE-PRO
X(15)
Telfono
AGE-TEL
X(20)
Telfono Mvil
AGE-MOV
X(20)
AGE-MAI
X(30)
Pgina Web
AGE-WEB
X(40)
OTROS
Para el Gnero creamos dos Radio Button, al que identifica al hombre lo llamamos
AGE-GEH y el que identifica mujer lo llamamos AGE-GEM. Uno de los dos debe de
llevar activa la casilla de Check en su estilo, que nos indica cual estar seleccionado
por defecto.
Imagen
Nombre recurso
borrar.bmp
icoborrar
consul.bmp
icoconsul
fin.bmp
icofin
grabar.bmp
icograbar
inicio.bmp
icoinicio.bmp
listar.bmp
icolistar
icomail
mas.bmp
icomas
menos.bmp
icomenos
ok.bmp
icook
salir.bmp
icosalir
Ahora es momento para ir colocando los Bitmap Image e ir asignando sus nombres.
Primero creamos los cuatro referentes a la busqueda de registros y los llamamos:
texto de Label
Nombre label
Borrar
L-BORRAR
Ok
L-CANCELAR
Listar
L-LISTAR
L-EMAIL
Grabar
L-GRABAR
Consulta
L-CONSULTA
Salir
L-SALIR
Ahora colocomas el control Print en un lugar de la pantalla que no nos estorbe, este
tipo de controles no se ven en tiempo de ejecucin, pero es necesario que estn
integrados en nuestra ventana, para poder asignarle los valores. Una vez colocado, por
ejemplo en la esquina superior derecha nos vamos a su cuadro de estilo y ponemos
como nombre PRINT1 y como Title, FICHA DE LA AGENDA. Lo dems lo podis dejar
por defecto.
DDE
Vamos a colocar tambin un DDE, que es un control que nos sirve para conectar con
otras aplicaciones externas y que utilizaremos para enviar e-mail. Igual que el anterior
no se ve en tiempo de ejecucin, pero tenemos que darle propiedades, que sern muy
simples. Tenis que abrir su caja de estilo y simplemente poner en ItenName, DDE1.
ITEM ORDER
Llegados a este punto solo quedar explicar una pequea cosa. Todos los componentes
que hemos ido poniendo llevan un orden y en algunos casos pudiera suceder que unos
no se vean, simplemente porque se han quedado debajo, bien, eso se soluciona,
sacando el menu pop-up sobre cualquier punto de la pantalla y dirigiendonos a la
opcin que pone Item Order. Ah debis de llevar todo lo que se debe de quedar
debajo, es decir los Group Box y el Rectangle a una posicin mas alta que lo que va a
contener.
Tambin debeis de tener en cuenta en marcar los tabuladores sobre los campos de
nuestro fichero y no sobre lo dems, adems en el mismo orden en que los hemos
colocado. Una muestra de como debe quedar se muestra en sta imagen.
Los que tienen el tringulo en negro, son los controles sobre los que nos moveremos al
pulsar la tecla TAB. Se ponen con Set Tab y se quitar con Reset Tab. Dejad solo los que
hacen referencia a los Picture Edit.
CONCLUSION
Llegados aqu os hago una pregunta: Vamos bien ?. Es que no es fcil explicar en la
distancia y sobre papel y no quisiera que os perdierais o se quedara algo sin explicar
con claridad. Si una vez leido todo lo aqu expuesto, probis a compilar y ejecutar y
algo no funciona, me lo comunicais y lo modifico al instante.
Evento
Programacin
Ayuda
FILE-CONTROL
Definicin de nuestros
archivos.
FILE
Descripcin de los
ficheros a utilizar en
nuestra aplicacin. 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
Variable de estado.
OPENED
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.
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
CALL ADDSTRING OF
CALL ADDSTRING OF
CALL ADDSTRING OF
CALL ADDSTRING OF
CALL "CARGAR".
AGE-TIP
AGE-TIP
AGE-TIP
AGE-TIP
AGE-TIP
USING
USING
USING
USING
USING
"PERSONAL ".
"PROFESIONAL".
"FAMILIAR ".
"EMPRESAS ".
"SANITARIO ".
Mensaje en caso de
error al acceder al
fichero.
Tabla las con claves de
nuestro fichero.
Contador.
Tope de contador.
Variable.
Lo que se ejecutar
justo al abrir la
ventana. Como vis
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
indicndonoslo.
A continuacin
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,
tambin 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.
Bien, espero que hayais entendido mas o menos todo lo que hemos introducido.
Recordad el evento CLOSE se realiza cuando se cierra la aplicacin 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 recordis
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 podis ver en el ejecutable directamente. Pues bien, la varibale ahiva, lo
que nos da es el nmero 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
ningn 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 segus teniendo alguna duda, antes de continuar me lo decs y lo explico mejor. La
idea es que vosotros mismo podis realizar una aplicacin similar a sta y para ello es
mejor que comprendis todo.
CAPTITULO 9. LA PROCEDURE
PROGRAMANDO LAS RUTINAS
Ya sabis que cuando programamos con PowerCobol, en realidad estamos
desarrollando una programacin orientada a eventos, es decir los procesos se ejecutan
cuando algn evento ha entrado en accin, por ejemplo al hacer clic con el ratn sobre
algn Push Button, al introducir un texto en un Picture Edit, etc ... Pero tambin es
posible que algunos de esos procesos se vayan a repetir en mas de una ocasin,
entonces el hecho de copiarlos en cada evento no nos estara facilitando la
programacin.
Para ello utiliza Power la Procedure de cada Sheet para introducir los procesos que no
son propiedad de algn evento en concreto. En realidad son como pequeos
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 irn
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 continuacin paso a explicaros el
porque de cada una y su programacin. Quiero hacer desde aqu una reflexin, ya que
es un tema que nos puede interesar a todos, yo personalmento programo muy poco en
programacin estructurada, porque, por mi costumbre, porque nunca he programado
en grupo y en la mayora de los casos he sido autodidacta, por lo tanto me gustara
dejar claro que cada uno puede realizar los procesos como mejor sepa o como mejor
Programacin
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.
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 travs de l lo hago de manera mas
rpida y segura. Con ellos conseguimos saber el nmero de registros que tenemos, al
movernos hacia delante o hacia atrs ir con seguridad a los registros y la lectura
siempre se hace directa sobre el registro en cuestin puesto que lo tenemos siempre
en la tabla.
Como vis es una simple rutina con un contador y una tabla de un elemento para ir
cargando los cdigos de nuestra agenda. Al final guardamos en la variable tope el
nmero 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 accin es sumamente rpida en ningn caso ralentizar
el programa.
Esta sera su programacin.
Programacin
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 aplicacin.
Esta rutina la he puesto porque hay mas de un sitio desde el cual podemos salir, desde
un botn en la pantalla principal y desde una opcin del men.
Esta sera su programacin.
Programacin
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 aplicacin ?" "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 cdigo la tabla tambin debe de posicionarse
en ese punto. De esa manera en el momento en que pulsemos el botn 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 sera su programacin.
Programacin
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.
Control: AGE-COD
Evento : EDIT
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
WORKING-STORAGE SECTION.
01 SIGUE PIC 9999.
PROCEDURE DIVISION.
MOVE SPACES TO POW-TEXT OF AGE-NOM
MOVE SPACES TO POW-TEXT OF AGE-DOM
MOVE SPACES TO POW-TEXT OF AGE-POB
MOVE 0
TO POW-NUMERIC OF AGE-POS
MOVE SPACES TO POW-TEXT OF AGE-PRO
MOVE SPACES TO POW-TEXT OF AGE-MOV
MOVE SPACES TO POW-TEXT OF AGE-TEL
MOVE SPACES TO POW-TEXT OF AGE-MAI
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
OF
AGE-NOM
AGE-DOM
AGE-POB
AGE-POS
AGE-PRO
AGE-GEH
AGE-GEM
AGE-TIP
AGE-MOV
AGE-TEL
AGE-MAI
AGE-WEB
GRABAR
L-GRABAR
BORRAR
L-BORRAR
LISTAR
L-LISTAR
EMAIL
L-EMAIL
CANCELAR
L-CANCELAR
Ahora, una vez pulsado Return sobre el cdigo introducido generamos otro evento en
el que se comprueba si existe o no y dependiendo se realizar una funcin u otra. Si
existe el cdigo llamamos a la rutina existe, que se encarga de colocarnos todos los
contenidos de los campos y podremos, modificarlos, borrar, regrabar, etc .... En caso
de no existir pone de nuevo los dems campos habilitados y nos enva al siguiente que
en este caso es AGE-NOM. Veamos su programacin:
Control: AGE-COD
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
MOVE POW-NUMERIC OF AGE-COD TO AGECOD
IF AGECOD = 0 GO DOS
END-IF
READ AGENDA INVALID KEY GO TRES
NOT INVALID KEY CALL "EXISTE"
END-READ
CALL "PONCCC"
EXIT PROGRAM.
DOS.
CALL SETFOCUS OF AGE-COD
EXIT PROGRAM.
TRES.
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
1
1
1
1
1
1
TO
TO
TO
TO
TO
TO
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
POW-ENABLE
OF
OF
OF
OF
OF
OF
AGE-NOM
AGE-DOM
AGE-POB
AGE-POS
AGE-PRO
AGE-GEH
A partir de aqu y para los dems controles normalmente lo que haremos ser ir
pasando el foco al siguiente campo cada vez que pulsemos RETURN, como lo haramos
en un programa convencional. Por supuesto el usuario podr ir libremente por cada
campo. Cuando se pulse el botn de Grabar ser cuando se realicen los controles en
los campos que consideremos como obligatorios. Veamos toda la programacin aunque
sea muy simple.
Control: AGE-NOM
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-DOM
Control: AGE-DOM
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-POB
Control: AGE-POB
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-POS
Control: AGE-POS
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-PRO
Control: AGE-PRO
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-GEH
Control: AGE-GEH
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
IF POW-CHECK OF AGE-GEH = POW-ON MOVE "H" TO AGEGEN ELSE
MOVE "M" TO AGEGEN
END-IF
CALL SETFOCUS OF AGE-TIP
Control: AGE-GEM
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
IF POW-CHECK OF AGE-GEM = POW-ON MOVE "M" TO AGEGEN ELSE
MOVE "H" TO AGEGEN
END-IF
CALL SETFOCUS OF AGE-TIP
Control: AGE-TIP
Evento : CHANGE
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
MOVE POW-SELECT OF AGE-TIP TO AGETIP
CALL SETFOCUS OF AGE-TEL
Control: AGE-TIP
Evento : SELCHANGE
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
MOVE POW-SELECT OF AGE-TIP TO AGETIP
CALL SETFOCUS OF AGE-TEL
Control: AGE-TIP
Evento : EDIT
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
IF POW-TEXT OF L-GRABAR = "Grabar"
MOVE 1 TO POW-SELECT OF AGE-TIP
END-IF
Control: AGE-TEL
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-MOV
Control: AGE-MOV
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-MAI
Control: AGE-MAI
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF AGE-WEB
Control: AGE-WEB
Evento : RETURN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL SETFOCUS OF GRABAR
Como vis casi todo ha sido igual, con la excepcin de los controles que hacen
referencia al gnero y al tipo de contacto. Si os dais cuenta el evento que se produce
cuando editamos AGE-TIP, determinamos que si estamos introduciendo un contacto
nuevo (cosa que sabemos por el nombre del control GRABAR), seleccionamos
directamente el valor 1.
En el prximo captulo se explicarn los eventos de los controles que conforman la
barra de herramientas, que son los decisivos y sobre los cuales controlaremos nuestro
archivo.
Control: INICIO
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
IF TOPE = 0 GO DOS.
MOVE TCOD (1) TO AGECOD
MOVE 1 TO CCC
READ AGENDA INVALID KEY GO DOS
NOT INVALID KEY CALL "EXISTE".
EXIT PROGRAM.
DOS.
CALL SETFOCUS OF AGE-COD
EXIT PROGRAM.
Como tenamos los cdigos de nuestros contactos en una tabla, lo nico que hacemos
es mover el primer elemento de la tabla y leer. Para irnos al final del fichero hacemos
lo mismo, solo que moviendo el ltimo elemento de la tabla, vemoslo:
Control: FIN
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
IF TOPE = 0 GO DOS.
MOVE TCOD (TOPE) TO AGECOD
MOVE 1 TO CCC
READ AGENDA INVALID KEY GO DOS
NOT INVALID KEY CALL "EXISTE".
EXIT PROGRAM.
DOS.
CALL SETFOCUS OF AGE-COD
EXIT PROGRAM.
Ahora veamos como avanzamos o retrocedemos por el fichero con los botones de las
flechas izquierda y derecha:
Control: MAS
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
IF TOPE = 0 GO DOS.
ADD 1 TO CCC IF CCC > TOPE MOVE TOPE TO CCC.
MOVE TCOD (CCC) TO AGECOD.
READ AGENDA INVALID KEY GO DOS
NOT INVALID KEY CALL "EXISTE".
EXIT PROGRAM.
DOS.
CALL SETFOCUS OF AGE-COD
EXIT PROGRAM.
Control: MENOS
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
IF TOPE = 0 GO DOS.
SUBTRACT 1 FROM CCC IF CCC < 1 MOVE 1 TO CCC.
MOVE TCOD (CCC) TO AGECOD.
READ AGENDA INVALID KEY GO DOS
NOT INVALID KEY CALL "EXISTE".
EXIT PROGRAM.
Una vez vistos los controles para el movimiento por el fichero, seguirmos analizando
los dems botones de la barra de herramientas.
El botn que sigue es el de borrar y su objetivo ser el de eliminar el registro que en
ese momento se encuentre en la pantalla. Como es algo delicado aprovechamos la
posibilidad de sacar una ventana de verificacin con DISPLAYMESSAGE y si la
respuesta es positiva borramos el registro. Este botn estar activo solo cuando
tengamos un registro presente. Veamos su programacin:
Control: BORRAR
Evento : CLICK
Programacin
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 "Seguro de borrarlo ?" "Mensaje" ESTILO.
IF PROGRAM-STATUS = POW-DMRYES GO UNO ELSE GO FINALIZAR.
UNO.
ADD POW-DMICONEXCLAMATION POW-DMOK GIVING ESTILO.
DELETE AGENDA INVALID KEY
MOVE STAAGE TO NUMSTA MOVE "BORRAR" TO NOMSTA
CALL DISPLAYMESSAGE OF PRIMERA
USING MENSAJE "ERROR" ESTILO.
CALL "CARGAR".
EXIT PROGRAM.
FINALIZAR.
EXIT PROGRAM.
A continuacin el botn cancelar lo nico que hace es volver a enviar el foco al control
AGE-COD, para introducir un nuevo cdigo.
Control: CANCELAR
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
MOVE 1 TO POW-ENABLE OF AGE-COD
CALL SETFOCUS OF AGE-COD.
eL Botn de listar, lo que har ser una impresin de la pantalla, pero claro, solo de los
campos que tengamos con la propiedad de Printable seleccionada. Esto viene muy bien
y nos puede ayudar mucho por la facilidad de uso. Este control solo estar activo
cuando tengamos un registro presente. Como aclaracin os digo que los controles de
ListBox y Table, aunque su contenido no quepa en la pantalla, en la impresora si se
imprimirn por completo. Al igual que en el anterior mostramos previamente una
ventana de advertencia.
Control: LISTAR
Evento : CLICK
Programacin
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 "Listar la ficha ?" "Mensaje" ESTILO.
IF PROGRAM-STATUS = POW-DMRYES GO UNO ELSE GO FINALIZAR.
UNO.
CALL OPENPRINTER OF PRINT1.
CALL WRITESHEET OF PRINT1.
CALL CLOSEPRINTER OF PRINT1.
EXIT PROGRAM.
FINALIZAR.
EXIT PROGRAM.
El botn del e-mail, nos llamar al Outlook Express de Microsoft para enviar un correo
como vimos en la seccin de trucos. Este control solo estar disponible cuando haya un
registro presente. Tambin comprobaremos que el campo del e-mail en nuestro
registro tenga datos antes de enviar nada.
Control: EMAIL
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
WORKING-STORAGE SECTION.
01 LLAMADA.
02 FILLER PIC X(30) VALUE "c:\archiv~1\outloo~1\msimn.exe".
02 FILLER PIC X(17) VALUE " /mailurl:mailto:".
02 LLAMAI PIC X(30).
01 ESTILO PIC S9(4) COMP-5.
PROCEDURE DIVISION.
IF AGEMAI = SPACES GO SINMAIL.
MOVE AGEMAI TO LLAMAI.
CALL EXECAPL OF DDE1 USING LLAMADA POW-SWNORMAL.
EXIT PROGRAM.
SINMAIL.
ADD POW-DMOK POW-DMICONSTOP GIVING ESTILO
CALL DISPLAYMESSAGE OF PRIMERA
USING "Introduzca una direccin de correo" "Error" ESTILO.
EXIT PROGRAM.
Veamos ahora el botn de grabar los datos del registro. Este botn cambia de nombre
(GRABAR, REGRABAR) dependiendo si es un alta o una modificacin, as tambin
controlaremos si es un WRITE o un REWRITE lo que tenemos que hacer. Es el evento
mas largo de todos los que hemos visto. Este ser el momento de mover todos los
datos que hemos introducido en los controles a nuestros campos del registro y de
comprobar cuales de ellos queremos como obligatorios, en nuestro caso solo el del
nombre, pero si queris poner mas solo tenis que aadir lneas iguales a las del
control del nombre. Veamos su programacin:
Control: GRABAR
Evento : CLICK
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
WORKING-STORAGE SECTION.
01 ESTILO PIC S9(4) COMP-5.
PROCEDURE DIVISION.
MOVE POW-TEXT OF AGE-NOM TO AGENOM.
MOVE POW-TEXT OF AGE-DOM TO AGEDOM.
MOVE POW-TEXT OF AGE-POB TO AGEPOB.
MOVE POW-NUMERIC OF AGE-POS TO AGEPOS.
MOVE POW-TEXT OF AGE-PRO TO AGEPRO.
IF POW-CHECK OF AGE-GEH = POW-ON MOVE "H" TO AGEGEN ELSE
MOVE "M" TO AGEGEN
END-IF
MOVE POW-SELECT OF AGE-TIP TO AGETIP.
MOVE POW-TEXT OF AGE-TEL TO AGETEL.
MOVE POW-TEXT OF AGE-MOV TO AGEMOV.
MOVE POW-TEXT OF AGE-MAI TO AGEMAI.
MOVE POW-TEXT OF AGE-WEB TO AGEWEB.
IF AGENOM = SPACES GO SINNOM.
ADD POW-DMICONEXCLAMATION POW-DMOK GIVING ESTILO.
IF POW-TEXT OF L-GRABAR = "Grabar"
WRITE REGAGE INVALID KEY MOVE STAAGE TO NUMSTA
MOVE "GRABAR" TO NOMSTA CALL DISPLAYMESSAGE OF PRIMERA
USING MENSAJE "ERROR" ESTILO.
IF POW-TEXT OF L-GRABAR = "Regrabar"
REWRITE REGAGE INVALID KEY MOVE STAAGE TO NUMSTA
MOVE "REGRABAR" TO NOMSTA CALL DISPLAYMESSAGE OF PRIMERA
USING MENSAJE "ERROR" ESTILO.
CALL "CARGAR".
CALL "PONCCC".
EXIT PROGRAM.
SINNOM.
ADD POW-DMICONEXCLAMATION POW-DMOK GIVING ESTILO.
CALL DISPLAYMESSAGE OF PRIMERA
USING "Nombre obligatorio" "ERROR" ESTILO.
CALL SETFOCUS OF AGE-NOM.
EXIT PROGRAM.
Los botones que nos quedan estn repetidos en la aplicacin, ya que podremos
acceder desde ellos o desde el men que creamos en el captulo 4. El cdigo lo
pondremos en los dos eventos y as actuara igual si se pulsa el botn o si se
selecciona la opcin desde el men. Cuando se creo el men no se le pusieron nombre
a las opciones, as que Power le habr puesto una por defecto del tipo MENU1, MENU2,
etc ... Solo tenis que buscar la correspondiente y asignarle el evento CLICK.
El botn de CONSULTA, simplemente nos llama a otra ventana en la cual vamos a
efectuar la consulta y adems pone la pantalla principal deshabilitada para que no se
pueda tocar mientras estamos en la consulta.
Control: CONSULTA
Evento : CLICK
MENUCONSULTA
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
MOVE POW-OFF TO POW-ENABLE OF PRIMERA
CALL OPENSHEET OF PRIMERA USING "CONSULTA".
El botn de SALIR, nos sirve para abandonar la aplicacin y lo nico que hace es llamar
a la rutina PARASALIR.
Control: SALIR
Evento : CLICK
MENUSALIR
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
CALL "PARASALIR".
Control: IMAGEN
Evento : CLICK
MENUIMAGEN
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
MOVE POW-OFF TO POW-ENABLE OF PRIMERA
CALL OPENSHEET OF PRIMERA USING "ACERCA".
Vamos con la segunda pantalla de nuestra aplicacin, una pantalla mucho mas
compleja y efectiva que la de mantenimiento. Si bien en esa primera nos limitabamos
a colocar campos de edicin para introducir los datos, en sta segunda vamos a hacer
una consulta completa y en la que aparecern nuevos controles a los que aplicaremos
nuevos eventos.
Para crear otra pantalla dentro de nuestro proyecto debemos seleccionar la opcin
New, del men de File. Para el estilo de la ventana marcamos: Pop-up Windows, Thin y
Title Bar. La llamamos CONSULTA y en el ttulo de la misma le ponemos Consulta de
contactos.
A continuacin os pongo una imagen de como debe de quedar la pantalla con todos
sus controles, es una imagen en tiempo de desarrollo y seguidamente os explico las
caractersticas de cada uno. La imagen no est a tamao real, est exactamente a un
70% para que pudiera entrar en la pgina.
TABLE
El control mas importante que contiene es la tabla, llamada por PowerCobol Table. La
misma nos va a servir para incluir una lista separada por columnas con todos nuestros
contactos, la cual podremos clasificar por cada uno de los campos que contiene. Las
propiedades son las siguientes:
Le llamaremos como vis TABLA y tendr todas las columnas que vis y una mas que
no sale, llamada E-MAIL. Para cada una de las columnas estn sern sus
caractersticas:
CAPTION
PICTURE
WIDTH
ALIGNMENT
SCROLL LOCK
CODIGO
ZZZZ
40
RIGHT
SI
NOMBRE
X(30)
200
LEFT
SI
DOMICILIO
X(30)
200
LEFT
NO
C.P.
99999
40
RIGHT
NO
POBLACION
X(20)
132
LEFT
NO
PROVINCIA
X(15)
100
LEFT
NO
TIPO
X(12)
80
LEFT
NO
TELEFONO
X(20)
132
LEFT
NO
TELEFONO MOVIL
X(20)
132
LEFT
NO
X(30)
200
LEFT
NO
Para la representacin grfica de los datos, PowerCobol dispone de ste control, que
aunque no muy extenso en sus posibilidades si es efectivo en cuanto a su cometido.
Gracias a el, vamos a representar de forma grfica la cantidad de contactos que
tenemos en nuestro fichero segn su tipo. Las propiedades de dicho grfico al cual
llamaremos desde nuestr aplicacin GRAFICO, son las siguientes:
Con stas propiedades os garantizo que el listado queda muy bien en modo apaisado
y sobre un papel tipo A4. Este control carece de eventos.
DEMAS CONTROLES
Como podis apreciar al resto de controles, son los habituales, LABEL y BUTTON, que
nos ayudan a dar forma a la pantalla de consulta.
Antes de seguir os dir como se llaman cada uno de los campos que figuran a la
derecha y que rellenaremos con los totales y subtotales. Adems el fondo de dichos
campos se ha puesto en colores que utilizaremos tambin para cada una de las barras
del grfico y as situar los datos mas rapidamente. El porque he utilizado LABEL en vez
de EDIT es muy sencillo, para evitar que dichos campos se puedan modificar o tomar
el foco. Al ponerlos como LABEL el compilador los considera como DISPLAYS normales
y no podemos ni modificarlos ni editarlos ni nada similar.
Para
Para
Para
Para
Para
Para
Para
Para
poner
poner
poner
poner
poner
poner
poner
poner
el
el
el
el
el
el
el
el
nmero
nmero
nmero
nmero
nmero
nmero
nmero
nmero
Veamos los eventos a programar sobre dicho formulario. En ste captulo veremos solo
algunos y dejaremos el resto de eventos, as como la programacin del resto de
eventos de los dems controles para el siguiente captulo.
Evento
SPECIAL-NAMES
FILE-CONTROL
Programacin
DECIMAL-POINT IS COMMA.
SELECT AGENDA ASSIGN TO "AGENDA.DAT"
ORGANIZATION INDEXED ACCESS DYNAMIC
RECORD KEY KEYAGE FILE STATUS STAAGE.
SELECT CLASI ASSIGN TO "CLASI.DAT".
FILE
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 CCC
PIC 9999 GLOBAL.
01 TOPE
PIC 9999 GLOBAL..
01 AHIVA
PIC 9(4) GLOBAL EXTERNAL.
Ayuda
Indicamos la coma
como punto decimal.
Definicin de nuestros
archivos.
Para clasificar.
Descripcin de los
ficheros a utilizar en
nuestra aplicacin. 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.
Esta definicin
corresponde al fichero
que vamos a utilizar
para la clasificacin
por las distintas
columnas de la tabla.
Variable de estado.
Mensaje en caso de
error al acceder al
fichero.
Contador.
Tope de contador.
Variable.
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 dems
eventos.
Para abandonar la pantalla, pulsaremos sobre el botn 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
Programacin
ENVIRONMENT DIVISION.
DATA
DIVISION.
PROCEDURE DIVISION.
MOVE 0 TO AHIVA
CALL CLOSESHEET OF CONSULTA.
Control: LISTAR
Evento : CLICK
Programacin
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 programacin 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 enva al prrafo UNO donde salimos de sta
ventana enviando los datos del cdigo 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
Programacin
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.
El nico evento que tendremos que programar ser el del botn de salir y ser el
siguiente:
Control: SALIR
Evento : CLICK
Programacin
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 diseo de la ventana, pinchamos sobre Project, Edit y a
continuacin pulsamos sobre el botn Add, para aadir esta ventana al proyecto y as
poder compilar y ver como funciona. Una vez aadida pulsamos sobre el botn Ok y ya
podemos ver en la pequea ventana del proyecto que tenemos en la pantalla, como
esa ventana est incluida.
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.
CONSIDERACIONES.
Diversas consideraciones a tener en cuenta, para que el compilador y nuestros
programas funcionen correctamente.
INSTALACION:
Cuando instalamos Fujitsu PowerCobol, ste se instala en el directorio
FSC, debemos de asegurarnos que C:\FSC\PCOBOL32 (directorio que
contiene el compilador y los archivos necesarios para ejecutar) estn en
el PATH. Os aconsejo para trabajar mas cmodo que os creis una
carpeta dentro de FSC y ah desarrollis todo, por ejemplo
C:\FSC\PROGRAMAS. Luego a su vez para cada proyecto abrimos otra
carpeta dentro de sta y as lo tendremos todo mas organizado.
No utilicis espacios en blanco ni para el nombre ni para el directorio
donde se encuentre, es decir que "Mis Documentos" o "Archivos de
Programa" no nos valdrn para guardar nuestros proyectos.
PROYECTO:
El hecho de crear una ventana no significa que tengamos un programa.
Siempre hay que empezar por el proyecto o bien crear las ventanas y
luego aadirlas a un proyecto. Pero una ventana por separado si no
forma parte de un proyecto no se puede ejecutar, puesto que
PowerCobol no la va a reconocer. Tened en cuenta que siempre una de
las ventanas debe de estar marcada como ventana principal, para que el
proyecto cuando se ejecute empiece por algn sitio.
PROGRAMACION:
Prcticamente todo lo que hemos aprendido de programacin Cobol se
puede utilizar con PowerCobol.
Todos los procedimientos, algoritmos, descripciones de archivos, tablas,
todo es totalmente reutilizable. La nueva programacin ser la que haga
referencia a los aspectos grficos y de representacin de nuestros
programas.
ARCHIVOS BTRIEVE (RMCOBOL):
Se pueden leer directamente los archivos Btrieve, es decir los que utiliza
RM/Cobol, para ello cuando se defina el fichero en la Select, bastar con
ponerle despus del nombre de archivo las letras BTRV. Cuando vayamos
viendo los ejemplos lo veris mas claramente, pero desde aqu os
aseguro que se utilizan perfectamente. Tengo que hacer constancia,
despus de muchas pruebas, que los campos con signo y computational
no son legibles. Leyendo sobre lo que pone en los manuales, dice que
power es capaz de leer la estructura de un fichero Btrive, pero no de sus
caractersticas.
COMPILACION:
Los pasos necesarios para una compilacin y creacin de ejecutable, son
los siguientes:
Hacer Compile, el Link y el Make, pero ten en cuenta que esto siempre
ser sobre la ventana que tengamos activa, si deseamos compilar todo
el proyecto que tenemos abierto, lo mejor es hacer un Build y entonces
har lo mismo, pero con toda la aplicacin. Si nos presenta algn error,
ste suele estar bien detallado, incluida la lnea y el evento donde se ha
producido, con lo que su localizacin es muy sencilla.
EJECUCION:
Cuando tengamos una aplicacin terminada y queramos ejecutarla en
otro equipo, ser necesario copiar lo siguiente:
Archivo ejecutable.
Imgenes e iconos que vayamos a utilizar.
herramientas y una ventana vaca preparada para empezar nuestro primer programa.
Veamos una explicacin rpida de las opciones que nos ofrece el Men:
Para PowerCobol, las pantallas se llaman Sheet, debemos de tenerlo en cuenta, puesto
que ser uno de los trminos que mas utilicemos. Al lado de las opciones que tengan
representacin en la barra de herramientas os coloco el icono que corresponda.
Siempre que pulsemos el botn derecho de nuestro ratn sobre cualquiera de los
controles que tengamos en la ventana o sobre la propia ventana, nos aparecer un
men flotante como este:
Title: Accedemos al ttulo del control, en los controles que no tengan ttulo, al
pulsar estar desactivada.
Style: Para modificar las propiedades del control.
Procedure: Para programar los eventos de cada uno de los controles.
Move: Mover el control. Se hace mejor con el ratn.
Resize: Cambiar el tamao del control. Se hace mejor con el ratn.
Menubar: Accedemos al control del men de nuestra ventana, donde podremos
aadir, borrar, modificar, programar nuestras opciones.
Item Order: Definimos el orden que tendrn nuestros controles cuando se pase
de uno a otro.
AGENDA.EXE EL RESULTADO.
En sta pgina os presento el ejecutable de la aplicacin que vamos a realizar paso a
paso desde el captulo 6 en adelante.
Antes de bajarla podis seguir unos consejos para unificar criterios.
Crearos dentro del directorio C:\FSC (donde se encuentra el Power), dos carpetas, una
la llamis: Agenda y otra Agendaex. En Agenda crearemos el proyecto y todo lo que
se vaya generando a partir de ah, hasta conseguir el programa completo. En
Agendaex, guardis y descomprimis el archivo que se encuentra aqu, el cual nos
servir para ver como va quedando nuestro proyecto.
Contenido del archivo agenda.zip que vais a descargar:
Agenda.exe: el programa ejecutable.
Cobol85.cbr: archivo de configuracin de PowerCobol.
Bloc.bmp: archivo de imagen utilizado en el programa.
cobol.bmp: archivo de imagen utilizado en el programa.
Descarga
47 Kb
TRUCOS DISPONIBLES
Nmeros aleatorios
Imprimir (Pantalla/Impresora). En serie
Aos bisiestos
Campos tipo hora
Enviar un e-mail
Da de la semana
NUMEROS ALEATORIOS.
Como podemos obtener nmeros aleatorios en Cobol ?. Bien, aunque no exista
ninguna orden al respecto, podremos nosotros crearnos un algoritmo partiendo de
alguna variable que varie constantemente y nada mejor para ello que la hora del
sistema. Como lo haramos?
En la Working, creariamos una variable de 8 dgitos para guardar la hora
y la subdividimos en 4 variables de 2 dgitos, para la hora, minutos,
segundos y milisegundos. Y otra para guardar el nmero aleatorio.
WORKING-STORAGE SECTION.
01 HORARIO PIC 9(8).
01 HORA REDEFINES HORARIO.
02 HH PIC 99.
02 HM PIC 99.
02 HS PIC 99.
02 HX PIC 99.
01 NUMERO PIC 9(6).
Ahora en la Procedure aplicamos el algoritmo.
PROCEDURE DIVISION.
ALEATORIO.
ACCEPT HORARIO FROM TIME.
COMPUTE NUMERO = (HH * HX) / HM + HS.
Por supuesto, podremos ampliar la frmula o incluir mas variables, como la fecha, el
dia del ao, etc ...
En la seccin de Nmeros dentro de Utilidades, podis encontrar una de nuestro amigo
Jose Carlos Florn mucho mejor y que nos permite definir valores mximos y mnimos.
ENVIAR CODIGOS DE CONTROL A IMPRESORAS.
027
027
027
027
027
027
027
PCL-5 (HP)
038 108 048 072
038 100 048 068
038 100 064
040 115 051 066
040 115 048 066
040 115 049 083
040 115 048 083
Otro amigo, Artur Potau nos facilita todo lo necesario para imprimir por
impresoras conectadas al puerto serie.
En primer lugar deberemos de configurar el puerto en relacin con las
propiedades de la impresora a conectar. Por ejemplo, si la impresora es una
etiquetera cuya configuracin es a 9600 baud, paridad NONE, 8 bits de datos y
1 bit de parada definiremos el puerto en el AUTOEXEC.BAT de la forma:
MODE COM2:9600,N,8,1
Opcionalmente podemos aadir una (,R) para que reintente la impresin en
caso de fallo en la transmisin o buffer lleno.
Despus, definiremos una variable con el nombre que se desee de la forma:
SET TICKET=COM2:
En la SELECT del programa en COBOL definiremos esta impresora como:
SELECT IMPRESO ASSIGN TO PRINT "TICKET".
Si la configuracin se ha realizado correctamente, cualquier WRITE LINEA FROM
IMPRESO que se haga debera de salir por la impresora serie definida.
DIBUJAR CUADROS O LINEAS EN PANTALLA.
Si bien los actuales compiladores traen sus propias ordenes para dibujar los, tan
utilizados cuadros en pantalla, vamos a explicar una pequea rutina para dibujarlos de
una manera sencilla. Existen an muchos programadores que se sirven de programas
externos para dibujar previamente las pantallas e incluirlas luego en la WorkingStorage Section.
Para conseguirlo nos vamos a basar en una variable de 8 dgitos que
contendr la lnea y la columna de inicio y la lnea y la columna final.
Adems necesitaremos alguna variable mas de apoyo y una lnea
completa de 80 columnas, lo explico:
...
WORKING-STORAGE SECTION.
01 RAYA PIC X(80) VALUE ALL "-". (carcter 196, raya continua, no guin).
01 CUADRO.
DISPLAY
DISPLAY
DISPLAY
DISPLAY
SEGUIR.
...
"+"
"+"
"+"
"+"
LINE
LINE
LINE
LINE
CUA1
CUA1
CUA3
CUA3
COL
COL
COL
COL
CUA2.
CUA4.
CUA2.
CUA4.
EMPEZAR.
...
De sta forma nos aseguraremos que el valor de la tabla que contiene los das de cada
mes est correctamente, asignndole a Febrero los que realmente le corresponden
segn sea bisiesto o no.
VENTANA DE OPCIONES.
A todos nos gusta que nuestros programas sean lo mas fciles y agradables para el
usuario. Una de las tareas que mas nos ayuda a conseguirlo es el mostrar las opciones
posibles en una ventana y poder movernos por las opciones con las flechas. Desde aqu
voy a explicar una manera sencilla de hacerlo, eso si con un nmero limitado de
opciones, en la seccin utilidades podris encontrar una rutina para hacerlo con un
nmero ilimitado de ineas siempre dentro de una pequea ventana.
Antes de nada, nos definimos nuestro men de opciones o cualquier otra
cosa, que queramos mostrar a modo de eleccin, por ejemplo en una
tabla en la Working-Storage y dibujamos la ventana como queramos, a
mano, con la rutina de mas arriba o una ventana real utilizando para ello
lo explicado en la seccin de manuales. Yo voy a hacerlo con la ventana
virtual en RM/Cobol.
...
WORKING-STORAGE SECTION.
01 TABLA-OPCIONES. (definimos 7 opciones de 10 caracteres cada una).
02 FILLER PIC X(30) VALUE "CONSULTAS LISTADOS EXTRACTOS ".
02 FILLER PIC X(30) VALUE "ALTAS
BAJAS
MODIFACION".
02 FILLER PIC X(10) VALUE "SALIR
".
01 RTABLA REDEFINES TABLA-OPCIONES.
02 ELEMEN
PIC X(10) OCCURS 7 TIMES.
01 LI
PIC 99.
01 OP
PIC X.
01 ESCA PIC 9 COMP-1.
01 QW PIC 9.
PROCEDURE DIVISION.
INICIO.
MOVE 7 TO WINLIN.
MOVE 15 TO WINCOL.
MOVE " OPCIONES " TO WINTIT MOVE 10 TO WINTITLO.
DISPLAY WCB LINE 10 COL 10 LOW ERASE
CONTROL "WINDOW-CREATE".
MOVE 1 TO LI.
(aqui dibujamos las opciones dentro de la ventana.)
UNO.
DISPLAY ELEMEN (LI) LINE LI COL 2 LOW.
ADD 1 TO LI IF LI > 7 NEXT SENTENCE ELSE GO UNO.
DOS.
(con sto conseguimos que nunca se salga de las opciones y ponemos en reverso la linea
seleccionada.)
...
...
LI
OP
ESCA
QW
PIC 99.
PIC X.
PIC 9 COMP-1.
PIC 9.
PROCEDURE DIVISION.
INICIO.
(partimos del ejemplo y le damos esos valores).
01
01
(Partimos de que previamente hemos aceptado el campo CADENA, que contendr precisamente
...
DIEZ.
MOVE 0 TO P1 P2.
MOVE ARTNOM TO MIRAC.
COMPUTE P4 = 30 - TOPE.
ONCE.
INITIALIZE VALIC P2.
DOCE.
(Aqu vamos moviendo nuesto campo CADENA, por todas las posibilidades posibles).
...
Lo que voy a hacer, para que se pueda ver mas claro, es ponerlo en la seccin de
Programando, dentro del programa paso a paso, y as lo podris ver de una forma mas
lgica.
MANDAR UN E-MAIL.
En realidad lo que vamos a hacer con este truco que nos ha facilitado un
cobolero amigo llamado Jos Mari, es invocar con un CALL, a nuestro
programa de correo electrnico para que nos muestre una ventana para
escribir un mensaje nuevo.
El truco va a estar explicado para hacerlo con Outlook Express (OE),
pero podris hacer lo mismo con cualquier otro, cambiando algunos de
los parmetros.
Lo primero que debemos de hacer es averiguar donde se encuentra
ubicado el programa en nuestro disco duro, si utilizamos OE, ste se
encontrar en "C:\Archivos de Programa\Outlook Express\Msimn.exe".
Una vez tengamos la ruta solo tendremos que hacer un CALL ha dicho
lugar, pero tenemos que tener en cuenta que si lo hacemos desde MSDOS, para ste sistema los nombres de archivo o carpetas no pueden
A prposito de ste tema, nuestro amigo Muoz, S. nos propone un programita para
enviar mail's entre usuarios de Unix / Linux.
identification division.
program-id. Mail.
environment division.
configuration section.
special-names.
decimal-point is comma.
input-output section.
data division.
working-storage section.
01 parametros
pic x(250).
01 string-mail.
02 filler
pic x(09) value "mailx -s ".
02 filler
pic x(01) value '"'.
02 asunto
pic x(30) value spaces.
02 filler
pic x(02) value '" '.
02 usuario
pic x(30) value spaces.
02 filler
pic x(03) value " < ".
02 mensaje
pic x(47) value spaces.
02 filler
pic x(12) value " > /dev/null".
procedure division.
parrafo-principal.
accept parametros from command-line
unstring parametros delimited by ","
into asunto, usuario, mensaje.
display string-mail
call "system" using string-mail
stop run.
Donde: mailx es el comando de Unix/Linux que envia los mail.
Los parmetros de entrada al programa en este caso deben estar separados
por coma (,) .
Ejemplo
Empezamos definiendo el programa y las variables que vamos a utilizar.
IDENTIFICATION DIVISION.
PROGRAM-ID. EDITOR.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. COBOL.
OBJECT-COMPUTER. COBOL.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
* donde se guardara la palabra introducida.
01 PALABRA PIC X(20).
01 PALABRI REDEFINES PALABRA.
02 ELE PIC X OCCURS 20 TIMES.
* li = contador de letras de la palabra.
01 LI
PIC 99.
* linea = contador de lineas donde aparecen las palabras introducidas.
01 LINEA
PIC 99.
* colum1 = contador de columna de palabra introducida.
01 COLUM1 PIC 99.
* colum2 = contador de columna de numero de letras de palabra introducida.
01 COLUM2 PIC 99.
* lin = linea por la que se va escribiendo.
01 LIN PIC 99.
* coli = columna por la que se va escribiendo.
01 COLI PIC 99.
* total = numero de palabras introducidas.
01 TOTAL PIC 999.
01 LTOTAL PIC ZZ9.
* x = letra que vamos introduciendo.
01 X PIC X.
01 RAYA.
02 FILLER PIC X(30) VALUE "------------------------------".
02 FILLER PIC X(25) VALUE "-------------------------".
01 ESCA PIC 9 COMP-1.
PROCEDURE DIVISION.
* en este primer parrafo vamos a disear un poco la pantalla.
INICIO.
DISPLAY RAYA LINE 2 COL 2 ERASE.
DISPLAY RAYA LINE 15 COL 2.
DISPLAY RAYA LINE 17 COL 2.
DISPLAY "<SUPR>BORRA CARACTER" LINE 16 COL 20 LOW REVERSE.
DISPLAY "<ESC> FINALIZAR" LINE 16 COL 42 LOW REVERSE.
DISPLAY ">> " LINE 16 COL 2.
DISPLAY " INTRODUCIR TEXTO " LINE 2 COL 5 LOW REVERSE.
DISPLAY "---------------------" LINE 2 COL 59.
DISPLAY " PALABRAS " LINE 2 COL 62 LOW REVERSE.
DISPLAY " PALABRAS " LINE 17 COL 5 LOW REVERSE.
* aqui inicializamos las variables con las que vamos a trabajar.
* en la Working estn explicadas.
MOVE 18 TO LINEA MOVE 3 TO COLUM1 MOVE 23 TO COLUM2.
MOVE 3 TO LIN MOVE 2 TO COLI MOVE 0 TO LI TOTAL.
UNO.
* aceptamos un caracter cada vez, lo analizamos y actuamos en consecuencia.
ACCEPT X LINE LIN COL COLI
ON EXCEPTION ESCA NEXT SENTENCE.
IF ESCA = 27 GO SALIR.
IF ESCA = 56 IF LI > 0 GO MIRAR.
* esta linea es para que solo se pueda introducir un espacio.
IF X = " " IF LI > 0 PERFORM AHORA GO DOS ELSE GO UNO.
ADD 1 TO LI MOVE X TO ELE (LI).
DOS.
* aqui comprobamos que no se nos salga de los limites la linea.
ADD 1 TO COLI IF COLI > 55 MOVE 2 TO COLI ADD 1 TO LIN.
IF LIN > 14 GO SALIR.
GO UNO.
AHORA.
* en este prrafo mostramos la palabra introducida y el numero de letras
* que contiene. Ademas controlamos en que parte de la pantalla nos van
* apareciendo.
DISPLAY PALABRA LINE LINEA COL COLUM1 LOW.
DISPLAY LI LINE LINEA COL COLUM2.
ADD 1 TO TOTAL MOVE TOTAL TO LTOTAL.
DISPLAY LTOTAL LINE 16 COL 6 LOW.
IF TOTAL = 36 GO SALIR.
INITIALIZE PALABRA MOVE 0 TO LI ADD 1 TO LINEA.
IF LINEA = 25 IF COLUM1 = 3 MOVE 18 TO LINEA
MOVE 30 TO COLUM1 MOVE 50 TO COLUM2 ELSE
MOVE 3 TO LINEA MOVE 59 TO COLUM1 MOVE 78 TO COLUM2.
SALIR.
* este parrafo finaliza el programa.
DISPLAY "COMPLETADO EL EDITOR" LINE 13 COL 20.
ACCEPT X LINE 13 COL 18 LOW.
STOP RUN.
MIRAR.
* este parrafo lo utilizamos cuando borramos un caracter dentro de una palabra.
SUBTRACT 1 FROM COLI.
...
PROCEDURE DIVISION.
CALCULODIA.
COMPUTE C4 ROUNDED = ANIO - 1.
COMPUTE BISI = C4 / 4.
COMPUTE BI100 = C4 / 100.
COMPUTE BI400 = C4 / 400.
COMPUTE TODIA ROUNDED = ( 365 * C4 ) + BISI - BI100 + BI400.
(Con esto conseguimos averiguar los das transcurridos hasta el 31 de
Diciembre del ao anterior al que estemos. Estos dias se guardarn en
la variable TODIA.).
MOVE 0 TO MESES.
CALCULODIA1.
ADD 1 TO MESES IF MESES > MES GO CALCULODIA2.
COMPUTE TODIA = TODIA + TDIA (MESES).
GO CALCULODIA1.
(Aqui sumamos los das de los meses transcurridos del ao actual sin
contar el actual.).
CALCULODIA2.
COMPUTE TODIA = TODIA + DIA.
(Le sumamos los das del mes en curso y ya tenemos el nmero total de
das desde el inicio de nuestro calendario).
DIVIDE 7 INTO TODIA GIVING C4 REMAINDER DIASEMANA.
IF DIASEMANA = 0 MOVE 7 TO DIASEMANA.
Al llegar aqu el resto de la operacin de dividir todos los das entre 7,
porque 7 son los das de la semana, nos debe de dar un nmero entre 0
y 6 que corresponder a cada uno de los das de la semana.
La ltima lnea es para cambiar el valor que tiene el domingo que sera 0
por el 7 para que corresponda con los elementos de nuestra tabla de
das, de tal manera que ahora solo nos quedara poner:
DISPLAY ELDIA (DIASEMANA) LINE 10 COL 10.
Y ahora, todo aquel que lo necesite que lo implemente, siempre es mas
profesional presentar la fecha indicando el da de la semana al que
corresponde.