Manual Detallado Cobol

Embed Size (px)

Citation preview

MANUAL DE COBOL Introduccin 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, tambin llamadas Constantes Figurativas, como ZERO, SPACE, LOW-VALUES, HIGHVALUES, etc... Quisiera respetar para todo el manual las mismas pautas, color Amarillo para las palabras reservadas cobol, subrayado para las obligatorias, en cursiva los comentarios y en normal el resto.

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-IDNombre del programa. AUTHOR Nombre del autor. INSTALLATION Lugar donde est instalado. DATE-WRITTEN Fecha de creacin. DATE-COMPILED Fecha de compilacin. REMARKSComentarios. 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. 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 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 clausula 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 AB INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT [OPTIONAL] Nombre-de-archivo ASSIGN TO Tipo-de-dispositivo ORGANIZATION IS Tipo de organizacion ACCESS MODE IS Mode de acceso al fichero RECORD KEY IS Clave del registro

ALTERNATE RECORD KEY IS Claves alternativas registro WITH DUPLICATES FILE 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 aqui 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 OPTIONAL si indicamos esta opcin al hacer un OPEN I-O, si el archivo no existe, se crea. Con lo cual nos evitamos tener que abrirlo como OUTPUT y cerrarlo, antes de poder utilizarlo por primera vez. Clusula ASSIGN aqui 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 aqui indicamos la organizacin de los registros de nuestro fichero, podr ser SEQUENTIAL, RELATIVE o INDEXED, si nuestro archivo fuera secuencial se podran omitir sta clausula 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 clausula.

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 el 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 el decimos cual es el nombre de la clave por la cual accederemos a los registros. Esta deber ser alfanmerica y tendr que estar especificada en la FD del fichero. Si el archivo fuera RELATIVE, esta clausula 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 el 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 hubieramos 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 aqui 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:DATOSCLIENTES.DAT" ORGANIZATION INDEXED ACCESS 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 directacmente 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 cojer 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 mas 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 mi 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 clausulas del prrafo. Al asignar la impresora, si asignamos el nombre PRINTER, ste hace referencia a la impresora por defecto pero tambien podramos utilizar un nombre para especificar una impresora de red, por ejemplo, si en nuestra red existe una impresora que esta en PENTIUMHPLASER, podemos identificar un nombre en el Autoexec.bat para asignar ese valor a una variable de entorno como: IMPRE="PENTIUMHPLASER" 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

Es la tercera division 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. Aqui 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 tambien 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:

FD Nombre del fichero. BLOCK CONTAINS Numero de registros por bloque RECORDS RECORD CONTAINS Nmero 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, aqui 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, aqui 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. WORKING-STORAGE SECTION. LINKAGE SECTION. COMMUNICATION SECTION SCREEN SECTION Para 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 SPECIALNAMES 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. WORKING-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 alfanmerica 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: WORKING-STORAGE SECTION. 77 FECHA PIC 9(8). 77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ. 77 IMPORTE PIC S9(8)V99.

77 IMPORTE-EDIT PIC ZZ.ZZZ.ZZZ,ZZ-. 01 ESTADO 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: WORKING-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. WORKING-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: WORKING-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. WORKING-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. WORKING-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).

LINKAGE SECTION. En sta seccin se declaran las variables de igual forma solo que las que aqui 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 RECORDS RECORD CONTAINS 128 CHARACTERS LABEL RECORD STANDARD. 01 REG-CLIENTE.

02 r 02 02 02 02 02 02

KEY-CLIENTE. 03 CLICOD rPIC 9(4) COMP-6. CLINOM PIC X(30). CLIDIR PIC X(30). CLIPOB PIC X(20). CLIPRO PIC X(20). CLINIF PIC X(9). FILLER 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 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..), que se explican en otros captulos del manual. Cada uno de ellos con un formato y una solucin que resolver. A continuacin vamos a explicar su formato y algunas consideraciones generales aparte de las propias instrucciones: PROCEDURE DIVISION (USING Variable, Variable ...). DECLARATIVES. Nombre-seccionSECTION. 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 aqui 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) < IGUAL QUE [ (NOT) EQUAL [ (NOT) = MAYOR O IGUAL QUE [ GREATER OR EQUAL [ = MENOR O IGUAL QUE [ LESS OR EQUAL [ =) mayor o igual que. LESS OR EQUAL ( 30 DISPLAY SALUDO(CONTA1:1) LINE LI COL CONTA1 LOW PERFORM VARYING CONTA2 FROM 1 BY 1 UNTIL CONTA2 > 400000 MOVE ' ' TO OP END-PERFORM END-PERFORM

END-PERFORM DISPLAY 'FINALIZADO' LINE 22 ACCEPT OP STOP RUN. PIDENOMBRE. DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20 ACCEPT NOMBRE LINE 20 COL 30 PROMPT. PIDEAPELLIDO. DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21 ACCEPT APELLIDO LINE 21 COL 30 PROMPT DISPLAY SPACES LINE 20 SIZE 70 DISPLAY 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 MAS Pues s, podemos desarrollar an mas la instruccin incluyendo dos nuevos elementos. EJECUTANDO ANTES O DESPUES En 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 variable FROM nmero, variableBY nmero, valorUNTIL condicin sentencias END-PERFORM Con 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 CONDICIONES Efectivamente 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 variable FROM nmero, variable BY nmero, valor UNTIL condicin

AFTER variable FROM nmero, variable BY nmero, valor UNTIL condicin sentencias AFTER ...... END-PERFORM Al 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.