INTRODUCCION
INTRODUCCION
La orientacin del curso / manual la enfocar a mi entorno de
trabajo, es decir RM bajo UNIX, pero como os he dicho antes, no hay
muchas diferencias.Al pensar en Cobol como lenguaje de programacin
debemos de tener presente que nos referimos a un lenguaje dedicado
a gestin de datos con una magnfica transportabilidad entre los
distintos sistemas, yo he ejecutado el mismo programa en MS-DOS y
UNIX sin modificar ni una linea de cdigo y copiando solo el
objeto.Si se le llaman lenguajes de programacin, es porque
realmente se consideran como cualquier idioma, es decir tiene su
gramtica, sus verbos, sus frases, sus prrafos y el cobol adems
tiene una gran similitud con el ingls, ya que todo su entorno est
sacado de ste idioma. Cobol adems es un lenguaje estructurado y sus
partes se diferencias claramente en Divisiones. Estas son 4, son
obligatorias y cada una de ellas tiene una misin diferente dentro
de cada programa como veremos a continuacin.El programa cobol se
escribe secuencialmente en lneas de 80 caracteres o menos con la
siguiente divisin:
La parte (1) comprende las columnas de la 1 a la 6 ambas
inclusive y se utiliza para numerar las lneas, aunque hoy en da
prcticamente no se utilizan.La parte (2) comprende la columna 7 y
en ella podemos encontrar, un guin (-) que nos indica que esta lnea
es continuacin de la anterior pero que por su tamao ocupa mas de
una lnea, un asteristo (*) que nos indica que el texto que viene a
continuacin es un comentario y por lo tanto que el compilador lo
ignore, o bien puede servir dependiendo de los compiladores para
indicaciones del debug.La parte (3) se le llama Area A comprende
las columnas 8 a 11 ambas inclusive y aqu es donde se escriben los
nombre de las divisiones, de las secciones, de los prrafos, los
indicadores de FD (File Description) y los niveles de variables 01
y 77.La parte (4) llamada Area B comprende desde la columna 12 a la
72 y en ellas se incluirn todas las instrucciones del programa, las
lineas de las secciones y los niveles de variables mayores a 01.La
parte (5) de la columna 73 a la 80 no se utiliza y por lo tanto es
ignorada por el compilador.El punto es un signo de vital
importancia en cobol ya que nos indica el final de una linea, en el
han de terminar todas las secciones, divisiones y prrafos. Si al
final de una linea el compilador no encuentra el punto, interpretar
que la instruccin contina hasta que aparezca el punto de fin de
linea.Al igual que en otros lenguajes, el cobol dispone de palabras
reservadas que no debemos de utilizar como nombres de variables o
de prrafos, adems stos no deben de exceder de 30 caracteres
(depende del compilador).Las variables y constantes que se pueden
utilizar son numricas, alfabticas o alfanumricas. Las numricas al
contrario de la mayora de los lenguajes actuales o las bases de
datos no miden su tamao por bytes sino por dgitos, es decir, que
una variable de 6 dgitos podr contener nmeros desde 0 hasta 999999
si es de valor absoluto o incluyendo los negativos si lleva signo.
Para las alfanumricas en cambio no hay cambio alguna y su tamao
viene indicado por el nmero de caracteres que ocupa.Existen adems
en cobol unas variables que vienen con un valor propio y que se
pueden utilizar libremente, como ZERO, SPACE, LOW-VALUES,
HIGH-VALUES, etc...Quisiera respetar para todo el manual las mismas
pautas, color Rojo para las palabras reservadas cobol, subrayado
para las obligatorias, en cursiva los comentarios y en normal el
resto.Nota final:Es obvio que cada manual estar orientado a la
manera de trabajar de quien lo escribe, con ello quiero decir que
habr cosas que no explicar mucho o incluso otras que omitir porque
yo no las haya utilizado nunca.Una explicacin perfectamente
detallada deber venir en los manuales de cada uno de los
compiladores que del lenguaje Cobol existen hoy en dia.Espero que
podais comprender sto, eso si, os puedo asegurar que todos mis
programas utilizan solo lo que aqu voy a exponer y ninguno nunca me
ha dado ningn problema.
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION. Esta es la primera linea de todo
programa Cobol e identifica a la primera divisin donde se
especifica el nombre del programa, el del autor y dems datos, su
sintaxis sera la siguiente:IDENTIFICATION DIVISION.PROGRAM-ID.
Nombre del programa.AUTHOR. Nombre del autor.INSTALLATION. Lugar
donde est instalado.DATE-WRITTEN. Fecha de creacin.DATE-COMPILED.
Fecha de compilacin.REMARKS. Comentarios.Vemos que el nico prrafo
obligatorio adems del nombre de divisin es el que hace referencia
al nombre del programa, los dems nombre de autor, lugar de
instalacin, fechas de creacin y compilacin y comentarios son
opcionales, eso si, si se incluyen se deben de poner cumpliendo las
normas.Podemos incluir adems todos los comentarios o explicaciones
que creamos oportunas incluyendo en la columna 7 un asterisco (*)
que nos indica que el compilador har caso omiso de lo que venga a
continuacin, por ejemplo.* /////// Este programa es para hacer algo
///////* // atencin a la seccin de la fecha
////Ejemplo:IDENTIFICATION DIVISION.PROGRAM-ID. MANCLI.AUTHOR.
ANDRES MONTES.INSTALLATION. WWW.REMARKS. Programa para
mantenimiento de fichero de clientes.
Nota final:Poco mas podemos decir de sta division, obviamente
las dems no son tan pequeas, sin embargo posee dos de las lineas
mas importantes de cualquier programa cobol.ENVIRONMENT
DIVISION.
ENVIRONMENT DIVISION. Es la segunda division por orden de
aparicin, y en ella se especifican, el ordenador donde se escribi y
se ejecutar el programa, asi como la relacion entre los ficheros a
utilizar con sus correspondencias externas, es decir con los
dispositivos a los que har referencia el programa objeto cuando
vaya a establecer comunicacin con dicho fichero.Diremos antes de
continuar que en los primeros cobol haba muchas partes que eran
obligatorias en cada programa, pero hoy en dia, por ejemplo, sta
divisin ya no es obligatoria, asi como ninguna de sus partes. Su
sintaxis sera la siguiente:ENVIRONMENT DIVISION.CONFIGURATION
SECTION.SOURCE-COMPUTER. Ordenador donde se escribi el
fuente.OBJECT-COMPUTER. Ordenador donde se ejecuta el
objeto.SPECIAL-NAMES. Cambiar valores para constantes del lenguaje,
pueden variar en cada compilador. Como se aprecia en su sintaxis,
sta segunda division se divide a su vez en dos secciones, que se
describen a continuacion:CONFIGURATION SECTION: Donde describimos
los tipos de ordenadores en que se escribio y se ejecutar el
programa, o bien el nombre del compilador y asignacin de valores a
ciertas constantes utilizadas por el compilador, estos valores se
introducen en sus respectivas lineas como se ve arriba.Para la
linea de SPECIAL-NAMES el uso mas habitual es el de cambiar el
punto decimal usado por los ingleses por la coma y asi poder
especificar los puntos para los miles, su formato sera el
siguiente:SPECIAL-NAMES. DECIMAL-POINT IS COMMA.Tambin podriamos
cambiar el valor del smbolo de la moneda con:CURRENCY SIGN IS
literal , suele ser un solo caracter y no puede coincidir con
ninguno de los que usamos para definir las variables, es decir ni
A,ni Z,ni 9,ni -,ni +,ni X, etc...O hacer que todas las letras
introducidas sean maysculas o minsculas o que no haya diferencias
entre ambas con la clusula ALPHABET.
INPUT-OUTPUT SECION: Es la siguiente seccin dentro de la
Environment, donde se especificarn todos los ficheros que vamos a
utilizar, su tipo, su modo de acceso asi como el medio en que
estarn, esta seccin solo ser obligatoria cuando vayamos a utilizar
ficheros. Esta tiene dos prrafos FILE-CONTROL e
I-O-CONTROL.123456789012 ABINPUT-OUTPUT SECTION.FILE-CONTROL.SELECT
Nombre-de-archivo ASSIGN TO Tipo-de-dispositivoORGANIZATION IS Tipo
de organizacionACCESS MODE IS Mode de acceso al ficheroRECORD KEY
IS Clave del registroALTERNATE RECORD KEY IS Claves alternativas
registro WITH DUPLICATESFILE STATUS IS Variable de estado del
fichero.Vamos a explicar cada una de las clusulas que encontramos
dentro de la Input-Output Section.Clusula SELECT es aqu donde
especificamos el nombre lgico que va a tener el fichero dentro del
programa, suele ser una palabra que identifique lo mas claro
posible el contenido del fichero, por ejemplo ARTICULOS,
PROVEEDORES, CLIENTES.Clusula ASSIGN aqu especificamos el tipo de
dispositivo, si es una impresora PRINTER, si es un fichero sobre el
que vamos a grabar RANDOM o DISC, se pueden utilizar otros como
INPUT, INPUT-OUTPUT, CASSETTE, MAGNETIC-TAPE, pero sin duda los mas
utilizados son los dos primeros para identificar si el fichero
utilizar una salida impresa o se utilizar sobre disco. Para
identificar ficheros utilizados para clasificar utilizaremos
SORT.Clusula ORGANIZATION aqu indicamos la organizacin de los
registros de nuestro fichero, podr ser SEQUENTIAL, RELATIVE o
INDEXED, si nuestro archivo fuera secuencial se podran emitir sta
clusula asi como las restantes.De sta organizacin se deriva el
formato del fichero, SEQUENTIAL si los registros se graban
secuencialmente conforme se dan entrada sin importar si estn o no
repetidos, un ejemplo claro son los archivos de impresora, todos
los listados son secuenciales. RELATIVE, si cada registro es
identificado por un valor entero con su posicin relativa
(practicamente no se utiliza). INDEXED es la mas utilizada e
identifica a ficheros que sus registros son accesibles mediante una
clave unica e irrepetible o por varias que pueden estar duplicadas,
cualquier fichero de mantenimiento, por ejemplo de ARTICULOS, podra
ser INDEXED, y cada cdigo ser nico para cada artculo y con el nos
iremos a su posicin y podremos ver todos los demas datos que hagan
referencia al registro. Existe tambin para los archivos de texto,
tipo AUTOEXEC.BAT la posibilidad de asignarlos directamente
especificando LINE SEQUENTIAL en sta clusula.Clusula ACCESS MODE
indica el modo de acceso al fichero, puede ser SEQUENTIAL, RANDOM o
DYNAMIC, si no se especifica ninguno o si el fichero es SEQUENTIAL
entiende que el modo ser SEQUENTIAL. RANDOM indica que accederemos
a l aleatoriamente por su clave y DYNAMIC (la mas utilizada) con la
que podremos acceder al fichero en el modo que queramos dentro del
programa, unas veces secuencialmente, si nos interesa, otras veces
por su clave.Clusula RECORD KEY se utiliza solo si el fichero es
indexado y en l decimos cual es el nombre de la clave por la cual
accederemos a los registros. Esta deber ser alfanumrica y tendr que
estar especificada en la FD del fichero. Si el archivo fuera
RELATIVE, esta clusula se sustituira por RELATIVE KEY e indicar el
nmero de registro del fichero, deber estar declarado en la
Working-Storage Section como una variable numrica sin signo.Clusula
ALTERNATE RECORD KEY solo para ficheros indexados e identifican una
o mas claves alternadas para nuestros registros, por ejemplo en un
fichero de clientes cuya clave principal sera el cdigo, podramos
asignar como clave alternativa el NIF, y podramos acceder a l por
las dos claves, bien por cdigo o bien por NIF, ser tambin
alfanumrico y deber tambin estar declarado en la FD. Si aparece
WITH DUPLICATES, indica que sta clave alternativa pudiera estar
duplicada, por ejemplo si hubiramos escogido como clave alternada
adems del NIF, el Nombre del cliente, podra darse el caso de que
dos clientes tuvieran el mismo nombre.Clusula FILE STATUS aqu damos
un nombre de una variable que especificaremos en la Working como un
campo alfanumrico de dos caracteres donde el programa depositar el
cdigo de error que ocurra en el fichero, dependiendo del valor
nosotros podremos operar o hacer alguna accin en concreto.El prrafo
I-O CONTROL se utiliza par indicarle al programa cuantos archivos
van a utilizar el mismo area de memoria para trabajar, os puedo
decir poco mas de ste prrafo porque yo no lo he utilizado nunca (lo
que no quiere decir que no sea til).
Ejemplo:ENVIRONMENT DIVISION.CONFIGURATION
SECTION.SOURCE-COMPUTER. RMCOBOL.OBJECT-COMPUTER.
RMCOBOL.SPECIAL-NAMES. DECIMAL-POINT IS COMMA.INPUT-OUTPUT
SECTION.FILE-CONTROL.
SELECT CLIENTES ASSIGN TO RANDOM "C:\DATOS\CLIENTES.DAT"
ORGANIZATION INDEXEDACCESS DYNAMIC RECORD KEY KEY-CLIENTE ALTERNATE
RECORD KEY-CLIENTE1 FILE STATUS STACLI.SELECT IMPRESORA ASSIGN TO
PRINT "PRINTER".
Hemos declarado el archivo CLIENTES como indexado con dos
claves, una principal KEY-CLIENTE y otra alternativa KEY-CLIENTE1 y
hemos asignado una variable para guardar los posibles cdigos de
error para cuando operemos con ste fichero STACLI. Al indicarle el
acceso dinmico le decimos que una vez dentro del programa podremos
acceder al fichero secuencialmente o bien directamente al registro
que queramos por cualquiera de las claves.
Como el fichero IMPRESORA es secuencial no es necesario ninguna
aclaracin, al darle el nombre PRINTER coger la impresora que
tengamos por defecto, si le damos cualquier otro nombre que no
identificara a ninguna impresora, el resultado sera grabar todo lo
que debera salir por la impresora en un archivo con ese nombre.
Nota final:Creo que es una de las partes ms interesantes de la
programacin cobol y que cuando he utilizado alguno de stos nuevos
lenguajes orientados a objetos y que utilizan bases de datos,
siempre he echado en falta. Para m siempre es grato dirigirme a la
Environment de cualquier programa y saber con exactitud todos los
ficheros que se van a utilizar en ese programa.Apreciar que para
cada especificacin de fichero en la Select solo se pone el punto al
final de todas las clusulas del prrafo.Al asignar la impresora, si
asignamos el nombre PRINTER, ste hace referencia a la impresora por
defecto pero tambin podramos utilizar un nombre para especificar
una impresora de red, por ejemplo, si en nuestra red existe una
impresora que esta en \\PENTIUM\HPLASER, podemos identificar un
nombre en el Autoexec.bat para asignar ese valor a una variable de
entorno como: IMPRE="\\PENTIUM\HPLASER" y luego en el programa
especificar como nombre de dispositivo de la impresora IMPRE,SELECT
IMPRESORA ASSIGN TO PRINT "IMPRE".En realidad haciendo sto ltimo
podemos asignar cualquier archivo que est en cualquier direccin de
la red, ya que el nombre que damos es lgico y su asignacin la
podemos definir con una variable de entorno donde queramos.DATA
DIVISION.
DATA DIVISION. Es la tercera divisin por orden de aparicin, y es
donde se declaran absolutamente todos los nombres de campos,
registros, variables, es decir donde nombramos cada dato que
vayamos a utilizar en nuestro programa. Para almacenar todos estos
nombres de datos, sta DIVISION se divide en varias secciones, cada
una de ellas orientada a un tipo de datos diferente. FILE SECTION.
Aqu describiremos todos los campos que componen los registros de
todos los archivos que vayamos a utilizar, que previamente habremos
declarado en la INPUT-OUTPUT SECTION dentro de la ENVIRONMENT
DIVISION.
WORKING-STORAGE SECTION. En ella declararemos todas las
variables no referentes a archivos, pero que durante la ejecucin
del programa vayamos a utilizar.
LINKAGE SECTION. Esta es la seccin donde se registrarn las
variables que nos servirn para enlazar el programa principal con el
que llamemos mediante la orden CALL.
COMMUNICATION SECTION. (No la he utilizado nunca).
SCREEN SECTION. En sta seccin podremos describir los atributos y
campos a utilizar en las pantallas.
Al igual que en la anterior DIVISION ninguna de sus partes es
obligatoria, pero si vamos a utilizar alguna variable, aunque solo
sea una, tendremos que incluirla en la WORKING-STORAGE SECTION y
esto nos obligar tambin a definir la DATA DIVISION. Pasemos a
continuacin a explicar mas a fondo cada una de ellas.FILE
SECTION.En esta seccin describiremos los campos que van a componer
el registro de cada uno de los archivos con los que vamos a
trabajar, sta sera su sintaxis: 123456789012 ABFD Nombre del
fichero. BLOCK CONTAINS Numero de registros por bloque
RECORDSBRECORD CONTAINS Numero de caracteres por registro
CHARACTERS LABEL RECORD Etiqueta de registro DATA RECORD Nombre del
registro.Vamos a explicar un poco mas detalladamente cada clusula
de la FILE SECTION. Quiero dejar claro que sta es mas amplia, pero
que como en el resto del manual voy a explicar lo que creo que es
mas importante y en definitiva lo que mas se utiliza.Clusula FD
nombre del fichero que previamente habiamos descrito en la clusula
SELECT de la INPUT-OUTPUT SECTION en la ENVIRONMENT
DIVISION.Clusula BLOCK CONTAINS cuando queremos que por cada bloque
en disco se graben mas de un registro, aqu especificamos el nmero
de ellos que va a contener cada bloque, (512, 1024), si no se
especifica se supone que cada registro va a ocupar un bloque de
memoria, o bien ser el propio compilador el que haga el clculo mas
apropiado.Clusula RECORD CONTAINS el nmero de caracteres que tiene
el registro sumando todos sus campos, puede ser fija o variable. Si
es fija utilizamos un valor y si es variable un rango desde hasta,
si no se espicifica ser el propio compilador quien la
determine.Clusula LABEL RECORD puede tener dos valores STANDARD u
OMITTED, el primer caso indica que cada vez que se accede a un
registro el compilador har las comprobaciones estandares descritas
por el propio compilador y en el segundo stas sern omitidas. Para
el caso de los ficheros de datos en disco se suele poner STANDARD y
cuando el fichero es de impresora se indica OMITTED.Clusula DATA
RECORD debido a que un mismo fichero puede tener varias
descripciones de registro, aqu indicamos los nombre de stas que
debern estar descritas a nivel 01. Normalmente no se utiliza y casi
siempre se suele utilizar una sola descripcin por fichero, por lo
que no suele aparecer en casi ningn programa.A continuacin vendra
la descripcin de todos los campos que comprenden el registro, pero
antes de ver sto es aconsejable tener claro como se define una
variable con todas sus opciones ya que a fin de cuentas, los campos
de un registro no son mas que eso, variables, con la nica condicin
de que al formar parte de un registro la informacin que contiene
nos identifica los datos que se guardarn en el medio en que est el
fichero (disco, impresora).Antes de seguir adelante quisiera decir
que siendo el cobol un lenguaje orientado casi exclusivamente al
manejo de ficheros de datos, es sin duda, sta parte que hemos visto
la mas importante. Un buen anlisis de los ficheros a utilizar antes
de empezar es fundamental y nos evitar muchos calentamientos de
cabeza, tener claro cuales van a ser sus claves tanto la principal
como las alternativas, definir bien todos sus campos y dejar
espacio libre para un posible aumento de datos. Esto lo digo porque
si creamos un fichero con 80 caracteres por registro y al cabo de
un tiempo debemos de introducir un nuevo campo que no habiamos
preveido, tendremos que modificar toda su estructura rehaciendo el
fichero y recompilando todos los programas a los que afecte, si en
cambio dejamos un poco de espacio nos evitaremos la reestructuracin
del archivo, sto se consigue utilizando el nombre de variable
FILLER como veremos un poco mas abajo. 123456789012
ABWORKING-STORAGE SECTION.LINKAGE SECTION.COMMUNICATION
SECTIONSCREEN SECTIONPara la WORKING y la LINKAGE las normas son
las mismas, asi que las veremos conjuntamente. Las otras dos
secciones, COMMUNICATION y SCREEN no las veremos en el manual.Nmero
de Nivel ...... Nombre de campo ...... PIC, VALUE, REDEFINES,
OCCURS, JUST, SIGN, SYNC.Cada campo declarado debe de llevar un
nmero de nivel que le informe al compilador del tipo de campo que
es:El nivel 01, identifica la primera entrada de un registro o la
primera entrada de un campo que se va a subdividir.El nivel 77,
identifica a una variable que no se va a subdividir y que no forma
parte de ningn registro.El nivel 88, identifica los posibles
valores condicionales de una variable previamente definida.Los
niveles 02 al 49 indicarn las distintas subdivisiones de un campo
cuya primera entrada ha sido definida a nivel 01. Los niveles 01 y
77 debern de ir siempre en el Area A (Col 8) el resto es
independiente.A continuacin pondremos el nombre del campo, que no
podr ser ninguna palabra cobol ni llevar ningn carcter extrao,
principalmente se utilizarn letras y nmeros o guiones. Es posible
que algn campo que definamos nunca vaya a ser usado por el programa
pero si en cambio es necesario que exista para que nos reserve el
espacio, le llamaremos FILLER. Y finalmente podrn venir una serie
de clusulas como:
PICTURE / PIC esta palabra es la que utilizamos para identificar
el tipo de datos que va a contener la variable. Los posible valores
son:DE CAMPOS.9 - Para campos numricos.A - Para campos alfabticos.X
- Para campos alfanumricos.S - Indica variable con signo.V - Indica
punto decimal.DE EDICIN.$ - Representa la aparicin del signo $
delante del campo numrico.. - Indica separacin de miles., - indica
punto decimal. (estas dos pueden variar segn hayamos especificado
en SPECIAL-NAMES DECIMAL-POINT IS COMMA).Z - Representa un espacio
para el 0 a la izquierda en campos numricos.* - Igual pero se
cambia el 0 por *.B - Indica un espacio en blanco.- + Indican la
aparicin del signo correspondiente. Puede haber mas pero los mas
utilizados son los que se han comentado.Para indicar la longitud
del campo se puede repetir el smbolo tantas veces como longitud
tenga o expresarla entre parntesis, es decir para definir una
variable alfanumrica de 10 caracteres se pondra:PIC X(10) o PIC
XXXXXXXXXX. Los valores S y V solo pueden aparecer una vez por cada
variable.A continuacion vamos a ver un ejemplo de todo lo que hemos
explicado para que se vaya quedando claro.123456789012
ABWORKING-STORAGE SECTION.01 DOMICILIO.02 TIPO PIC XX.02 NOMBRE PIC
X(20).02 NUMERO PIC 9(4).Fijaros que hemos definido 4 variables, la
primera no tiene PIC, por que indica que est subdividida en las 3
restantes. La segunda "TIPO" nos dice que es una variable
alfanumrica y que puede contener 2 caracteres como mximo, la
utilizariamos para guardar el tipo de calle, avenida, paseo, plaza,
etc.. Para la tercera "NOMBRE" va a ser tambin alfanumrica pero con
una longitud mxima de 20 caracteres y nos servir para guardar el
nombre de la calle, plaza, avenida, etc y la ltima "NUMERO" indica
una variable numrica de 4 dgitos, que quiere decir que puede
contener valores entre 0 y 9999.Observad que en Cobol no se guardan
las varables numricas por bytes como ocurre con todos los lenguajes
actuales sino por nmero de dgitos, con ello quizs desaprovechamos
mas la memoria pero en cambio tenemos un control mejor del dato que
puede contener nuestra variable.Si TIPO fuera "AV", NOMBRE "DE LOS
DESAMPARADOS " y NUMERO "15", si nos refiriramos a la variable
DOMICILIO sta tendra el siguiente valor:"AVDE LOS DESAMPARADOS
0015".Vamos a ver algunos ejemplos mas de variables
posibles:123456789012 ABWORKING-STORAGE SECTION.77 FECHA PIC
9(8).77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ.77 IMPORTE PIC
S9(8)V99.77IMPORTE-EDIT PIC ZZ.ZZZ.ZZZ,ZZ-.01ESTADO PIC 9. 88
SOLTERO VALUE 1. 88 CASADO VALUE 2. 88 DIVORCIADO VALUE
3.Suponiendo que el valor de FECHA es 01111998 (1 Nov de 1998) y
FECHA-EDIT es el mismo, ste ltimo se representara: 01/11/1998.Si
IMPORTE es 12815V37 en negativo e IMPORTE-EDIT el mismo, ste se
representara: 12.815,37-.
VALUE esta palabra a continuacin del PIC indica el valor inicial
que contendr la variable hasta que ste sea modificado. Por ejemplo
podemos definir una variable:123456789012 ABWORKING-STORAGE
SECTION.01 RAYA PIC X(10) VALUE "----------".01 MINOMBRE PIC X(30)
VALUE "ANDRES MONTES".Asi tendremos una variable llamada RAYA que
contiene 10 guiones y otra llamada MINOMBRE que contiene eso, mi
nombre, si os fijais con sta clusula convertimos cualquier variable
en una constante. En cualquier momento del programa podremos
cambiar ese valor. Para las variables numricas es conveniente
ponerlas siempre con VALUE 0 para que al empezar cada programa
estemos seguros de que no nos arrastra ningn valor. Normalmente al
ejecutar un programa se ponen todas las variables a 0, pero si ese
programa ha sido llamado desde otro no pasar eso, por eso no viene
mal inicializarlas todas a 0.
REDEFINES esta clusula se utiliza para dar mas de un nombre y
formato a un mismo campo. Este debe de ir a continuacin del nombre
de campo y antes del nombre del campo a que hace referencia, deben
de estar en el mismo nivel y uno a continuacin del otro en el orden
de declaraciones.123456789012 ABWORKING-STORAGE SECTION.01 DIAS PIC
X(21) VALUE "LUNMARMIEJUEVIESABDOM".01 TADIA REDEFINES DIAS. 02 DIA
PIC XXX OCCURS 7 TIMES.He incluido la clusula OCCURS para que sea
vea un ejemplo prctico, aunque todava no lo he explicado, pero como
veis a partir de ste momento DIAS y TADIA tendrn siempre el mismo
valor pero con diferente nombre y formato de datos.
OCCURS esta clusula es la que se utiliza para declarar tablas.
Una tabla es un conjunto de elementos con un mismo tipo y longitud
que se denominan con el mismo nombre y se diferencian por un
subndice. No se puede especificar en niveles 01, 77 88. Puede tener
varios formatos: 123456789012 ABWORKING-STORAGE SECTION.01
NUMERO-DIAS PIC 99.01 TABLA. 02 DIA PIC XXX OCCURS 7 TIMES. 02 MES
PIC 99 OCCURS 28 TO 31 DEPENDING NUMERO-DIAS. 02 OTRA PIC X(5)
OCCURS 5 INDEXED BY IN-OTRA.En la primera "DIA" indico que esa
tabla va a tener 7 elementos que llamaremos DIA (nn) y entre
parntesis el orden dentro de la tabla. Si hubiramos guardado en sta
tabla las 3 primeras letras de cada dia de la semana, para obtener
el valor del lunes pediriamos DIA (1), para el del Jueves DIA (4) y
para el del domingo DIA (7).En la segunda "MES" le indicamos que
los elementos de la tabla pueden variar dependiendo del valor de la
variable "NUMERO-DIAS" que ha de estar definida antes de la tabla y
siempre dentro de los mrgenes de 28 y 31.En la tercera le indicamos
adems que la variable IN-OTRA va a ser la encargada de dirigirnos
por los elementos de la tabla, sta variable no puede estar definida
antes.
JUST la justificacin de los valores de los campos suele ser a la
izda. para los alfanumricos y a la derecha para los numricos, si en
cambio queremos cambiar este orden tendremos que incluir sta
clusula. 123456789012 ABWORKING-STORAGE SECTION.01 NOMBRE PIC
X(10).01 NOMBRE1 PIC X(10) JUST RIGHT.Si le diramos el mismo valor
a las dos variables "ANDRES", la primera nos dara "ANDRES" y la
segunda "ANDRES", la diferencia, su justificacin.
USAGE con sta clusula determinamos el formato en que se guarda
el contenido de las variables (numricas, ya que las alfanumricas
siempre ocuparn un byte por cada caracter). Con todos los campos se
puede operar (obviamente) pero solo los que se definan como DISPLAY
sern editables directamente. Tiene varias posibilidades: DISPLAY,
es la forma por defecto e indica que cada dgito ocupar un byte, es
la que se toma por defecto y la que memoria ocupa.
BINARY, COMP-1, COMP-3, COMP-6, son diferentes formas de
compactacin de los datos. COMP-6 (la mas usual) guarda dos dgitos
en cada byte, COMP-3 es igual pero admite signo el cual ira en los
cuatro ltimos bites del ltimo byte. Las restantes formas se
utilizan menos.
123456789012 ABWORKING-STORAGE SECTION.01 IMPORTE PIC 9(8).
Ocupa 8 bytes uno por cada dgito.01 FECHA PIC 9(8) COMP-6. Ocupa 4
bytes, uno cada 2 dgitos.01 PRECIO PIC S9(8)V99 COMP-3. Ocupa 6
bytes, uno para los dos decimales, cuatro para la parte entera y
uno para el signo.Cuando el tamao es impar el signo no ocupa ya que
comparte byte con el ltimo dgito, el punto decimal tampoco ocupa
espacio, ya que solo indica su posicin. Estas tres formas que he
utilizado son las mas comunes, yo por ejemplo como las capacidades
de los ordenadores son tan grandes ahora, cuando defino las
variables en la WORKING nunca utilizo ninguna compactacin es decir
no utilizo la clusula USAGE (que por cierto y como habreis visto se
puede omitir) y por defecto toma DISPLAY (un byte por caracter), en
cambio cuando trabajo con campos de registro de ficheros si me
gusta compactar lo mximo para que el tamao de los archivos no se
dispare.
LINKAGE SECTION. En sta seccin se declaran las variables de
igual forma solo que las que aqu declaremos nos van a servir de
enlace para pasar informacin a otro programa que ser llamado por el
principal.
Ejemplo:DATA DIVISION.FILE SECTION.
FD CLIENTES BLOCK CONTAINS 4 RECORDSRECORD CONTAINS 128
CHARACTERSLABEL RECORD STANDARD.01 REG-CLIENTE.02 KEY-CLIENTE.r03
CLICOD rPIC 9(4) COMP-6. 02CLINOMPIC X(30). 02CLIDIR PIC
X(30).02CLIPOBPIC X(20). 02CLIPRO PIC X(20). 02CLINIF PIC X(9).
02FILLER PIC X(17).FD IMPRESORA LABEL RECORD OMITTED.01 LINEA PIC
X(132).WORKING-STORAGE SECTION.01 TABLA. 02 FILLER PIC X(12) VALUE
"LUNMARMIEJUE" . 02 FILLER PIC X(9) VALUE "VIESABDOM" .01 TABLAIDA
REDEFINES TABLA. 02 ELEDIA PIC XXX OCCURS 7 TIMES.01 FECHA PIC
9(8).01 IMPORTE PIC S9(8)V99.01 VALORES. 02 UNO PIC 99 VALUE 0. 02
DOS PIC 9(6) 02 TRES PIC 9(4)V99.01 LINPA. 02 LIMPOR PIC
ZZ.ZZZ.ZZZ,ZZ-.
Como veis he diseado el fichero CLIENTES para que cada bloque de
512 Kb, ocupe 4 registros, dejando 17 caracteres (FILLER), para una
posible ampliacin del registro.
En la descripcin del archivo IMPRESORA se declara una variable a
nivel 01 que hace referencia al total del registro para luego ir
moviendo a ste campo el valor de lo que queramos imprimir.En la
WORKING se han declarado algunos campos con distintos formatos,
fijaros en la tabla que gracias al REDEFINES hemos llenado con las
tres primeras iniciales de cada dia, asi al referirnos a la
variable ELDIA (2) su contenido ser "MAR".
Nota final:La DATA DIVISION nos sirve para tener todas nuestras
variables bien definidas, ya sean independientes o que formen parte
de algn fichero para poder operar con ellas en la PROCEDURE
DIVISION. Me acuerdo de cuando empezamos a estudiar que para otros
lenguajes no era necesaria la declaracin de variables previamente y
en cambio ahora en la mayora de los lenguajes se exige que se
declaren, eso significa que el Cobol no iba mal encaminado.Tenemos
que tener siempre muy claro que con cualquier campo podemos hacer
lo que queramos, por ejemplo si en un registro de 120 caracteres
nosotros en un programa solo vamos a utilizar los 40 primeros
podemos definir todo lo restante como un campo FILLER y listo o
viceversa si un campo de un registro lo tenemos definido como
alfanumrico de 30 en un programa necesitamos los 10 primeros
caracteres por un lado y los veinte restantes por otro, puese nada
se subdivide para ese programa y no pasa nada.Espero que haya
quedado por lo menos medio clara la explicacin de sta tercera
DIVISION, evidentemente con la prctica es con lo que mas vamos a
aprender siempre claro est que tengamos al menos unas nociones
mnimas.Tenemos que tener en cuenta que como en todos los lenguajes,
ya sean de programacin o de habla (espaol, ingls, frances) son
muchas las opciones que nos ofrecen pero al final siempre
utilizamos las que mas nos gustan o las que consideramos mas
tiles.Una cosa que considero importante es dar a las variables un
nombre un poco lgico que nos recuerde su contenido, por ejemplo si
queremos guardar la fecha, pues llamarla FECHA, si queremos guardar
el N.I.F. del gerente, NIFGEREN, etc ...PROCEDURE DIVISION.
PROCEDURE DIVISION. Bien, hemos llegado a la ltima divisin que
existe un los programas Cobol, en ella encontramos todos los
procesos necesarios para que el programa funcione, que haga para la
que fue concebido.Todo sto se realiza con instrucciones (ordenes,
verbos, comandos, etc..), como explicaremos a continuacin. Cada uno
de ellos con un formato y una solucin que resolver.Como son muchos
los verbos de que se compone el lenguaje, vamos a ver stos
divididos por grupos: De clculo, De archivos, De pantalla,
Resto.
A continuacin vamos a explicar su formato y algunas
consideraciones generales aparte de las propias
instrucciones:PROCEDURE DIVISION (USING Variable Variable
...).DECLARATIVES.Nombre-seccion SECTION.USE AFTER ERROR PROCEDURE
ON tipo.Nombre-parrafo.Sentencias......END
DECLARATIVES.Nombre-seccion
SECTION.Nombre-parrafo.Sentencias......Este sera a groso modo el
formato general de una Procedure, pero incluso se puede omitir si
en un programa no vamos a realizar ningn proceso (es obvio que
siempre lo realizaremos, pero se podra omitir). Vamos a explicar un
poco su formato:PROCEDURE DIVISION (USING Variable Variable
...).Cuando especificamos USING en la linea de PROCEDURE DIVISION,
despus deberemos de dar los nombres de variables que hayamos
definido en la LINKAGE SECTION, para compartir en el programa, lo
que nos indicar que ste ha sido llamado por otro programa y que
esas variables traern un valor procedente del programa llamador,
que a su vez utiliz la instruccin CALL con las mismas
variables.DECLARATIVES, es una seccin dentro de la PROCEDURE que
nos va a servir para controlar los posibles errores en cuanto al
manejo de ficheros se refiere. La linea de DECLARATIVES, (si se va
a utilizar) deber de ir siempre a continuacin de la linea de
PROCEDURE DIVISION. Despues de subdivira en tantas secciones como
opciones de error tengamos, stas pueden ser definidas por archivo o
bien forma de apertura, es decir podremos controlar los errores que
nos lleguen de un fichero en concreto o de todos aquellos que hayan
sido abiertos de de igual forma, sto se especifica en la linea USER
AFTER ERROR PROCEDURE ON tipo, pudiendo ser tipo, el nombre del
archivo o su modo de apertura (INPUT, OUTPUT, I-O, EXTEND). A
continuacin iran los prrafos con sus respectivas instrucciones a
realizar en caso de error.Se pondran tantos prrafos y secciones
como quisieramos controlar, siempre teniendo en cuenta que sta se
acaba cuando se indique END DECLARATIVES.Si no quisieramos utilizar
sta seccin, podriamos de igual manera controlar los errores en
nuestro programa preguntando siempre por la variable de error de
cada fichero que se defini como FILE STATUS en la
FILE-CONTROL.Nombre-seccion SECTION, a partir de aqu incluiremos
todas las instucciones necesarias para la correcta ejecucin del
programa.
Ya sabemos que Cobol es un lenguaje estructurado, pues bien no
pensemos que la Procedure va a ser un caos de instrucciones
escritas secuencialmente, no, en ella podremos definir tantas
Secciones (SECTION) y Prrafos como queramos para organizar mejor
las instrucciones y para delimitar acciones concretas, eso si
siempre se ejecutarn secuencialmente, excepto cuando encuentre algn
verbo de bifurcacin como GO, PERFORM que haciendo referencia a esos
nombres de prrafo harn que se rompa la secuencia lgica de
ejecucin.
En las comparaciones que hagamos podremos utilizar los
siguientes formatos:MAYOR QUE
[(NOT) GREATER]
[(NOT) >]
MENOR QUE
[(NOT) LESS]
[(NOT) =]
MENOR O IGUAL QUE
[LESS OR EQUAL]
[=) mayor o igual que.
LESS OR EQUAL ( 30DISPLAY SALUDO(CONTA1:1) LINE LI COL CONTA1
LOWPERFORM VARYING CONTA2 FROM 1 BY 1 UNTIL CONTA2 > 400000MOVE
' ' TO OPEND-PERFORMEND-PERFORMEND-PERFORMDISPLAY 'FINALIZADO' LINE
22ACCEPT OPSTOP RUN.PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..'
LINE 20ACCEPT NOMBRE LINE 20 COL 30 PROMPT.PIDEAPELLIDO.DISPLAY
'INTRODUZCA EL APELLIDO ..' LINE 21ACCEPT APELLIDO LINE 21 COL 30
PROMPTDISPLAY SPACES LINE 20 SIZE 70DISPLAY SPACES LINE 21 SIZE
70....
Nota: En el ejemplo como vis, despus de aceptar el nombre y el
apellido construimos una frase y la guardamos en la variablen
SALUDO utilizando el comando STRING. A continuacin y para mantener
los mismos ejemplos de toda la seccin hacemos que aparezca en
pantalla el SALUDO 5 veces, (dependiendo del valor de LI, que como
dijimos antes sera para 10, 11, 12, 13 y 14). Pero ahora hemos
intercalado dos PERFORM dentro de ste, el primero para que nos
muestre el mensaje letra a letra y el segundo para hacer de retardo
y as conseguir un efecto como si escribiramos el SALUDO con una
mquina de escribir.Como pdeis observar el nico punto de toda la
secuencia se haya en el STOP RUN. El hecho de mantener los mrgenes
izquierdos, es para dar mas claridad a la programacin y conseguir
que sta sea lo mas estructurada posible.
AUN HAY MASPues s, podemos desarrollar an mas la instruccin
incluyendo dos nuevos elementos. EJECUTANDO ANTES O DESPUESEn
primer lugar, por defecto el contenido del PERFORM se ejecuta
despus de hacer la comprobacin de la condicin que precede a UNTIL,
pero podemos hacer que sta se realice antes. PERFORM WITH TEST
[AFTER - BEFORE ] VARYING variableFROM nmero, variable BY nmero,
valor UNTIL condicinsentenciasEND-PERFORMCon la opcin TEST BEFORE,
que es la opcin por defecto se comprueba primero la condicin y si
se cumple se ejcuta el resto, con lo cual es posible que las
sentencias no se ejecuten ninguna vez, si al comenzar ya est rota
la condicin.Con la opcin TEST AFTER, se ejecutan las sentencias
antes de comprobar la condicin, con lo cual las sentencias se van a
ejecutar al menos en una ocasin, incluso aunque entremos en el
PERFORM con la condicin rota.AUMENTANDO LAS
CONDICIONESEfectivamente adems de la primera condicin podemos
incrementar el nmero de condiciones para que se cumplan los
requisitos y as ejecutar las sentencias. Esto lo conseguimos
incluyendo mas clusulas precedidas de AFTER.PERFORM WITH TEST
[AFTER - BEFORE ] VARYING variableFROM nmero, variable BY nmero,
valor UNTIL condicinAFTER variableFROM nmero, variable BY nmero,
valor UNTIL condicinsentenciasAFTER .......END-PERFORMAl aplicar
este formato cuando se cumpla la primera condicin pasar el control
al AFTER y comprobar de nuevo la condicin que precede al siguiente
UNTIL segn los valores especificados en la lnea que contiene AFTER.
Adems podemos ir incrementando el nmero de condiciones a nuestro
antojo, consiguiendo de ste modo hacer unos anidamientos y un
desarrollo mas completo de la sentencia, obteniendo por
consiguiente unos niveles de perfeccionamiento muy altos.
RESUMIENDO Una mayor utilizacin de PERFORM sin duda traer un uso
menor de la declaracin GO y con ello conseguimos una programacin
estructurada. Las ventajas de la programacin estructurada las
quiero explicar en un apartado dentro de sta misma seccin de
Manuales, una vez explique las sentenicas GO e IF, que sern la
siguiente aportacin al manual.En esa nueva seccin se ver un caso
mas prctico y real de utilizacin de PERFORM con uso de lecturas de
ficheros y dems experiencias cotidianas en el mundo de la
programacin en el mbito de la gestin.
CODIGOS DE ERROR
Son muchos los errores que se pueden producir en tiempo de
ejecucin cuando trabajamos con archivos, a continuacin dar una
explicacin de los mas comunes. Todos stos errores los podemos
obtener si definimos FILE STATUS en la FILE-CONTROL, y actuar
consecuentemente, por ejemplo yo siempre cuando abro los ficheros
al principio de cada programa compruebo que el error sea 00, es
decir que todo est bien para continuar, sino automaticamente saco
una ventanita con el error que se ha producido y el nombre del
fichero para que mis usuarios me lo comuniquen y poder
solucionarlo, pero no dejo que se siga ejecutando el programa, con
lo que se evitarn problemas posteriores que podran resultar peores.
De todas formas una vez que est el programa verificado y
comprobado, y que todos los archivos se corresponden con su
descripcin en la FD, los errores que nos puede dar son los
relativos a claves duplicadas o inexistentes, o a errores del
sistema.Los errores se representan como 2 digitos para el error que
pueden ir seguidos de una coma y otros 2 dgitos para indicar la
naturaleza del error.ERROREXPLICACION
00Operacin satisfactoria, todo bien.
10Cuando se ha llegado al final del fichero y se quiere seguir
leyendo.
22Se intenta copiar un registro con una clave ya existente.
23Cuando se hace un acceso directo a un registro
inexistente.
24No hay espacio en disco para realizar la operacin.
30Es un error grave de entrada/salida, suele ser ajeno a Cobol y
mas concreto en cuanto a configuracin del sistema operativo sobre
el que se est ejecutando, para solucionarlo deberemos prestar
atencin a los dos dgitos seguientes al error.
34Igual que el 24 por falta de espacio en disco.
35El archivo al que hace referencia no existe.
39La organizacin del fichero que se quiere abrir no coincide con
su organizacin real interna. Suele pasar cuando se modifica una FD
y el fichero continua siendo el mismo.
41Cuando intentamos abrir un archivo que ya est abierto.
42Si intentamos cerrar un archivo que no esta abierto.
43Cuando se quiere borrar o reescribir un registro en un fichero
abierto con acceso secuencial.
47Se quiere realizar alguna operacin que no corresponde con el
modo de acceder al fichero. Si queremos hacer un READ o un START en
un archivo que no ha sido abierto como INPUT o como I-O.
48Igual que el anterior, pero para el caso de querer escribir en
un fichero que no esta abierto o no est abierto como I-O, OUTPUT o
EXTEND.
49Cuando queremos borrar o reescribir en un fichero que no ha
sido abierto como I-O o el fichero no est abierto.
90Cuando COBOL recibe un mensaje irreconocible, suele estar
ocasionado por incompatibilidad entre los accesos a los ficheros,
su forma de apertura y su modo de acceso.
91Igual que el 42.
92Cuando intentamos leer, escribir, borrar, reescribir sobre un
archivo no abierto.
93El archivo est en conflicto con otro usuario.
94Igual que el 39, tiene muchisimas vertientes dependiendo de
los dos digitos siguientes que acompaan al error.
98Echate a temblar (perdonad por la expresin), grave error
interno en la estructura del fichero, generalmente se suelen
provocar cuando hay un corte electrico o una salida brusca del
programa y algn fichero indexado se ha quedado abierto, lo que
suele ocurrir es problema de correspondencia entre claves y datos,
se recomienda hacerle un recovery (RM/COBOL) o el que corresponda a
cada compilador para rehacer las claves. Si despus de todo sigue
dando errores .......?En algunos casos, es posible que ste error se
deba a un problema fsico del disco, en ese caso tambin ser
conveniente copiarlo en otro sitio "fsico".
99Al borrar, leer o reescribir un registro que est siendo
bloqueado por otro usuario.
A pesar de todos stos errores con algunos de ellos podriamos
seguir trabajando, pero siempre es mejor corregirlos antes de que
pasen a mayores.Para evitar bloqueos en los registros cuando
trabajamos con varios usuarios accediendo a los mismos registros,
es convenientoe tener en cuenta los modos de apertura de los
ficheros, ya que abrindolos en INPUT nunca habr problema de
bloqueo.VENTANAS EN COBOL
Que son y para que sirven las "ventanas" en cobol ?.Este nombre
del que estamos tan acostumbrados a oir y que parece que es
propiedad de Microsoft, tiene otras y muy diversas utilidades. Una
ventana es en realidad una porcin virtual de la pantalla, la cual
podremos definir con unas caractersticas propias de tamao, color,
etc ...Hasta que stas aparecieron, cada vez que queriamos
sobreponer una informacin a la que tenamos en pantalla, la
construiamos encima y despus, debiamos de volver a pintar la que
estuviera debajo. Con el uso de las ventanas sto ya no es
necesario. Os pondr un ejemplo:Supongamos que tenemos un
mantenimiento de clientes, el cual nos ocupa toda la pantalla, y
vamos a introducir la provincia. Si en ste momento quisieramos
mostrarle una tabla con todas las opciones posibles, era necesario
dibujarla encima y una vez seleccionada la provincia adecuada,
volver a pintar la pantalla de mantenimiento que habamos dejado
debajo. Pues bien con el uso de las ventanas, sto ya no es
necesario, porque lo que hacemos es crear una ventana (una pantalla
virtual) de las dimensiones que queramos, trabajamos todo lo que
queramos con ella y cuando no nos haga falta, la cerramos y lo que
haba debajo en la pantalla "principal" quedar como estaba. Espero
que me hayais entendido, para poder seguir explicando su
utilizacin.Yo conozco el uso en Acucobol y RM/Cobol, por lo que la
explicacin ir orientada a stos dos compiladores, si alguien conoce
la de otros, le animo a que me facilite la explicacin. Debemos de
tener en cuenta que aunque la sintaxis sea diferente en cada uno de
los compiladores, la funcionalidad, el uso y la idea, son las
mismas. Antes de pasar a la explicacin tendremos que tener en
cuenta: Podremos tener tantas ventanas abiertas como queramos.
El control siempre estar sobre la ventana activa, no podremos
trabajar desde una ventana en otra.
La linea 1 y la columna 1 correspondern a la esquina superior
izquierda de la ventana y no a la de la pantalla.
Las caractersticas de la ventana se darn en el momento de su
creacin y sern, ttulo, posicin del ttulo, borde, color, tamao, etc
....
VENTANAS EN RM/COBOL.En RM/Cobol, todas las caractersticas se
dan mediante unas variables definidas en la WORKING, stas son las
siguientes. Por supuesto le puedes poner el nombre que quieras a
las variables, ya que lo que al final vamos a conseguir es darle
una variable con longitud 80 y una sentencia para que la ventana se
dibuje.01 WCB. 03 WINCAB PIC 999 BINARY VALUE 0. 03 WINLIN PIC 999
BINARY. 03 WINCOL PIC 999 BINARY. 03 WINLOC PIC X VALUE "S".* (S-W)
03 WINBORST PIC X VALUE "Y". * (Y-N) 03 WINBORTI PIC 9 VALUE 2. 03
WINBORCH PIC X. 03 WINLLE PIC X. * (Y-N) 03 WINLLECH PIC X. 03
WINTITSI PIC X VALUE "T".* (T-B) 03 WINTITPO PIC X VALUE "C".*
(C-L-R) 03 WINTITLO PIC 999 BINARY. 03 WINTIT PIC X(64).
Explicacin de las variables: (de las importantes).
WCB: Aqu se guardar toda la informacin para luego dibujar la
ventana, podeis ponerle el nombre que querais, tanto a sta como al
resto.WINLIN: Nmero de lineas que va a tener la ventana.WINCOL:
Nmero de columnas que va a tener la ventana.WINBORST: (Y)ES (N)O,
si va a tener o no, borde.WINBORTI: Tipo de borde, hay cuatro tipos
distintos.WINTITSI: (T)OP (B)UTTON, posicin del ttulo, arriba o
abajo.WINTITPO: (C)ENTER (L)EFT (R)IGHT, justificacin del
ttulo.WINTITLO: Longitud en caracteres del ttulo.WINTIT: Ttulo de
la ventana.
La sentencia que utilizamos para crearla es DISPLAY, pero con
unos matices distintos como vamos a ver a continuacin.Primero
moveramos los valores adecuados a las variables y luego la
sentencia, veamos como quedara: MOVE 10 TO WINLIN. MOVE 40 TO
WINCOL. MOVE " PROBANDO VENTANAS " TO WINTIT. MOVE 19 TO WINTITLO.
DISPLAY WCB LINE 3 COL 3 LOW ERASE CONTROL "WINDOW-CREATE".
* asi creariamos la ventana, los otros valores de las variables
se* pueden asignar con values, porque normalmente no cambian.* A
partir de ste momento, todo lo que hagamos, se har sobre* sta
ventana. Para cerrarla utilizariamos sta sentencia. DISPLAY WCB
CONTROL "WINDOW-REMOVE".
Si quisieramos abrir mas ventanas, en vez de displayar
directamente la variable WCB, sta la guardariamos en una tabla por
ejemplo: WORKING-STORAGE SECTION. 01 VENTANAS. 02 WIN PIC X(80)
OCCURS 10 TIMES. ... ... PROCEDURE DIVISION. ... ... MOVE 10 TO
WINLIN. MOVE 40 TO WINCOL. MOVE " PROBANDO VENTANAS " TO WINTIT.
MOVE 19 TO WINTITLO. MOVE WCB TO WIN (1). DISPLAY WIN (1) LINE 3
COL 3 LOW ERASE CONTROL "WINDOW-CREATE". MOVE 1 TO WINLIN. MOVE 30
TO WINCOL. MOVE SPACES TO WINTIT MOVE 0 TO WINTITLO. MOVE WCB TO
WIN (2). DISPLAY WIN (2) LINE 5 COL 10 LOW ERASE CONTROL
"WINDOW-CREATE".
* Cuando usamos mas de una ventana, deberemos de ir* cerrndolas
segn la ltima que se abri. DISPLAY WIN (2) CONTROL "WINDOW-REMOVE".
DISPLAY WIN (1) CONTROL "WINDOW-REMOVE".
VENTANAS EN ACUCOBOL.Para dibujar una ventana en Acucobol, todo
se realizar desde la Procedure y solo ser necesario incluir en la
WORKING una variable de PIC X(10), que nos servir principalmente
para tener varias ventanas abiertas y saber sobre cual actuamos.
Esto se consigue con una implementacin de la sentencia DISPLAY, que
vamos a explicar a continuacin. WORKING-STORAGE SECTION. 01
VENTANAS. 02 WIN PIC X(10) OCCURS 10 TIMES. ... ... PROCEDURE
DIVISION. ... ... DISPLAY WINDOW LINE 3 COL 3 LOW ERASE SIZE 40
LINES 10 BOXED SHADOW TOP CENTERED TITLE " PROBANDO " POP-UP AREA
WIN (1).
* Para cerrarla, utilizaremos la siguiente instruccin. CLOSE
WINDOW WIN (1).
Aqui, la gran diferencia, es que al no utilizar variables, los
valores se le dan en la propia sentencia, y la explicacin de cada
uno sera:SIZE: Nmero de columnas de la ventana.LINES: Nmero de
lneas de la ventana.BOXED: Indicamos que lleva borde.SHADOW:
Indicamos que lleva efecto de sombra.TOP: Posicin del ttulo.
(TOP-BOTTOM)CENTERED: Justificacin del ttulo. (CENTERED, LEFT,
RIGHT).POP-UP AREA: donde se guarda la ventana.
La sentencia DISPLAY WINDOW, en Acucobol, es mucho mas extensa,
incluyendo sobre todo una muy buena aplicacin de los colores, tanto
para el fondo como para el primer plano.
RESUMIENDOYa veis, que aunque cambie un poco la sintaxis, el fin
es exactamente el mismo, disponer de una parte de la pantalla con
autonoma propia.Solo espero que despus de stas explicaciones seais
capaces de aprovechar todas las ventajas que nos puede proporcionar
el trabajar con ventanas. Yo siempre las he utilizado, eso si,
tampoco deberemos de hacer de un programa cobol, una serie de
ventanas, hay que utilizarlas cuando realmente las necesitemos.
Recordad que:El control solo ser sobre la ventana activa.Una vez
abierta una ventana, sta tendr el control, hasta que se cierre.Por
supuesto, todas la variables que utilicemos sern portables entre
ventanas, ya que en realidad estaremos en el mismo
programa.PALABRAS RESERVADAS
Las palabras reservadas del Cobol, son aquellas que el propio
compilador utiliza y por lo tanto no podemos utilizar como
variables en nuestros programas. Estas han ido avanzando con el
paso de los tiempos y cada compilador incluso, incluyendo nuevas.
Aqu voy a poner una lista de la cantidad mayor que pueda.SELECCIONA
LA LETRA, PARA IR DIRECTAMENTE O AVANZA POR LA PAGINA
ABCDEFGHIJKLMNOPQRSTUVWZOtras
A
ACCEPTACCESSADD
ADDRESSADVANCINGAFTER
ALLALPHABETALPHABETIC
ALPHABETIC-LOWERALPHABETIC-UPPERAPHANUMERIC
ALPHANUMERIC-EDITEDALSOALTER
ALTERNATEANDANY
APPLYAREAREA
AREASASCENDINGASSIGN
ATAUTHORAUTO
AUTO-SKIPAUTOMATICAUTOTERMINATE
B
BACKGROUNDBACKGROUND-COLORBACKGROUND-HIGH
BACKGROUND-LOWBACKWARDBEEP
BEFOREBELLBIND
BINARYBLANKBLINK
BLINKINGBLOCKBOLD
BOTTOMBY
C
CALLCANCELCD
CFCHCHARACTER
CHARACTERSCLASSCLOSE
COBOLCODECODE-SET
COLCOLLATINGCOLUMN
COMMACOMMUNICATIONCOMP
COMP-1COMP-2COMP-3
COMP-4COMP-6COMPUTATIONAL
COMPUTATIONAL-1COMPUTATIONAL-2COMPUTATIONAL-3
COMPUTATIONAL-4COMPUTECONFIGURATION
CONSOLECONTAINSCONTENT
CONTINUECONTROLCONTROLS
CONVERSIONCONVERTCONVERTING
COPYCORRCORRESPONDING
COUNTCRTCURRENCY
CURSOR
D
DATADATEDATE-COMPILED
DATE-WRITTENDAYDAY-OF-WEEK
DEDEBUGDEBUGGING
DECIMAL-POINTDECLARATIVESDEFAULT
DELETEDELIMITEDDELIMITER
DEPENDINGDESCENDINGDESTINATION
DETAILDISABLEDISPLAY
DIVIDEDIVISIONDRAWN
DUPLICATESDYNAMIC
E
ECHOEGIELSE
EMIEMPTY-CHECKENABLED
ENDEND-ACCEPTEND-ADD
END-CALLEND-COMPUTEEND-DELETE
END-DIVIDEEND-EVALUATEQEND-IF
END-MULTIPLYEND-OF-PAGEEND-PERFORM
END-READEND-RECEIVEEND-RETURN
END-REWRITEEND-SEARCHEND-START
END-STRINGEND-SUBTRACTEND-UNSTRING
END-WRITEENTERENVIRONMENT
EOLEOPEOS
EQUALERASEERROR
ESCAPEESIEVALUATE
EVERYEXCEPTIONEXCLUSIVE
EXITEXTENDEXTERNAL
F
FALSEFDFILE
FILE-CONTROLFILE-IDFILE-PREFIX
FILLERFINALFIRST
FOOTINGFORFOREGROUND-COLOR
FOREGROUND-COLOURFROMFULL
G
GENERATEGIVINGGLOBAL
GOGOBACKGREATER
GRIDGROUP
H
HEADINGHIGHHIGH-BALUE
HIGH-VALUESHIGHLIGHT
I
I-OI-O CONTROLIDENTIFICATION
IFININDEX
INDEXEDINDICATEINITIAL
INITIALIZEINPUTINPUT-OUTPUT
INSPECTINSTALLATIONINTO
INVALIDIS
J
JUSTJUSTIFIED
K
KEY
L
LABELLASTLEADING
LEFTLEFTLINELENGTH
LENGTH-CHECKLESSLIMIT
LIMITSLINAGELINGAKE-COUNTER
LINESLINKAGELOCK
LOCK-HOLDINGLOWLOW-VALUE
LOW-VALUESLOWLIGHT
M
MEMORYMERGEMODE
MODULESMOVEMULTIPLE
MULTIPLY
N
NATIVENEGATIVENEXT
NONO-ECHONOT
NUMBERNUMERICNUMERIC-EDITED
O
OBJECT-COMPUTEROCCURSOF
OFFOMITTEDON
OPENOPTIONALOR
ORDERORGANIZATIONOTHER
OTHERSOUTPUTOVERFLOW
OVERLINE
P
PACKED-DECIMALPADDINGPGE
PAGE-COUNTERPERFORMPIC
PICTUREPLUSPOINTER
POSPOSITIONPOSITIVE
PREVIOUSPRINT-CONTROLPRINTING
PROCEDUREPROCEDURESPROCEED
PROGRAMPROGRAM-IDPROMPT
PROTECTEDPURGE
Q
QUEUEQUOTEQUOTES
R
RANDOMRDREAD
READERSRECEIVERECORD
RECORDINGRECORDSREDEFINES
REELREFERENCEREFERENCES
RELATIVERELEASEREMAINDER
REMOVALRENAMESREPLACE
REPLACINGREQUIREDREPORT
REPORTINGREPORTSRERUN
RESERVERETURNRETUNRNIN
RETURN-CODERETURN-UNSIGNEDREVERSE
REVERSE-VIDEOREVERSEDREWIND
REWRITERFRH
RIGHTROLLBACKRUN
S
SAMESCREENSD
SEARCHSECTIONSECURE
SECURITYSEGMENTSEGMENT-LIMIT
SELECTSENDSENTENCE
SEPARATESEQUENCESEQUENTIAL
SETSIGNSIZE
SORTSORT-MERGESOURCE
SOURCE-COMPUTERSPACESPACES
SPECIAL-NAMESSTANDARDSTART
STATUSSTOPSTRING
SUBTRACTSUPPRESSSYMBOLIC
SYNCSYCHRONIZED
T
TABTALLYNGTAPE
TERMINALTERMINATETEST
TEXTTHANTHEN
THROUGHTHRUTIME
TIMESTOTOP
TRAILINGTRUE
U
UNDERLINEUNDERLINEDUNIT
UNLOCKUNSTRINGUNTIL
UPUPDATEUPDATES
UPONUSAGEUSE
USING
V
VALUEVALUESVARYING
W
WHENWITHWORDS
WORKING-STORAGEWRITEWRITERS
Z
ZEROZEROSZEROES
Adems de todas stas palabras, cada compilador ha ido
incorporando nuevas a su lista, debido principalmente a la
incorporacin de aspectos destinados a la programacin grfica. Entre
ellos podemos citar algunos de los nuevos incorporados por
Acucobol:ATTRIBUTEAUTO-MINIMIZEAUTO-RESIZE
BOXBOXEDCCOL
CELLCELLSCENTERED
COLORCOLOURCSIZE
CYCLEDESTROYDOUBLE
DOWNENCRYPTIONEND-DISPLAY
EVENTFEXTERNAL-FORMFILE-PREFIX
FLOATFLOATINGFONT
GRAPHICALHANDLEHEIGHT
HELP-IDICONID
IDENTIFIEDINQUIRELINK
LOWERMANUALMENU
MESSAGEMODALMODELESS
MODIFYNULLNULL
OBJECTONLYOVERLAPPED
PARAGRAPHPOP-UPPRIORITY
PROPERTYRESIZABLESCROLL
SHADOWSTYLESYSTEM
SYSTEM-INFOTABLETERMINAL-INFO
THREADTITLETITLE-BAR
TOOL-BARTRANSACTIONUPPER
VISIBLEWAITWIDTH
WINDOWWRAP
Disculpad, por si alguna se me ha olvidado.CLASIFICANDO CON
SORT
La clasificacin, no cabe duda que es una opcin muy interesante
en segn que programas o aplicaciones. El uso de tener varias claves
alternadas sobre todo de nuestros archivos histricos nos evita
tener que hacerlo muy a menudo, pero sobre todo con el uso de los
ficheros maestros, es muy comn el desar clasificar por cualquiera
de los campos de los que dispone el fichero.Para realizar estas
clasificaciones, nuestro Cobol tambin dispone de lo suficiente.
Podemos clasificar por todos los campos que deseemos, as como
escoger el orden que queramos para cada uno de ellos. Todo esto
queda englobado en la sentencia SORT, pero esta depende de muchas
mas cosas.No voy a explicar a fondo todo el funcionamiento de SORT,
entre otras cosas, porque yo mismo no lo utilizo mucho, pero
empezemos a despejar dudas.Lo primero que necesitamos es un archivo
sobre el que volcar nuestra clasificacin y que adems utilizar el
propio SORT para hacer las clasificaciones. Este fichero se define
en la FILE-CONTROL como cualquier otro fichero solo que haciendo
ver al compilador que se va a tratar de un archivo SORT y
acontinuacin se define su estructura en la FILE SECTION. Para el
ejemplo nos basaremos en el fichero de la Agenda que hemos visto en
la seccin Programando. El fichero de clasificacin se llamar ORDEN y
solo contendr los campos por los que deseemos
clasificar.ENVIRONMENT DIVISION.INPUT-OUTPUT
SECTION.FILE-CONTROL.SELECT AGENDA ASSIGN TO RANDOM
"AGENDA.DAT"ORGANIZATION INDEXED ACCESS DYNAMICRECORD KEY
KEYAGE.SELECT ORDEN ASSIGN TO SORT.DATA DIVISION.FILE SECTION.FD
AGENDA LABEL RECORD STANDARD.01 REGAGE.02 KEYAGE.03 AGECOD PIC
9(4).02 AGENOM PIC X(30).02 AGEDOM PIC X(30).02 AGEPOS PIC 9(5).02
AGEPOB PIC X(20).02 AGEPRO PIC X(15).02 AGETEL PIC X(20).02 AGEMOV
PIC X(20).02 AGEMAI PIC X(30).02 AGEWEB PIC X(40).SD ORDEN.01
REGORD.02 ORDNOM PIC X(30).02 ORDPOB PIC X(30).02 ORDPRO PIC
X(30).
Notad que hemos sustituido FD (File Descrition) por SD (Sort
Description) para nuestro fichero de clasificacin y que solo hemos
incluido en ste fichero tres campos, los que nosotros hemos
escogido para hacer las clasificaciones. Este archivo puede tener
todos los campos que se desee, incluso otros que no estn en el
fichero a clasificar. Adems el orden en que figuren no tiene
importancia ni significa nada a la hora de clasificar. Con la SD
solo indicamos los campos que va a tener el fichero.A partir de
aqu, nuestro programa puede continuar normalmente hasta llegar al
momento en que deseemos clasificar y para ello vamos a ver un poco
como es la sintaxis de una sentencia SORT. Formato 1: Este formato
se utiliza para clasificar un archivo y guardar el contenido del
fichero clasificado en otro archivo. Esta opcin no se suele
utilizar ya que tiene pocas posibilidades. Tendramos un fichero en
el que se basara SORT para clasificar, un fichero maestro del que
leeriamos para clasificar y el resultado lo guardara en otro
fichero.SORT fichero_de_clasificacion (ON ASCENDING KEY) campo(ON
DESCENDING KEY) campoUSING fichero a clasificarGIVING fichero que
quedar clasificadoFormato 2: Este formato es mas utilizado ya que
el control de la clasificacin lo hacemos nosotros tanto antes como
despus.SORT fichero_de_clasificacion (ON ASCENDING KEY) campo(ON
DESCENDING KEY) campoINPUT PROCEDURE que_hacemos antesOUTPUT
PROCEDURE que hacemos despues Fichero_de_clasificacion: hace
referencia al fichero que hemos definido como SORT.
campo: hace referencia a cualquiera de los campos de dicho
fichero que hemos definido, podremos poner tantos como deseemos y
en el orden que queramos.
que hacemos antes: indica el proceso que obligaremos al
compilador a realizar antes de clasificar. Podemos indicar varios
parrafos como hariamos con un PERFORM indicando THRU o bien
utilizar una SECTION.
que hacemos despues: indicaremos que hacer una vez el fichero
est clasificado. Igual que antes podremos indicar un prrafo o
varios o utilizar una SECTION.
Veamos a continuacin un ejemplo con nuestro
programa.WORKING-STORAGE SECTION.01 LINEA.02 LNOM PIC X(30)BB.02
LPOB PIC X(20)BB.02 LPRO PIC X(12).01 OP PIC X....PROCEDURE
DIVISION.INICIO.SORT ORDENON ASCENDING ORDPOBON DESCENDING
ORDNOMINPUT PROCEDURE CARGAROUTPUT PROCEDURE SALIDA.STOP RUN.
CARGAR SECTION.INI-CAR.OPEN INPUT AGENDA.LEER.READ AGENDA NEXT
RECORD AT END GO FIN-CAR.MOVE AGENOM TO ORDNOM.MOVE AGEPOB TO
ORDPOB.MOVE AGEPRO TO ORDPRO.RELEASE REGORD.GO LEER.FIN-CAR.CLOSE
AGENDA.EXIT.SALIDA SECTION.INI-SAL.RETURN ORDEN AT END GO
FIN-SAL.MOVE ORDNOM TO LNOM.MOVE ORDPOB TO LPOB.MOVE ORDPRO TO
LPRO.DISPLAY LINEA LINE 20.ACCEPT OP LINE 21.GO
INI-SAL.FIN-SAL.EXIT.
Antes de seguir, habris notado que se han incluido dos nuevas
sentencias, RELEASE y RETURN. Bien, estas instrucciones son las que
utiliza Cobol para grabar y leer en los ficheros de SORT. El
funcionamiento es el mismo, es decir RELEASE, lo que hace es
introducir los datos en el fichero y RETURN los extrae. Adems si os
habis dado cuenta, el fichero de clasificacin no es necesario
abrirlo ni cerrarlo. En este caso hemos clasificado ascendentemente
por poblacion y a su vez descendientemente por nombre. Podramos
haber utilizado cualquier otra forma o haber clasificado por los
tres campos o solo por uno.En la seccin dedicada a la INPUT
PROCEDURE, simplemente hemos cargado el fichero de clasificacin,
pero a la vez podramos haber discriminado registros del maestro y
haber creado otros campos nuevos para clasificar. Aunque si bien es
lo mas lgico a realizar.En la seccin dedicada a la OUTPUT
PROCEDURE, lo que hacemos es sacar por pantalla apoyndonos en la
variable LINEA, el contenido del fichero una vez clasificado, pero
igualmente podramos haber hecho cualquier cosa. Tened en cuenta que
una vez aqu nuestro fichero ORDEN queda clasificado y por lo tanto
podemos hacer lo que deseemos.TABLAS
El uso de tablas en Cobol es algo muy frecuente y por eso he
decidido crear un apartado especfico para hablar de ellas. En la
seccin Data Division, dentro de manuales, podris encontrar una
explicacin de cada comando o clusula que veamos de aqu en
adelante.En primer lugar daremos una definicin de ellas. Una tabla
es un conjunto de elementos con un mismo tipo y longitud que se
denominan con el mismo nombre y se diferencian por un subndice.
Todo lo que voy a explicar aqu, se har desde lo ms bsico. Con un
ejemplo lo vamos a ver mas claro:Imaginaros que queremos tener la
informacin de cuantas personas entran a un museo cada da de la
semana. Si como mximo entran al da mas o menos 1.000 personas
deberamos declarar siete variables de la siguiente manera:01
LUNES01 MARTES01 MIERCOLES01 JUEVES01 VIERNES01 SABADO 01
DOMINGOPIC 9(4).PIC 9(4).PIC 9(4).PIC 9(4).PIC 9(4).PIC 9(4).PIC
9(4).
Para introducir datos aqu podramos hacer:MOVE 200 TO LUNES.MOVE
430 TO MARTES.MOVE 136 TO MIERCOLES.MOVE 525 TO JUEVES.MOVE 380 TO
VIERNES.MOVE 1910 TO SABADO.MOVE 2300 TO DOMINGO.Fijaros que todas
son del mismo tipo (numricas) y del mismo tamao (4), por lo tanto
cumplen el requisito para crear una tabla, as que vamos a sustituir
todo lo anterior haciendo uso de una tabla.01 DIASEMANA.02
VISITASPIC 9(4) OCCURS 7 TIMES.
Ahora tendremos una nica variable donde guardar los datos y se
llamar VISITAS. Para introducir los datos lo haramos refirindonos
con un subndice a cada uno de sus elementos, siete en este caso,
porque siete son los das de la semana. Lo ms lgico ser respetar el
orden de los das, es decir 1 para el Lunes, 2 para el Martes, etc
...MOVE 200 TO VISITAS (1).MOVE 430 TO VISITAS (2).MOVE 136 TO
VISITAS (3).MOVE 525 TO VISITAS (4).MOVE 380 TO VISITAS (5).MOVE
1910 TO VISITAS (6)MOVE 2300 TO VISITAS (7).El resultado es el
mismo, pero solo hemos tenido que declarar una variable. Por
supuesto el nmero que hace referencia al subndice puede ser a su
vez una variable, como veremos un poco mas abajo.Cobol tambin posee
la capacidad de crear una tabla y rellenarla a su vez utilizando la
WORKING-STORAGE SECTION. Para ello primero declaramos los valores
en una variable y gracias a la clusula REDEFINES, hacemos que su
valor se cargue en la tabla. Eso no quiere decir que su valor no se
pueda cambiar, pero al iniciar el programa, la tabla contendr esos
valores. Para seguir con el ejemplo crearemos una con los das de la
semana.01 TABLADIAS.02 FILLER02 FILLER02 FILLER02 FILLER02 FILLER02
FILLER02 FILLER01 TABLADEDIAS02 ELDIAPIC X(10) VALUE "LUNES ".PIC
X(10) VALUE "MARTES ".PIC X(10) VALUE "MIERCOLES ".PIC X(10) VALUE
"JUEVES ".PIC X(10) VALUE "VIERNES ".PIC X(10) VALUE "SABADO ".PIC
X(10) VALUE "DOMINGO ".REDEFINES TABLADIAS.PIC X(10) OCCURS 7
TIMES.
Ya tenemos cargada la tabla con los das de la semana respetando
tambin el orden que hemos indicado anteriormente.Ahora mostraremos
las visitas de cada da utilizando las tablas y refirindonos a los
elementos de la tabla con valores variables. Vamos a pedir que nos
diga el da de la semana para el cual quiere saber las visitas que
hubo:WORKING-STORAGE SECTION.01 DIA PIC 9.01 LVISITAS PIC
Z.ZZ9....PROCEDURE DIVISION....PEDIR.DISPLAY "INTRODUZCA DIA PARA
VER SUS VISITAS"LINE 4 COL 20.ACCEPT DIA LINE 4 COL 50 PROMPT
LOW.IF DIA < 1 OR DIA > 7 GO PEDIR.DISPLAY "EL " LINE 10 COL
20.DISPLAY ELDIA (DIA) LINE 10 COL 23.DISPLAY "HUBO " LINE 10 COL
33.MOVE VISITAS (DIA) TO LVISITAS.DISPLAY LVISITAS LINE 10 COL
38.DISPLAY "VISITAS." LINE 10 COL 44.
Al introducir, por ejemplo el valor 3 el resultado hubiera
sido:EL MIERCOLES HUBO 136 VISITAS.
VARIAS DIMENSIONES O NIVELESTodas las tablas que hemos visto son
de una dimensin, pero se pueden definir demas niveles y
convertirlas en matrices. Por ejemplo ahora vamos a diferenciar en
la tabla, adems del nmero de visitas, si han sido hombres o
mujeres, para ello creamos una nueva dimensin quedando la tabla de
la siguiente manera:01 DIASEMANA.02 GENERO03 VISITASOCCURS 2
TIMES.PIC 9(4) OCCURS 7 TIMES.
Como veis nuestra tabla contiene dos clusulas OCCURS, con ello
hemos conseguido crear una matriz de 2 x 7, ahora la variable
VISITAS tendr 14 elementos. Para dirigirnos a ellos utilizaremos
dos subndices. En nuestro caso al diferenciar el gnero,
identificaremos con el valor 1 a los hombres y con el 2 a las
mujeres. Veamos como rellenamos la tabla ahora:MOVE 110 TO VISITAS
(1, 1) MOVE 90 TO VISITAS (2, 1).MOVE 130 TO VISITAS (1, 2) MOVE
300 TO VISITAS (2, 2).MOVE 100 TO VISITAS (1, 3) MOVE 36 TO VISITAS
(2, 3).MOVE 250 TO VISITAS (1, 4) MOVE 225 TO VISITAS (2, 4).MOVE
190 TO VISITAS (1, 5) MOVE 190 TO VISITAS (2, 5).MOVE 1000 TO
VISITAS (1, 6) MOVE 910 TO VISITAS (2, 6).MOVE 1100 TO VISITAS (1,
7) MOVE 1200 TO VISITAS (2, 7).Por supuesto al igual que antes los
subndices pueden ser sustituidos por variables. Por ejemplo,
sabiendo los datos anteriores vamos a sumar todas las mujeres que
entraron en la semana y todos los hombres y vamos a averiguar cual
fue el da de mayor visitas y el da de menor
asistencia.WORKING-STORAGE SECTION.01 DIA PIC 9.01 LVISITAS PIC
Z.ZZ9.01 MAYOR PIC 9(4) VALUE 0.01 MENOR PIC 9(4) VALUE 9999.01
DIAMAYOR PIC 9.01 DIAMENOR PIC 9.01 TOTAL PIC 9(4).01 HOMBRES PIC
9(4).01 MUJERES PIC 9(4)....PROCEDURE DIVISION....MOVE 0 TO
DIA.MIRAR.ADD 1 TO DIA IF DIA > 7 GO FIN.ADD VISITAS (1, DIA) TO
HOMBRES.ADD VISITAS (2, DIA) TO MUJERES.COMPUTE TOTAL = VISITAS (1,
DIA) + VISITAS (2, DIA).IF TOTAL > MAYOR MOVE TOTAL TO MAYOR
MOVE DIA TO DIAMAYOR.IF TOTAL < MENOR MOVE TOTAL TO MENORMOVE
DIA TO DIAMENOR.GO MIRAR.FIN.DISPLAY "TOTAL HOMBRES " LINE 10 COL
10 ERASE.MOVE HOMBRES TO LVISITAS. DISPLAY LVISITAS LINE 10 COL
35.DISPLAY "TOTAL MUJERES " LINE 11 COL 10.MOVE MUJERES TO
LVISITAS. DISPLAY LVISITAS LINE 11 COL 35.DISPLAY
"----------------------------------" LINE 12 COL 10.DISPLAY "TOTAL
VISITAS " LINE 13 COL 10.COMPUTE LVISITAS = HOMBRES +
MUJERES.DISPLAY LVISITAS LINE 13 COL 35.DISPLAY
"----------------------------------" LINE 14 COL 10.DISPLAY "DIA
MAYOR " LINE 15 COL 10.DISPLAY TSEM (DIAMAYOR) LINE 15 COL 22.MOVE
MAYOR TO LVISITAS. DISPLAY LVISITAS LINE 15 COL 35.DISPLAY "DIA
MENOR" LINE 17 COL 10.DISPLAY TSEM (DIAMENOR) LINE 17 COL 22.MOVE
MENOR TO LVISITAS. DISPLAY LVISITAS LINE 17 COL 35.ACCEPT OP LINE
20....
LLENANDO TABLASAhora imaginamos que los datos de la tabla de
visitas, en vez de asignarlos con un MOVE como hemos hecho en los
ejemplos anteriores, los vamos a pedir mediante ACCEPT en un
programa. Vamos a hacer un pequeo programa para que veais como
quedara:WORKING-STORAGE SECTION.01 DIASEMANA.02 GENERO OCCURS 2
TIMES.03 VISITA PIC 9(4) OCCURS 7 TIMES.01 SUB1 PIC 9.01 SUB2 PIC
9.01 OP PIC X.01 LGENERO PIC X(7)....PROCEDURE
DIVISION.INICIO.DISPLAY "CAPTURA DE DATOS" LINE 2 COL 10 ERASE.MOVE
0 TO SUB1 SUB2.METER.ADD 1 TO SUB2 IF SUB2 > 7 GO FIN.MOVE 0 TO
SUB1.METER1.ADD 1 TO SUB1 IF SUB1 > 2 GO METER.IF SUB1 = 1 MOVE
"HOMBRES" TO LGENERO ELSEMOVE "MUJERES" TO LGENERO.DISPLAY "VISITAS
DE " LINE 10 COL 10.DISPLAY LGENERO LINE 10 COL 21.DISPLAY "EL DIA"
LINE 10 COL 29.DISPLAY TSEM (SUB2) LINE 10 COL 37.ACCEPT VISITAS
(SUB1, SUB2) LINE 10 COL 50.GO METER1.FIN.DISPLAY "PROCESO DE
CAPTURA FINALIZADO"LINE 20 COL 20.ACCEPT OP LINE 20 COL 1....
Ahora podramos incluir el cdigo anterior y que nos calcule el da
de mayor y menor visitas y la suma por gneros.
BUSCANDO EN TABLASPara buscar en las tablas existe un comando
propio llamado SEARCH, que veremos al final del captulo, pero ahora
vamos a hacer una busqueda por subndices normal para encontrar
alguno o varios elementos que cumplan una determinada condicin. Por
ejemplo, siguiendo con nuestra tabla (es un poco pequea, pero podra
ser todo lo grande que quisieramos, siempre que no desbordaramos la
memoria del ordenador o la capacidad del compilador), vamos a
buscar los das en los que la afluencia es mayor de 1.000 personas,
para saber si es necesario contratar a mas personal para esos das.
Pero para complicar un poco mas el asunto, vamos a meter dichos das
en otra tabla y as aprendemos a trabajar con mas de una tabla a la
vez.WORKING-STORAGE SECTION.01 DIASEMANA.02 GENERO OCCURS 2
TIMES.03 VISITA PIC 9(4) OCCURS 7 TIMES.01 TABLA1000.02
ELEMENTOS1000 OCCURS 7 TIMES.02 DIA1000 PIC 9.02 VISITAS1000 PIC
9(4).01 SUB1 PIC 9.01 SUB2 PIC 9.01 SUB3 PIC 9.01 TOPE PIC 9.01 OP
PIC X.01 LGENERO PIC X(7)....PROCEDURE DIVISION.INICIO.DISPLAY
"BUSCANDO DIAS DE MAS DE 1000 VISITAS" LINE 2 COL 10 ERASE.MOVE 0
TO SUB1 SUB2.BUSCAR.ADD 1 TO SUB1 IF SUB1 > 7 GO MOSTRAR.COMPUTE
TOTAL = VISITAS (1, SUB1) + VISITAS (2,SUB1).IF TOTAL > 1000ADD
1 TO SUB2 MOVE SUB1 TO DIA1000 (SUB2)MOVE TOTAL TO VISITAS1000
(SUB2).GO BUSCAR.MOSTRAR.MOVE SUB2 TO TOPE MOVE 0 TO
SUB2.MOSTRAR1.ADD 1 TO SUB2 IF SUB2 > TOPE GO FIN.DISPLAY "EL "
LINE 10 COL 29.MOVE DIA1000 (SUB2) TO SUB3.DISPLAY TSEM (SUB3) LINE
10 COL 37.DISPLAY VISITAS1000 (SUB2) LINE 10 COL 50.GO
MOSTRAR1.FIN.DISPLAY "PROCESO DE BUSQUEDA FINALIZADO"LINE 20 COL
20.ACCEPT OP LINE 20 COL 1....
MAS TABLASVoy a poner algunos ejemplos de definicin de tablas
mas complicados que los expuestos en los ejemplos.01 TABLA.02
TRABAJADORES03 NOMBRE03 NIF 03 SALARIO05 BRUTO05 NETO05 GASTOS07
GASTOOCCURS 100 TIMES.PIC X(30).PIC X(10).OCCURS 12 TIMES.PIC
S9(8).PIC S9(8).OCCURS 10 TIMES.PIC S9(8).
Los valores para esta tabla sera: 100 TRABAJADORES de los que
tendramos NOMBRE y NIF referidos como NOMBRE (X) y NIF (X).
A su vez tendramos un salario por mes (12). Descritos con dos
variables BRUTO Y NETO a los que nos referiramos como BRUTO
(CLIENTE, MES) y NETO (CLIENTE, MES).
Y tambin 10 tipos de gastos por cliente y mes referidos como
GASTO (CLIENTE, MES, TIPO).
Como vis se puede complicar cuanto se quiera:- Para saber el
nombre del trabajador nmero 49: DISPLAY NOMBRE (49).- Para saber el
Nif del trabajador 20: DISPLAY NIF (20).- Para saber el bruto de
Mayo del trabajador 15: DISPLAY BRUTO (15, 5).- Para saber el neto
del trabajador 90 del mes de Noviembre: DISPLAY NETO (90, 11).-
Para saber el gasto nmero 3 del mes de Febrero del trabajador
10:DISPLAY GASTO (10, 2, 3).
TABLAS DE LONGITUD VARIABLE.Podemos definir tambin una tabla con
un nmero de elementos variable, dependiendo del valor de una
variable. Su definicin sera as:01 MES01 SEMANA.02 VISTASPIC 99.
PIC 9(4) OCCURS 28 TO 31 DEPENDING OF MES.
INDEXACION.Adems podemos asignar una variable por la cual nos
referiremos a cada elemento, esto se hace aadiendo a la lnea que
contiene la clusula OCCURS, la palabra INDEXED seguida del nombre
de variable que deseemos. La ventaja es que no hay que definirla en
la WORKING. En nuestro ejemplo le pondremos de nombre DIA y quedara
asi:01 DIASEMANA.02 VISITASPIC 9(4) OCCURS 7 TIMES INDEXED DIA.
La gran ventaja de utilizar este mtodo, es que no hay que
definir esa variable, no hay que controlar los rangos y adems el
valor no se alterar ya que no utilizaremos esa variable para nada
mas. Para dar valor a ste tipo de variables hay que utilizar la
sentencia SET, ya que no se pueden utilizar los comandos normales
ni declaraciones aritmticas, con el siguiente formato:SET DIA TO 1.
Da el valor 1 al ndice 1.SET DIA UP 3. Suma 3 al valor del
ndice.SET DIA DOWN 2. Resta 1 al valor del ndice 2.Adems tambin
utilizamos la indexacin para hacer busquedas en las tablas mediante
la sentencia SEARCH.Antes hemos visto como buscar utilizando un
contador y unos IF para verificar lo que buscamos. Pero Cobol tiene
una sentencia especfica para buscar un valor en una tabla. Esta
sentencia se llama SEARCH.Si imaginamos una tabla de trabajadores y
queremos encontrar la posicin en concreto que ocupa uno o saber si
existe en la tabla haremos lo siguiente:01 TABLA.02 TRABAJADORES
OCCURS 100 TIMES INDEXED BY SUB1.03 NOMBRE PIC X(30).03 NIF PIC
X(10)....PROCEDURE DIVISION....BUSCAR.SET SUB1 TO 1.SEARCH
ELEMENTOS AT END GO NOEXISWHEN NOMBRE (SUB1) = "ANDRES MONTES"GO
EXISTE.NOEXIS.DISPLAY "TRABAJADOR INEXISTENTE" LINE 1.GO
FIN.EXIS.DISPLAY "EL NIF DEL TRABAJADOR ES ." LINE 2.DISPLAY NIF
(SUB1) LINE 2 COL 30....
Primero inicializamos la variable de indexacin para que empiece
por el elemento 1, pero podiamos haber escogido el valor que
quisieramos, si le hubiramos dado uno fuera de rango, simplemente
la instruccin hubiera saltado al prrafo NOEXIS indicado en el AT
END.La sentencia SEARCH a continuacin crea un bucle hasta que se
cumpla la condicin dada. Si no la encuentra realiza la instruccin
que haya despues de AT END. Podemos poner todas las condiciones con
WHEN que queramos y se irn ejecutanto en el orden en que se hayan
puesto.Tambin existe la posibilidad de hacer una busqueda total de
la tabla con la clusula ALL en la sentencia SEARCH, se denomina
busqueda binaria.Esta frmula es mas utilizada en tablas mas
grandes. Aqu no hay que preocuparse por el valor del subndice, el
comando se encarga de todo. Pero solo podremos poner una condicin
WHEN y adems el elemento de la tabla por el que se busque debe de
estar clasificado y especificado en la WORKING con la opcin
ASCENDING o DESCENDING. Veamos un ejemplo:01 TABLA.02 TRABAJADORES
OCCURS 100 TIMES ASCENDING KEY NOMBREINDEXED BY SUB1.03 NOMBRE PIC
X(30).03 NIF PIC X(10)....PROCEDURE DIVISION....BUSCAR.SEARCH ALL
ELEMENTOS AT END GO NOEXISWHEN NOMBRE (SUB1) = "ANDRES MONTES"GO
EXISTE.NOEXIS.DISPLAY "TRABAJADOR INEXISTENTE" LINE 1.GO
FIN.EXIS.DISPLAY "EL NIF DEL TRABAJADOR ES ." LINE 2.DISPLAY NIF
(SUB1) LINE 2 COL 30....
La diferencia en cuanto a programacin es mnima, pero el sistema
tarda menos en la busqueda y no tenemos que tener en cuenta el
inicializar el contador. Por el contrario es necesario tener
ordenada nuestra tabla y esto a veces no sea tan
rentable.Obviamente cada una de stas formas de buscar en Tablas son
opciones que ofrece el lenguaje Cobol. Supongo que como en todo lo
que se buscaba al principio era limitar los tiempos de respuesta,
puesto que las mquinas eran muy pequeas y tenan pocos rendimientos,
de ah que sta orden se haya visto inalterada desde el principio.
Cada uno puede utilizar la forma que mejor se le de, la que mejor
entienda o la que mejor haga su cometido.Seguramente se podra haber
hablado mucho mas de tablas, pero lo importante y lo que pretenda
con ste captulo, era que comprendirais el porque de una tabla y su
uso mas frecuente.