You are on page 1of 64

Introduccin

(915 palabras totales en este texto) (196647 Lecturas)

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, LOWVALUES, HIGH-VALUES, 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. 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 aqui voy a exponer y ninguno nunca me ha dado ningn problema.

Identification Division
(312 palabras totales en este texto) (132425 Lecturas)

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.

Environment Division
pgina(s) : 1/2 (1905 palabras totales en este texto) (126170 Lecturas)

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 laWORKING 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 KEYCLIENTE1 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
pgina(s) : 1/4 (5050 palabras totales en este texto) (111019 Lecturas)

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 laENVIRONMENT 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 WORKINGSTORAGE 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 laENVIRONMENT 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 uOMITTED , 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 indicaOMITTED. 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.

Data Division
pgina(s) : 2/4 (5050 palabras totales en este texto) (111019 Lecturas)

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".

Data Division
pgina(s) : 3/4 (5050 palabras totales en este texto) (111019 Lecturas)

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, COMP3 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).

Data Division
pgina(s) : 4/4 (5050 palabras totales en este texto) (111019 Lecturas)

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 KEY-CLIENTE. r 03 CLICOD rPIC 9(4) COMP-6. 02 CLINOM PIC X(30). 02 CLIDIR PIC X(30). 02 CLIPOB PIC X(20). 02 CLIPRO PIC X(20). 02 CLINIF PIC X(9). 02 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
(2025 palabras totales en este texto) (85188 Lecturas)

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 laLINKAGE 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, IO , 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, PERFORMque 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
Literal Variable [ (NOT) EQUAL [ (NOT) = ] ] ] ] ] ] Literal Variable

MAYOR O IGUAL QUE


[ GREATER OR EQUAL [ =

MENOR O IGUAL QUE


[ LESS OR EQUAL [ <=

Si se especifica (NOT ) se da a entender lo contrario de la comparacin, con lo que no mayor que puede ser igual que menor o igual que.

Tambien podemos utilizar para las condiciones complejas los operandos lgicos, AND, OR y NOT segn se requieran, todas las condicionea que incluyan AND han de ser correctas para que pase la condicin, si se utiliza OR solo alguna de ellas ha de ser correcta, cuando se utilice NOT no podr ser correcta para que la condicin sea vlida.

Instr. de Clculo
pgina(s) : 1/4 (4515 palabras totales en este texto) (90321 Lecturas)

Debido a que el lenguaje Cobol fue concebido para la gestin de grandes cantidades de datos y a resolver problemas de tipo comercial y de administracin, no se incluyeron dentro de sus especificaciones verbos que nos puedieran ayudar a resolver clculos complejos como integrales, trigonometra, raices cuadradas, etc..., sino simplemente las orientadas a los clculos bsicos, suma, resta, multiplicacin y divisin que son las que vamos a ver a continuacin:

ADD , sta es la instruccin que utilizaremos para realizar sumas y tiene los siguientes formatos: 1.- ADD variable literal variable literal ... TO variable (ROUNDED) (ON SIZE ERROR ) instruccin 2.- ADD variable literal variable literal ...GIVING variable (ROUNDED) (ON SIZE ERROR ) instruccin 3.- ADD CORR variable TO variable (ROUNDED) ( ON SIZE ERROR) instruccin Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKING , y a continuacin pondremos un ejemplo y su explicacin. WORKING-STORAGE SECTION. 01 VALORES. 02 UNO PIC 99 VALUE 10. 02 DOS PIC 9(6) VALUE 280. 02 TRES PIC 9(4) VALUE 540. 01 OTROS 02 OTRO1 PIC 9. 02 DOS PIC 9(6) VALUE 110. 01 RESULTADO PIC S9(8) VALUE 10. 01 RESTO PIC 99. PROCEDURE DIVISION. INICIO. Formato 1: ADD UNO TRES 5 TO RESULTADO. Se sumarn todas las variables o literales numricos (cifras) al valor de la variable que se de a continuacin del TO, guardandose el resultado tambin en sta ltima.Por tanto al realizar sta operacin el valor de la variable RESULTADO, ser de: 10 (de la variable UNO) + 540 (de la variable TRES) + 5 + 10 (de Resultado) = 565. Como veis UNO + TRES + 5 suman 555 pero sto se suma al valor que ya tena la variable RESULTADO, con lo que la suma total es de 565. Este formato se usa mucho para hacer de contador y hacer que una varable aumente en uno su valor poniendo: ADD 1 TO RESULTADO.

Formato 2: ADD UNO TRES 5 GIVING RESULTADO.

En ste caso la variable RESULTADO tendr el valor de la suma de las variables anteriores, sin tener en cuenta su valor inicial, es decir, ser de: 10 (de la variable UNO) + 540 (de la variable TRES) + 5 = 555. Formato 3: ADD CORR VALORES TO OTROS. Con ste formato conseguimos que las variables del campo compuesto VALORES se sumen al valor de las variables con el mismo nombre del campo compuesto OTROS, obteniendo como resultado: 280 (de la variable DOS del campo VALORES) + 110 (de la variable DOS del campo OTROS) = 390. Si hubiera coincidido alguna variable mas con el mismo nombre en ambos campos tambin se hubiese sumado.

Nota: Como habreis podido apreciar pueden coexistir variables con el mismo nombre pero nunca al nivel 01 o 77, es decir nunca como variables independientes, pero si que formen parte de otra, aunque yo personalmente nunca lo uso porque solo puede dar lugar a confusiones. Si de todas formas lo utilizais, hay que tener en cuenta que para referirse a stas variables no solo bastar con poner su nombre, sino que adems habr que especificar a que campo pertenece con la palabra IN u OF . Esto se explicar con mas detalle cuando veamos los verbos para manipular variables como MOVE.

Instr. de Clculo
pgina(s) : 2/4 (4515 palabras totales en este texto) (90321 Lecturas)

SUBTRACT , sta es la instruccin que utilizaremos para realizar restas y tiene los siguientes formatos: 1.- SUBTRACT variable literal variable literal ... FROM variable (ROUNDED) (ON SIZE ERROR ) instruccin 2.- SUBTRACT variable literal variable literal ... FROM variable literal GIVINGvariable (ROUNDED) (ON SIZE ERROR) instruccin 3.- SUBTRACT CORR variable FROM variable (ROUNDED) (ON SIZE ERROR)instruccin Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKINGque hemos utilizado con la instruccin ADD, poniendo a continuacin un ejemplo y su explicacin. Formato 1: SUBTRACT UNO TRES 5 FROM RESULTADO. Se restarn todas las variables o literales numricos (cifras) del valor de la variable que se de a continuacin del FROM, guardandose el resultado tambin en sta ltima. Por tanto al realizar sta operacin el valor de la variable RESULTADO, ser de: -10 (de la variable UNO) - 540 (de la variable TRES) - 5 + 10 (de Resultado) = -545. Como veis se le han restado los valores de UNO, TRES y 5 que suman 555 pero como RESULTADO vala +10, ste se suma y da un valor de 545. Este formato lo podemos utilizar para hacer contadores en retroceso, poniendo: SUBTRACT 1 FROM RESULTADO.

Formato 2: SUBTRACT UNO 5 FROM TRES GIVING RESULTADO. Aqu lo que conseguiremos ser restar el valor de la variable UNO y 5 del valor de la variable TRES y el resultado guardarlo en la variable RESULTADO, sin tener en cuenta su valor inicial, es decir, ser de: 540 (de la variable TRES) - 10 (de la variable UNO) - 5 = 525. Formato 3: SUBTRACT CORR VALORES FROM OTROS. Al igual que con la instruccin ADD, con ste formato conseguimos que las variables del campo compuesto VALORES se resten al valor de las variables con el mismo nombre del campo compuesto OTROS, obteniendo como resultado: 280 (de la variable DOS del campo VALORES) - 110 (de la variable DOS del campo OTROS) = 170. Si hubiera coincidido alguna variable mas con el mismo nombre en ambos campos tambin se hubiese restado.

Nota: Tened en cuenta que al utilizar restas el signo puede ser negativo

y si no tenemos bien declarada la variable que va a contener el resultado, sta cojer su valor absoluto.

Instr. de Clculo
pgina(s) : 3/4 (4515 palabras totales en este texto) (90321 Lecturas)

MULTIPLY , sta es la instruccin que utilizaremos para realizar multiplicaciones y tiene los siguientes formatos: 1.- MULTIPLY variable literal BY variable ( ROUNDED) (ON SIZE ERROR )instruccin 2.- MULTIPLY variable literal BY variable literal GIVING variable (ROUNDED) (ON SIZE ERROR ) instruccin Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD y SUBTRACT, veremos a continuacin unos ejemplos y su explicacin. Formato 1: MULTIPLY 5 BY RESULTADO. Multiplica el nmero 5 por el valor de la variable RESULTADO, guardando en sta misma el resultado de la operacin que ser: 5 x 10 (de la variable RESULTADO) = 50.

Formato 2: MULTIPLY 5 BY TRES GIVING RESULTADO. Aqu multiplicaremos el nmero 5 por el valor de la variable TRES guardando el resultado en la variable RESULTADO, sin tener en cuenta su valor inicial, es decir, ser de: 5 x 540 (de la variable TRES) = 2700.

DIVIDE , sta es la instruccin que utilizaremos para realizar divisiones y tiene los siguientes formatos: 1.- DIVIDE variable literal INTO variable (ROUNDED) (ON SIZE ERROR )instruccin 2.- DIVIDE variable literal (BY INTO) variable literal GIVING variable(ROUNDED) (REMAINDER ) variable (ON SIZE ERROR ) instruccin Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD, SUBTRACT y MULTIPLY, veremos a continuacin unos ejemplos y su explicacin. Formato 1: DIVIDE 10 INTO TRES. Divide el valor de la variable TRES entre el nmero 10, guardando el resultado en la variable TRES: 540 (de la variable TRES) / 10 = 54. Formato 2: DIVIDE 7 INTO TRES GIVING RESULTADO REMAINDER RESTO. Aqu dividiremos el valor del la variable TRES entre 7 guardando el resultado en la variable RESULTADO, sin tener en cuenta su valor inicial, y adems el resto de la operacin lo guardar en la variable RESTO, quedando as: 540 / 7 = 77, pero como 7 x 77 son 539 el resto es 1 que

ser el valor de RESTO. Si en vez de utilizar INTO utilizamos BY cambia el orden de los operandos, es decir en vez de dividir TRES entre 7 dividiramos 7 entre TRES. La opcin REMAINDER no es obligatoria, todo depender del uso que queramos hacer de la instruccin. La variable que ira a continuacin guardar el resto de la divisin.

Instr. de Clculo
pgina(s) : 4/4 (4515 palabras totales en este texto) (90321 Lecturas)

COMPUTE , con sta orden podemos realizar todos los clculos aritmticos posibles en una sola instruccin, utilizando los operadores +(suma) -(resta) *(multiplicacin) /(divisin) **(potenciacin), adems de utilizar parntesis para especificar mejor la operacin a realizar. 1.- COMPUTE variable (ROUNDED) = expresin aritmtica (ON SIZE ERROR)instruccin Utilizando la misma WORKING que hemos utilizado anteriormente vamos a ver un ejemplo: Formato 1: COMPUTE RESULTADO = DOS OF VALORES * 16 / 100. El valor de la variable RESULTADO ser de 44, obtenido despus de multiplicar 280 (de la variable DOS del grupo VALORES) x 16 y lo que de dividido entre 100. En realidad si hacemos el clculo en una calculadora nos daremos cuenta que el resultado exacto es 44,80 pero como la variable RESULTADO no la hemos definido con decimales stos son depreciados por el compilador. Puesto que la variable DOS pertenece a dos grupos de variables deberemos especificar a que grupo pertenece (OF VALORES). Debemos de tener en cuenta que siempre tienen preferencia los operadores que vayan entre parntesis, a continuacin los de multiplicacin y divisin (*) y (/) y por ltimo los de suma y resta (+) y (-) y el orden en que va a ir realizando las operaciones ser de izquierda a derecha, por lo tanto:

COMPUTE RESULTADO = 2 + 3 * 5. Esta operacin dara como resultado 3*5=15+2=17. COMPUTE RESULTADO = (2 + 3) * 5. En cambio sta otra dara: 2+3=5*5=25. Espero que hayais notado la diferencia y la podais aplicar a vuestros casos en concreto.

Para todas stas instrucciones de clculo que hemos visto la opcion ROUNDED significa lo mismo y quiere decir que fuerza al redondeo del resultado para cada operacin y siempre teniendo en cuenta la definicin de la variable que va a guardar ese resultado, por ejemplo si tras una operacin resulta 18,76 ste podra quedar como sigue:

77 RESULTADO PIC 99V99. (valor = 18,76) 77 RESULTADO PIC 99V9. (valor sin redondeo = 18,7 - valor con redondeo = 18,8) 77 RESULTADO PIC 99. (Valor sin redondeo = 18 - valor con redondeo = 19).

Igual ocurre con la frase ON SIZE ERROR instruccin, que propiciar que se ejecute la instruccin

que pongamos a continuacin cuando se produzca un desbordamiento del campo que va a acoger el resultado, por ejemplo si el resultado de una operacin es 8.976.400 y la variable la hemos definido con PIC 9(6) y hemos especificado dicha opcin se ejecutar la instruccin especificada.

Instr. de Archivos
pgina(s) : 1/5 (6114 palabras totales en este texto) (95906 Lecturas)

Sin duda son las instrucciones mas importantes con las que cuenta el lenguaje Cobol, con ellas tendremos la oportunidad de manipular toda la informacin contenida en nuestros archivos, es decir, podremos abrir archivos, cerrarlos, leerlos, guardar informacin nueva o modificar datos existentes. Todo sto lo haremos con las instrucciones que voy a explicar a continuacin. Antes de empezar a explicar stas instrucciones me gustara que entendiseis bien algunos conceptos como fichero, registro y campo, para que podais comprender mas claramente, la explicacin de todas las instrucciones que se vern en sta seccin.

Que es un fichero? Podramos definir un fichero como un conjunto de registros, pero estaramos mas o menos igual. Si comparsemos un fichero de cobol con nuestra vieja agenda de telfonos, para cada amigo tendramos los mismos datos, es decir, nombre, telfono, direccin, etc ... cada uno de esos datos es lo que llamamos campo y el conjunto de todos esos campos para cada amigo sera un registro. Ahora podemos comprender mejor que un fichero o archivo es un conjunto de registros, como una agenda es un conjunto de datos de amigos. Que es una clave? Una clave, es un campo de nuestra agenda que nos sirve para identificar a cada amigo, en la agenda normal la clave podra ser la lengeta con la letra del abecedario correspondiente a los apellidos del amigo. Informticamente es mas completa y con ella podremos identificar a cada uno de ellos, por ejemplo con su nombre o su telfono o un cdigo que le asignemos nosotros personalmente.

En Temticos trataremos el tema de los ficheros en mas profundidad.

OPEN, sta es la instruccin que utilizaremos para abrir un archivo, o lo que es lo mismo hacerlo disponible para operar sobre el, obviamente ste archivo debe de haberse descrito en la Environment y la Data segn se explic, su formato es el siguiente: OPEN (EXCLUSIVE ) modo nombre de archivo ( WITH LOCK) (WITH NO REWIND) Donde modo, indica como se abrir el archivo y puede tener los siguientes valores segn su utilizacin:

INPUT, el archivo se abrir solo para lectura, es decir no podremos grabar ni modificar datos del mismo. I-O, el archivo se abrir como lectura y escritura, con lo cual tendremos acceso a toda la informacin de dicho archivo para leerla, escirbirla, reescribirla o borrarla. OUTPUT, el archico se abre solo para escritura, es el formato que se utiliza en los achivos de impresin y secuenciales. Tiene la particularidad que crea el fichero nuevo cada vez que se utiliza, por lo tanto hay que tener cuidado con archivos Indexados. EXTEND, igual que el anterior pero no crea el archivo, sino que la informacin se va aadiendo a la ya existente. Se utiliza para archivos secuenciales.

Las opciones EXCLUSIVE y WITH LOCK, nos indica cuando trabajamos en multipuesto que ste archivo estar bloqueado, es decir que no estar disponible para otros usuarios. El hecho de que existan dos opciones para lo mismo es por compatibilidad con versiones anteriores.

La opcin WITH NO REWIND, se utiliza cuando utilizamos archivos de cinta, para que no la rebobine al abrirla. ... PROCEDURE DIVISION. INICIO. OPEN INPUT ARTICULOS. OPEN I-O CLIENTES OPEN EXTEND IMPRE. CREAR-ARCHIVO. OPEN OUTPUT TRABAJO CLOSE TRABAJO. ... Nota: Con stas tres instrucciones estamos abriendo tres archivos, cada uno de una forma diferente. Tambien podriamos haberlos puesto en una sola linea de la siguiente forma: OPEN INPUT ARTICULOS I-O CLIENTES EXTEND IMPRE. En el caso del archivo TRABAJO, se consigue crearlo como nuevo, exista antes o no.

Instr. de Archivos
pgina(s) : 2/5 (6114 palabras totales en este texto) (95906 Lecturas)

CLOSE, sta es la instruccin contraria a OPEN, es decir termina la conexin establecida con el archivo, a partir del momento que aparezca sta instruccin el archivo no estar disponible para operar con l, hasta la prxima vez que se abra. Obviamente antes de cerrarlo debe de estar abierto. CLOSE nombre de archivo ( WITH LOCK) (WITH NO REWIND ) El nombre de archivo corresponder a algn archivo abierto anteriormente. Las opciones WITH LOCK y WITH NO REWIND , tienen la misma explicacin que la vista en la orden OPEN. ... PROCEDURE DIVISION. INICIO. OPEN INPUT ARTICULOS. OPEN I-O CLIENTES OPEN EXTEND IMPRE. ... ... ... CERRAR. CLOSE ARTICULOS CLIENTES IMPRE. ... Nota: Apuntar que si finalizamos el programa con la sentencia STOP RUN, que luego veremos, los archivos que estuvieran abiertos se cierran automticamente aunque no se haya especificado la orden CLOSE. Anque siempre es preferible utilizarla, ya que puede haber algunos compiladores mas antiguos que no los cierren. Me gustrara destacar de stas dos instrucciones vistas que lo mas normal es no utilizar ninguna de las opciones, es decir solo abrir de una manera el archivo para su uso y una vez hayamos acabado con l, cerrarlo.

READ, es la instruccin que utilizamos para leer registros de un archivo, debe de estar abierto. Con ella conseguimos que los datos referentes al registro accedido queden en la descripcin de dicho fichero, es decir, conseguimos que los campos declarados en la FD, tengan el valor correspondiente al registro leido. La sentencia READ, se utiliza para leer ficheros secuanciales o indexados, o para leer indexados de manera secuencial, por lo que su sintaxis tiene dos formatos principales. Formato para leer ficheros de manera secuncial. (Indexados o secuenciales) READ nombre de archivo ( NEXT/PREVIOUS RECORD) ( INTO descripcin) (AT END / NO AT END sentencia) END-READ nombre de archivo corresponder a algn archivo abierto anteriormente. La opcin NEXT RECORD, indica que se va a leer el siguiente registro y es la que se toma por defecto, ya que, cuando estamos leyendo un archivo de forma secuencial, ste leer

registros uno tras otro, hasta llegar al final. La opcin PREVIOUS RECORD leera el registro anterior. Esta opcin es la nica que no es vlida para ficheros secuenciales de ste formato. La opcin INTO, indica cual de las descripciones de registro que hayamos podido declarar ser la que almacene los datos del registro leido. Tenemos que tener en cuenta que Cobol nos permite mantener mas de una descripcin de registro para un mismo archivo. Si tuvieramos mas de una, sta sera la opcin para indicarle cual es la que queremos utilizar en sta lectura. La sentencia que va despus de AT END , indica que debe de hacer el programa al llegar al final del fichero. Puede ser cualquier orden de cobol, pero es evidente que si volvemos a leer una vez llegado al final, producir un error. ... PROCEDURE DIVISION. INICIO. OPEN INPUT ARTICULOS. LECTURA. READ ARTICULOS NEXT RECORD AT END GO CERRAR. ... ... ... GO LECTURA. CERRAR. CLOSE ARTICULOS. ... Nota: Si bien este formato nos sirve para leer cualquier tipo de archivo de manera secuencial, en el caso de que el archivo fuera secuencial, ste solo se podra leer as. Existen muchas ocasiones en que un archivo indexado nos interesa leerlo de manera secuencial. Si lo hicieramos ste sera su formato, adems en ste caso podriamos leerlo tanto del principio al final con la opcin NEXT, como del final al principio con la opcin PREVIOUS. Para poder leer un fichero indexado de manera secuencial, deberemos de haber especificado en la SELECT, que su acceso va a ser DYNAMIC o SEQUENTIAL.

Instr. de Archivos
pgina(s) : 3/5 (6114 palabras totales en este texto) (95906 Lecturas)

Formato para leer ficheros indexados con acceso aleatorio. READ nombre de archivo (INTO descripcin) (KEY nombre de clave) ( INVALID KEY / NOT INVALID KEY sentencia) END-READ Las opciones que se repiten con con el formato anterior tienen el mismo formtato y producen el mismo resultado. La opcin KEY, indica por que clave se va a leer el fichero, siempre que ste tenga mas de una. La sentencia despus de INVALID KEY se utiliza para ejecutar una accin cuando se intenta acceder a un registro que no existe. En el caso de utilizarNOT INVALID KEY sera al contrario, es decir cuando el registro existe. ... PROCEDURE DIVISION. INICIO. OPEN INPUT ARTICULOS. LECTURA. MOVE 100 TO CLAVE-ARTICULO. READ ARTICULOS INVALID KEY GO ERROR. ... ... ... GO LECTURA. ERROR. ... ... CERRAR. CLOSE ARTICULOS. ... Nota: Sin duda la forma mas usual de acceder a un registro ser por su clave. Asi por ejemplo para acceder a un fichero de poblaciones cuya clave fuera su cdigo postal, dando cualquier cdigo accederiamos a ese registro en concreto. La accin que hagamos despus de un INVALID KEY, depender del contexto en que se encuentre, podremos volver a solicitar otra clave, permitir crear un registro, etc ..

WRITE, con sta instruccin se consigue grabar la informacin contenida en ese momento en los campos del registro de un fichero. Es decir, si introducimos una ficha nueva en la agenda con los datos de un nuevo amigo, sta instruccin ser la que nos sirva para almacenar en el fichero los datos. A partir de ese momento estarn disponibles tantas veces como queramos para leerla. Y por supuesto el fichero debe de estar abierto como OUTPUT o I-O. WRITE nombre de registro ( FROM descripcin) ( INVALID KEY / NOT INVALID KEY sentencia) END-WRITE

La opcin FROM, indica con cual de las descripciones de registro que hayamos podido declarar se graben los datos en el fichero. Hay que sealar que sta descripcin puede estar definida en la WORKING, y lo que nos ahorra en realidad es mover los datos de esa descripcin que hemos usado como "temporal" a la autntica descripcin del registro. Las clusulas de INVALID KEY y NOT INVALID KEY, tienen la misma funcin dada en la instruccin READ. Solo que aqui, INVALID KEY , se producira cuando al grabar el registro, ste ya existiese o hubiera algn error por el cual no se pudieran grabar los datos. ... PROCEDURE DIVISION. INICIO. OPEN I-O ARTICULOS. LECTURA. MOVE 100 TO CLAVE-ARTICULO. MOVE "ANDRES MONTES" TO NOMBRE. WRITE REGISTRO-ARTICULO INVALID KEY GO ERROR. ... ... GO CERRAR. ERROR. ... ... CERRAR. CLOSE ARTICULOS. ... Nota: Aunque se puedan utilizar varias descripciones, lo mas lgico es utilizar siempre la misma para cada fichero. El error mas probable siempre que sea una INVALID KEY, suele ser que existe un registro ya con esa clave, a parte de ese, falta de espacio en disco, archivo mal abierto o sin abrir.

Adems de ste formato, existe para sta instruccin otro muy comn. Y es el que utilizamos para enviar datos a la impresora, es decir para listar, para imprimir. Es en ste caso, donde se hace indispensable el uso de mas de una descripcin por registro. Porque? Sencillo, definiremos nuestro fichero con un registro de tamao igual al ancho de nuestro listado, y luego en la WORKING, describiremos el formato de cada una de las lineas que utilizaremos en la impresin. Quiero hacer un ejemplo mas extenso para ste caso, que ser muy utilizado y distinto en su filosofa al resto. WRITE nombre de registro ( FROM descripcin) ( AFTER nmero de lineas)(PAGE)ENDWRITE Adems para ste formato tendremos la clusula AFTER, en la cual indicamos el nmero de lineas que debe de avanzar la impresora antes de escribir, o bien que lo haga directamente al principio de la siguiente pgina, poniendo AFTER PAGE. Existen algunas otras clusulas, pero no las vamos a ver aqu por ser poco usadas. IDENTIFICATION DIVISION. PROGRAM-ID. LISTADO. ENVIRONMENT DIVISION. CONFIGURATION SECTION. DECIMAL-POINT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IMPRESORA ASSIGN TO PRINT "LPT1". DATA DIVISION.

FILE SECTION. FD IMPRESORA LABEL RECORD OMITTED. 01 REG-IMPRE PIC X(80). WORKING-STORAGE SECTION. 01 LINEA1. 02 FILLER PIC X(30) VALUE SPACES. 02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA 1". 01 LINEA2. 02 FILLER PIC X(30) VALUE SPACES. 02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA 2". ... ... PROCEDURE DIVISION. INICIO. OPEN OUTPUT IMPRESORA ESCRIBIR. WRITE REG-IMPRE FROM LINEA1 AFTER PAGE. WRITE REG-IMPRE FROM LINEA2 AFTER 2. ... ... CERRAR. CLOSE IMPRESORA. ... Nota: Como podeis ver, hemos definido el registro como REG-IMPRE, pero al escribir sobre el fichero impresora utilizamos las descripciones de LINEA1 y LINEA2, de sta manera conseguimos que se impriman las dos lineas en una impresora conectado al puerto LPT1 y que antes de escribir la primera linea, salte a una pgina en blanco.

Instr. de Archivos
pgina(s) : 4/5 (6114 palabras totales en este texto) (95906 Lecturas)

REWRITE, sta instruccin se utiliza para regrabar datos de un registro ya existente. Toda la sintaxis es exactamente igual que la explicada en WRITE. REWRITE nombre de registro ( FROM descripcin) ( INVALID KEY / NOT INVALID KEY sentencia) END-REWRITE Todas las opciones igual que en WRITE. Por lo que en el ejemplo vamos a ver ambos casos juntos. ... PROCEDURE DIVISION. INICIO. OPEN I-O ARTICULOS. LECTURA. MOVE 100 TO CLAVE-ARTICULO. MOVE "ANDRES MONTES" TO NOMBRE. WRITE REGISTRO-ARTICULO INVALID KEY GO ERROR. MOVE "OTRO NOMBRE" TO NOMBRE. REWRITE REGISTRO-ARTICULO INVALID KEY GO ERROR. ... ... GO CERRAR. ERROR. ... ... CERRAR. CLOSE ARTICULOS. ... Nota: Podemos decir que sta sentencia es la que utilizaremos para modificar el contenido de cualquier registro, pero eso si, nunca podremos alterar la clave, solo los campos que no formen parte de la clave principal. Si quisieramos modificar cualquiera de los campos clave de un registro, deberamos crear uno nuevo con el mismo contenido pero con la clave que ahora queramos y luego borrar el que tenamos.

DELETE, instruccin para borrar un registro de un fichero. La explicacin es corta, pero tiene pocos mas matices, lo que conseguimos es borrar todos los datos de un registro. Su sintaxix es la siguiente: DELETE nombre de fichero ( INVALID KEY / NOT INVALID KEY sentencia)END-DELETE Las nicas clusulas INVALID y NOT INVALID KEY, se usan exactamente igual que en las dems relativas a ficheros, es decir ejecutar la sentencia que pongamos a continuacin cuando una de las condiciones se cumpla, que la clave exista o que no exista. Si nos fijamos vemos que la gran diferencia est en que aqu la orden hace referencia al nombre del fichero y no al del registro, como en las instrucciones anteriores. ...

PROCEDURE DIVISION. INICIO. OPEN I-O ARTICULOS. LECTURA. MOVE 100 TO CLAVE-ARTICULO. READ ARTICULOS INVALID KEY GO ERROR. DELETE ARTICULOS INVALID KEY GO ERROR. ... ... GO CERRAR. ERROR. ... ... CERRAR. CLOSE ARTICULOS. ... ... Nota: Obviamente para borrar un registro, primero hemos de tenerlo en memoria, por eso en el ejemplo lo he leido primero.

Instr. de Archivos
pgina(s) : 5/5 (6114 palabras totales en este texto) (95906 Lecturas)

START, sta instruccin es de suma importancia en el tratamiento de ficheros, y nos sirve para posicionarnos en cualquier parte del mismo, para una lectura mas rpida. Si imaginamos un fichero con 10.000 clientes, clasificados por cdigo, para ver todos los que cuyo cdigo es mayor a 9.000, tendramos que leernos el fichero secuencialmente hasta llegar al sitio correcto, en cambio con sta orden, podremos colocarnos en la posicin del fichero que queramos dentro de unas normas, que veremos a continuacin. START nombre de fichero KEY (expresin) nombre de clave ( INVALID KEY / NOT INVALID KEY sentencia) END-START Las nicas clusulas INVALID y NOT INVALID KEY, se usan exactamente igual que en las dems relativas a ficheros, es decir ejecutar la sentencia que pongamos a continuacin cuando una de las condiciones se cumpla, que la clave exista o que no exista. Si nos fijamos vemos que la gran diferencia est en que aqu la orden hace referencia al nombre del fichero y no al del registro, como en las instrucciones anteriores. La expresin a la que se hace referencia en la sintaxis, pueden ser las siguientes:

LESS (<) menor que. NOT LESS (NOT <) no menor que. EQUAL (=) igual a. GREATER (>) mayor que. NOT GREATER (NOT >) no mayor que. GREATER OR EQUAL (>=) mayor o igual que. LESS OR EQUAL (<=) menor o igual que. FIRST principio de fichero (RM/COBOL). LAST final del fichero (RM/COBOL).

... PROCEDURE DIVISION. INICIO. OPEN I-O ARTICULOS. COLOCAR. MOVE 100 TO CLAVE-ARTICULO. START ARTICULOS KEY NOT LESS KEY CLAVE-ARTICULOS INVALID KEY GO ERROR. LECTURA. READ ARTICULOS NEXT RECORD AT END GO CERRAR. ... GO LECTURA. ERROR. ... ... GO CERRAR. ERROR. ... ... CERRAR. CLOSE ARTICULOS. ... ... Nota: Aqui empezariamos a leer el ficher artculos desde la clave que no

sea menor que 100, es decir de 100 en adelante. Fijaros como luego la lectura se hace en otro prrafo diferente, ya que sino, siempre estariamos haciendo el START. Recordad que con sta instruccin SOLO nos situamos en un sitio determinado del fichero, a partir de ah podremos operar como queramos.

RESUMIENDO En la programacin estructurada es conveniente sustituir el punto como final de una instruccin por la clusula END-....... para cada instruccin. De esta manera conservamos la estructura y no obligamos con el punto a finalizar ninguna instruccin o bucle en el que estemos metidos. Una vez vistas todas las intrucciones relativas a ficheros, quiero dejar bien claro su utilizacin. Tendremos siempre en cuenta que cuando leemos, realmente le damos el valor del registro que hemos leido a los campos o variables que lo componen. Que cuando grabamos o regrabamos, le estamos dando el valor de las variables en ese momento al registro para que se grabe en disco y cuando borramos, estamos quitando fisicamente del disco esa informacin. He realizado un temtico dedicado integramente al uso de ficheros, podis echarle un vistazo por si os han quedado dudas. Temticos

Instr. de Pantalla
pgina(s) : 1/3 (5792 palabras totales en este texto) (84676 Lecturas)

Sin duda alguna e independientemente del lenguaje de programacin escogido, las instrucciones que mas se suelen utilizar, sern las que hagan uso de la pantalla, ya sea como salida o entrada de informacin. Para la programacin en Windows, pondr la informacin en la Seccin "Programando en Windows". Vamos a utilizar sta seccin para hacer un anlisis profundo de dichas instrucciones.

ACCEPT, es la instruccin que usaremos para la entrada de datos. Aunque su sintaxis principal nunca ha variado, sta ha sido una de las instrucciones que mas clusulas se le han ido aadiendo, incluso diferentes segn el compilador, aqu vamos a explicar las comunes y principales. Aunque la forma mas usual de utilizarla, es para aceptar datos por el teclado, tambin es posible utilizarla para "cogerlos" tambin del sistema, para aceptar valores de variables de entorno definidas previamente a nivel de sistema o para aceptar pantallas completas definidas en la SCREEN-SECTION. Adems siguen aumentando sus posibilidades. Veamos sus formatos principales: Formato para aceptar datos del sistema o variables de entorno. ACCEPT variable FROM (DATE, DAY, DAY-OF-WEEK, TIME, CENTURY-DATE, CENTURY-DAY, ESCAPE-KEY, ENVIRONMENT variable de entorno) Segn la opcin escogida, as ser el valor que contendr la variable usada, una vez completada la sentencia. Veamos cada una de las opciones:

DATE, devuelve la fecha en formato AAMMDD, por lo que la variable debe de estar definida con PIC 9(6). CENTUY-DATE, igual que DATE, pero acepta la fecha con 8 dgitos en formato SSAAMMDD. Definir con PIC 9(8). DAY, devuelve el ao y el da del ao en que estamos con el formato AADDD, siendo el valor 1, para el 1 de Enero y as sucesivamente. Debe de estar definida con PIC 9(5). CENTURY-DAY, igual que DAY, pero acepta 4 dgitos para el ao, quedando el formato AAAADDD. Definir con PIC 9(7). DAY-OF-WEEK, devuelve un dgito que indica el da de la semana, siendo 1 el Lunes, 2 el Martes, ... Aqu, la variable debe de estar definida comoPIC 9. TIME, devuelve la hora con formato HHMMSSMM, la variable debe de estar como PIC 9(8). ESCAPE-KEY, devuelve el cdigo de la tecla de excepcin pulsada, debe de estar definida con PIC 99 y segn el compilador los valores pueden ser distintos, pero los bsicos suelen ser los mismos, por ejemplo: ENTER=13, FLECHA ARRIBA=52, FLECHA-ABAJO=53 y las teclas de funcin desde F01 hasta F8 tomaran los valores del 1 al 8, TAB=9. ENVIRONMENT "Variable de entorno" , nos devuelve el valor que dicha variable tenga asignado, normalmente stas variables se asignan en el fichero de configuracin del compilador o desde una variable del sistema. Puede ser muy til para darle capacidades a usuarios diferentes por ejemplo. Tener en cuenta que la variable de entorno debe de ir entre comillas para que sea reconocida.

La definicin de la variable que he dado, no es fija, pero si la mas conveniente, es decir para guardar el dia de la semana, he indicado una variable con PIC 9, pero podamos haber escogido PIC 9(8), lo que pasa, es que no tendra mucho sentido malgastar espacio, cuando sabemos con seguridad, que el dato posible es de 1 a 7, y por lo tanto de PIC 9. Adems de todas stas opciones, cada compilador ha ido incorporando las que ha creido conveniente y por ejemplo con algunas de las nuevas es posible saber informacin sobre el sistema sobre el que trabajamos, el terminal, la lnea, etc .... ... WORKING-STORAGE SECTION. 77 DIA PIC 9. 77 FECHA PIC 9(6). 77 FECHA8 PIC 9(8). ... PROCEDURE DIVISION. INICIO. ACCEPT DIA FROM DAY-OF-WEEK. ACCEPT FECHA FROM DATE. ACCEPT FECHA8 FROM CENTURY-DATE. ... Nota: Si usarames ste programa el da 1 de Julio de 1.999, el valor de las variables sera: FECHA=990701. FECHA8=19990701 DIA=4. El 4 nos indicara que el da de la semana sera Jueves.

Formato para aceptar datos por el teclado.

ACCEPT variable CLAUSULAS ... ON EXCEPTION variable instruccin. La lista de clusulas es muy larga, y por desgracia algunos compiladores pueden tener mas que otros, as que voy a explicar las mas comunes a continuacin: Recordad que lo que se explica aqu puede ser vlido tanto paraACCEPT como para DISPLAY.

LINE variable, constante numrica, (ACCEPT Y DISPLAY) le indicamos la lnea donde se aceptar el campo, puede ser una variable o un nmero, tendremos siempre en cuenta que la lnea 1 ser la primera de arriba de la pantalla, normalmente podremos trabajar con 24 lneas. Si no se especfica tomar la referencia de la siguiente lnea en la que estemos. COLUMN, COL, POSITION variable, constante numrica, (ACCEPT Y DISPLAY) aqu le indicamos la columna dentro de la lnea y sus valores pueden ser desde 1 (izquierda) hasta 80 (derecha) de la pantalla. En algunos terminales es posible capturar 132 columnas. Si no se especifica tomar el valor 1. BEEP, NO BEEP, (ACCEPT Y DISPLAY) con sta opcin le indicamos si queremos o no que emita un pitido al llegar al comando. Por defecto sonar. BLINK, (ACCEPT Y DISPLAY) si aparece sta clusula, el campo que aceptemos parpadear. HIGH, LOW, OFF, (ACCEPT Y DISPLAY) le indicamos el nivel de luminosidad con que se acepta el campo, solo puede ir especificado uno:HIGH con brillo, LOW sin brillo, OFF hace que los datos que introducimos no se vean, se utiliza cuando queremos aceptar una contrasea o alguna clave, en la pantalla no salen los datos

que vamos introduciendo. Si no indicamos ninguna el sistema coge HIGH por defecto. TAB, (ACCEPT) la presencia de sta clusula hace que no salte al siguiente campo hasta que no pulsemos ENTER. Por defecto al introducir el nmero de caracteres o dgitos del campo salta automticamente. TIME variable, constante numrica, (ACCEPT) conseguiremos que la espera para introducir el campo sea limitada y vendr dada por el valor que le asignemos. El valor se indica en centsimas de segundo. CURSOR variable, (ACCEPT) si especificamos sta clusula, el sistema guardar en la variable la posicin donde se ha terminado la introduccin de los datos. Por ejemplo si aceptamos un campo de PIC X(40) y solo rellenamos 9 caracteres, el valor de la variable asociada a CURSOR ser de 10. ERASE, haremos que se borra toda la pantalla. ERASE EOL, (ACCEPT Y DISPLAY) le indicamos que borre la lnea sobre la que estamos desde la posicin del ACCEPT. ERASE EOS, (ACCEPT Y DISPLAY) le indicamos que borre toda la pgina desde la posicin de la lnea en la que estamos.

Instr. de Pantalla
pgina(s) : 2/3 (5792 palabras totales en este texto) (84676 Lecturas)

PROMPT carcter, (ACCEPT) conseguimos que rellene con algn carcter especfico o por defecto el cursor bajo (_) la longitud del campo que vamos a aceptar. Es bastante til ya que el usuario puede ver claramente la longitud del campo. ECHO, (ACCEPT) con sta clusula hacemos que vuelva a "pintar" el contenido del campo despus de aceptado. Es decir si le hemos puesto PROMPT ECHO, mientras se acepta saldrn los guiones bajos para indicar el tamao pero al salir del campo se volver a displayar y stos guiones desaparecern. REVERSE, (ACCEPT Y DISPLAY) conseguimos que el campo que aceptamos se vea en video inverso, si normalmente es blanco sobre negro, se har negro sobre blanco, y si tenemos otros colores, pues en su color inverso. SIZE variable, constante numrica, (ACCEPT) variamos el tamao de la variable que tenamos declarado. Por ejemplo si definimos una variable con PIC X(40) y le indicamos al aceptarla SIZE 10, solo aceptar 10 caracteres para esa variable. CONVERT, (ACCEPT Y DISPLAY) con sta clusula conseguimos que si estamos aceptando un campo numrico o alfabtico, e introducimos un valor no aplicable, lo ignore. Por ejemplo si introducimos una letra en un campo numrico ser ignorada siCONVERT aparece. UPDATE, (ACCEPT) hace que el valor actual del campo aparezca y al aceptar podamos modificar sobre su contenido actual. Es muy aconsejable cuando estamos modificando datos. CONTROL tipo de control, (ACCEPT Y DISPLAY) sta clusula es bastante amplia y en ella podemos atribuir otras opciones como caracteres grficos, colores, etc.. Su uso puede variar segn los compiladores. Mas abajo encontrareis mas informacin. ON EXCEPTION variable instruccin (ACCEPT) si al aceptar el campo introducimos una de las teclas que causa excepcin, es decir que no es reconocida dentro de la tabla de caracteres admitida, el valor de la tecla se guardar en la variable que definamos y a continuacin podremos realizar una instruccin. Por ejemplo si estamos aceptando un campo con PIC X(40) y cuando estamos metiendo su valor pulsamos la teclaescape, si tenemos sta clusula puesta la variable tomar el valor 27 (correspondiente a la tecla escape) y a continuacin se ejecutara la instruccin que hubiramos puesto. Pero todo esto se ve mejor con los ejemplos que a continuacin voy a indicar. Decir que la variable debe de estar definida con PIC 9 COMP-1. UPPER, LOWER, (ACCEPT) con stas opciones obligamos a que el valor del campo aceptado est en Maysculas (UPPER ) o Minsculas (LOWER). COLOR, (ACCEPT y DISPLAY) clusula propia de Acucobol con la que conseguimos aceptar el campo con un determinado color dependiendo de una tabla para asignacin de colores. REQUIRED, (ACCEPT) con sta opcin obligamos al usuario a que no deje el campo en blanco e introduzca cualquier dato. FULL, (ACCEPT) obligamos a que una vez empecemos a introducir un campo, este no se acepte hasta que est completo, es decir si aceptamos una variable con PIC X(30), mientras no introduzcamos los 30 caracteres no nos dejar seguir.

Color Negro Azul Verde Celeste Rojo

Letra Fondo 1 2 3 4 5 32 64 96 128 160

Observaciones Para conseguir los colores, debemos de sumar las dos cantidades correspondientes a la letra y al fondo, por ejemplo si queremos el fondo blanco y la letra azul, el valor que se le debera de asigna a la clusula COLOR ser de

Morado Marrn Blanco

6 7 8

192 224 256

258 (256 fondo blanco + 2 letra azul).

TIPOS DE CONTROL. Voy a explicar algunos de los atributos que se pueden utilizar cuando la frase CONTROL se especifica en ACCEPT o DISPLAY. El formato es el siguiente: CONTROL "FCOLOR=color, .............".

FCOLOR, color de primer plano, utilizaremos los nombres de los colores (white, black, red, blue, green, magenta, brown y cyan). BCOLOR, color de fondo y la gama de colores igual que la anterior.

Formatos Windows (100&100) de ACCEPT en Acucobol: Con Acucobol (y hablo de l, por ser el que utilizo en la actualidad) se permite aceptar cualquier control grfico tpico de windows, como un ENTRY-FIELD, directamente desde laPROCEDURE DIVISION y con el comando ACCEPT propio de Cobol. Evidentemente cambia un poco sobre todo porque las clusulas o propiedades son mucho mas amplias. ... WORKING-STORAGE SECTION. 77 NOMBRE PIC X(30). 77 CODIGO PIC 9(5). 77 ESCA PIC 9 COMP-1. 77 QW PIC 9. ... PROCEDURE DIVISION. INICIO. ACCEPT NOMBRE LINE 10 COL 20 PROMPT LOW REVERSE ECHO CONTROL "FCOLOR=BLUE, BCOLOR=WHITE" ON EXCEPTION ESCA MOVE 1 TO QW. ACCEPT CODIGO LINE 12 COL 20 CONVERT. ... Nota: Con el primer ACCEPT conseguiriamos introducir un valor en la variable NOMBRE, lo aceptaremos en brillo suave con video reverso y una vez introducido el campo, este se volver a mostrar tal y como va a quedar, gracias a ECHO. Adems se aceptar en color azul con fondo blanco y si pulsamos una de las teclas que causan excepcion segn los valores permitidos, esta se guardara en la variable ESCA y luego podramos preguntar por su valor. Por ejemplo si pulsamos F1, F2, F3 tomar el valor 1, 2, 3. Si pulsamos ENTER (13) ESCAPE (27), Tabular (9), etc ... La siguiente orden nos permitir aceptar la variable CODIGO en la cual los carcteres no numricos no se admitirn al llevar la clsusula CONVERT. Os aconsejo que hagis todo tipo de pruebas con las opciones disponibles hasta que el resultado sea el que deseis. Muchas veces cuando se muestra un mensaje, se acepta una variable a continuacin solo para dar tiempo al usuario. Algunos compiladores como Acucobol han implementado la siguiente opcin: ACCEPT OMITTED, y as no tenemos que definir ninguna variable. Teneis que tener en cuenta que algunas de las clusulas que explico es posible que no funcionen en todos los compiladores, as como es posible que existan otras que yo desconozca debido a que son usadas por otros compiladores.

Instr. de Pantalla
pgina(s) : 3/3 (5792 palabras totales en este texto) (84676 Lecturas)

DISPLAY, es la instruccin que usaremos como salida de datos en pantalla. Con ella mostraremos cualquier texto, cualquier variable, cualquier constante o cualquier valor, en resumidas es la instruccin para que aparezca lo que sea en pantalla. Las clusulas asociadas a esta instruccin son practicamente las mismas que hemos visto para ACCEPT, con lo que solo las indicar, su explicacin la obtendris arriba. De todas maneras sta instruccin est siendo implementada en muchos mas campos, por determinados compiladores y no sera justo pensar que su nica funcin es la que voy a explicar aqu, lo que si es cierto es que sta es la comn a todos los compiladores. Mas abajo hablar un poco de todo esto que os digo y de su futuro. DISPLAY variable, literal CLAUSULAS ...

LINE, COL, SIZE, HIGH, LOW, REVERSE, BEEP, BLINK, ERASE. Todos funcionan igual que con la sentencia ACCEPT.

TIPOS DE CONTROL. Adems de los vistos en ACCEPT y DISPLAY podemos utilizar otros: CONTROL "FCOLOR=color, .............".

FCOLOR, igual que en ACCEPT. BCOLOR, igual que en ACCEPT. GRAPHICS, segn una tabla es posible utilizar caracteres semigrficos en cualquier sistema. Cuando programamos en MS-DOS, estos caracteres se pueden asignar muy facilmente pero al trabajar con sistemas UNIX-LINUX, gracias a sta clusula podemos conseguir esos carcteres. Existe una tabla para asignar los valores, por ejemplo la "q" nos da la linea horizontal (Alt+196 (-)) con la que se forman los cuadros, la "m" nos da la vertical (Alt+179 ()) Aqui no se ven bien. WINDOW-CREATE, WINDOW-REMOVE, En RM/Cobol, tambin se utiliza para crear y borrar las pantallas virtuales con las que Cobol puede trabajar, pero para ver su uso, os podeis ir a la seccin que existe especfica para ello en TEMATICOS.

... WORKING-STORAGE SECTION. 77 NOMBRE PIC X(30). ... PROCEDURE DIVISION. INICIO. DISPLAY " " LINE 1 ERASE CONTROL "FCOLOR=BLUE, BCOLOR=WHITE". DISPLAY "INTRODUZCA EL NOMBRE" LINE 10 COL 10 REVERSE. ACCEPT NOMBRE LINE 10 COL 34 PROMPT LOW ECHO. ... Nota: Una cosa a tener en cuenta tanto con FCOLOR, como con BCOLOR, es que los colores que tomen seguirn activos hasta encontrar otra orden que los cambie, por eso al comenzar con esa primera linea conseguimos que toda la pantalla se muestre blanca y el texto en azul para todo el programa, hasta que se encuentre el compilador con otra linea que lo cambie. O sea que no ser necesario seguir incluyendo la clusula CONTROL, en todos los ACCEPT y

DISPLAYque vayamos a utilizar mientras queramos mantener ste formato.

Otros formatos de DISPLAY: DISPLAY nombre de pantalla CLAUSULAS ..., podemos mostrar una pantalla completa que previamente hayamos definido en la SCREEN SECTION. DISPLAY WINDOW CLAUSULAS ... , en Acucobol se utiliza para crear las ventanas virtuales con las que Cobol puede trabajar, pero para ver su uso, os podeis ir a la seccin que existe especfica para ello TEMATICOS. DISPLAY LINE CLAUSULAS ..., conseguimos dibujar una lnea vertical u horizontal donde le indiquemos con las clusulas correspondientes. (No todos los compiladores), se incorporan adems stas clusulas:

SIZE variable, constante numrica, longitud de la lnea (horizontal). LINES variable, constante numrica, altura de la lnea (vertical).

DISPLAY BOX CLAUSULAS ..., igual a la anterior per conseguimos dibujar un cuadro, muy til, pero no todos los compiladores lo tienen implementado. Se incorporan adems stas clusulas:

SIZE variable, constante numrica, anchura del cuadro (horizontal). LINES variable, constante numrica, altura del cuadro (vertical). TITLE variable, constante alfanumrica, ttulo del cuadro. TOP, BUTTON, CENTERED, RIGHT, LEFT posicin que ocupar el ttulo dentro del cuadro.

Formatos Windows (100&100) de DISPLAY en Acucobol: Acucobol en su afn por conseguir una programacin totalmente integrada con los sistemas grficos, ha conseguido implementar a la orden DISPLAY la potencia necesaria para displayar ventanas Windows (100%100) as como cualquier tipo de control. Hoy podemos con una linea de cdigo displayar un COMBOBOX, LABEL, FRAME, BITMAP, STANDARD WINDOW, FLOATING WINDOW, PUSH-BUTTON, ENTRY-LABEL, etc... y asignarle cualquiera de sus propiedades. Pero es un tema demasiado amplio para tratarlo desde aqu. Necesitara una seccin unica y exclusivamente para la programacin grfica, pero todo se andar. Os aseguro que es muy grato obtener resultados Windows, programando directamente con el editor de MS-DOS (ese azul con muy pocas opciones) sin necesidad de ninguna herramienta externa, que tambin existe.

Instr. de Variables
pgina(s) : 1/5 (5707 palabras totales en este texto) (90610 Lecturas)

Dar cabida en esta seccin a la explicacin de todas las instrucciones que hacen referencia a las variables y sus valores. Como todas, este grupo de instrucciones tiene su vital importancia en la programacin y son usadas habitualmente.

MOVE, es la instruccin que usaremos para enviar datos de una variable a otra u otras. Lo que en realidad hace es que la una variable adquiera un valor determinado, ya sea procedente de otra variable o bien desde un valor fijo o constante. Estos son los dos formatos que posee: Formato 1: MOVE variable, valor TOvariable, variable, variable, ....

Con el primer formato las variables que siguen al TO tomarn el dato de la variable o del valor que le preceden. De todo se ver al final una serie de ejemplos bien detallados. Siempre tendremos una serie de normas o restricciones para asegurarnos de que los valores han pasado correctamente.

Los campos numricos siempre se van a alinear a la derecha, respetando la posicin del punto decimal si lo hubiera. Si la variable que recibe el campo es mas pequea, evidentemente se perdern los que no quepan y si es mas grande el resto se pondr a ceros.

Si adems el campo al que se mueven los datos es de edicin, al hacer el paso del valor, este a su vez se formatear con la edicin declarada en laWORKING. Si son alfanumricos la alineacin se efectuar a la izquierda a menos que se haya especificado en la WORKING, al definirla, una justificacin a la derecha (JUST RIGHT). Al igual que en los numricos si es mas pequeo se perdern los caracteres que no quepan y si es mas grande el resto ir relleno de espacios en blanco. ... WORKING-STORAGE SECTION. 77 NUMERO1 PIC 9(6). 77 NUMERO2 PIC 9(8)V99. 77 NUMERO3 PIC ZZZ.ZZZ,ZZ. 77 TEXTO1 PIC X(15) VALUE "LENGUAJE COBOL". 77 TEXTO2 PIC X(10). 77 TEXTO3 PIC X(20) JUST RIGHT. ... PROCEDURE DIVISION. INICIO. MOVE 1536 TO NUMERO1. MOVE NUMERO1 TO NUMERO2 NUMERO3. MOVE TEXTO1 TO TEXTO2 TEXTO3. ... Nota: Despus de aplicar estas sentencias, ste sera el resultado:

NUMERO1=001536 NUMERO2=0000153600 (La coma decimal es virtual) NUMERO3= 1.536,00 TEXTO1=LENGUAJE COBOL TEXTO2=LENGUAJE C TEXTO3= LENGUAJE COBOL

Formato 2: MOVE CORR Identificador1 TO Identificador2 Agregando CORR a la instruccin conseguimos mover de una sola vez un valor entre identificadores siempre que los campos que contengan tengan el mismo nombre. Estos identificadores no pueden ir en niveles 66, 77 ni 88. El efecto es el mismo que si hicieramos tantos MOVE normales como campos iguales tuviera el identificador. No es muy usual, pero si hay casos en los que puede ser razonable su uso. No es necesario que tengan el mismo PIC, ni que estn en el mismo orden, solo que coincidan en su nombre. ... WORKING-STORAGE SECTION. 01 DATOS1. 02 NOMBRE PIC X(30). 02 REGION PIC X(20). 02 PAIS PIC X(15). 01 DATOS2. 02 PAIS PIC X(10). 02 REGION PIC X(10). 02 NOMBRE PIC X(10). ... PROCEDURE DIVISION. INICIO. MOVE "ANDRES MONTES" TO NOMBRE IN DATOS1. MOVE "ANDALUCIA" TO REGION IN DATOS1. MOVE "ESPAA" TO PAIS IN DATOS1. MOVE CORR DATOS1 TO DATOS2. ... Nota: Para partir con unos valores, primero los he movido a las variables del primer grupo (DATOS1). Despus de aplicar el MOVE CORR, el valor de las variables de DATOS2 sera: DATOS2: PAIS=ESPAA REGION=ANDALUCIA NOMBRE=ANDRES MON Fijaros que aunque el orden ni el tamao era el mismo, el resultado es el que queramos.

Instr. de Variables
pgina(s) : 2/5 (5707 palabras totales en este texto) (90610 Lecturas)

INITIALIZE, se utiliza para inicializar variables segn su descripcin, es decir pondr a ceros todas las variables numricas o de edicin y a espacios en blanco las alfabticas y alfanumricas. No funciona con campos definidos como FILLER, (evidente). Y puede ser muy til para inicializar tablas completamente cuando nos referimos al nivel mas alto de la misma. ... WORKING-STORAGE SECTION. 77 TEXTO PIC X(10) VALUE "HOLA MUNDO". 77 NUMERO PIC 9(8) VALUE "12345678". ... PROCEDURE DIVISION. INICIO. INITIALIZE TEXTO NUMERO. ... Nota: Despus de hacer INITIALIZE el valor de TEXTO ser igual a espacios y el de NUMERO igual a ceros. Es el mismo resultado que utilizar MOVE haciendo uso de las CONSTANTES FIGURATIVAS que vimos en la Introduccin de los manuales: MOVE SPACES TO TEXTO. MOVE ZEROS TO NUMERO. El resultado es el mismo en ambos casos, pero en el segundo tenamos que saber de que tipo eran las variables para moverles SPACES o ZEROS, mientras que en el primer caso, es el compilador quien se encarga se saber el tipo de la variable.

INSPECT, esta sentencia se utiliza para contar, reemplazar o contar y reemplazar caracteres o grupos de caracteres dentro de un campo. Se puede contar las veces que aparece un caracter, o cambiar todos esos caracteres por otros, etc ... Esta instruccin tiene formatos diferentes segn lo que se desee hacer, as que vamos a ver cada uno de ellos por separado. Formato 1: INSPECT campo1 TALLYING variable1 FOR ( CHARACTERS) (( BEFORE/AFTER) INITIAL) Cadena1 (ALL)(LEADING) Cadena2 ... (Se puede repetir de nuevo) Este formato es el utilizado para contar el nmero de veces que aparece Identificador1 en el campo1 y guardar el valor en la variable1 que previamente hayamos definido en la WORKING.

CHARACTERS, indica que cuente todos los caracteres del campo incluso los espacios en blanco.

ALL, indica que tiene que buscar en todos los caracteres del campo, la cadena especificada en Cadena2. LEADING, indica que tiene que buscar la cadena especificada en Cadena2, pero solo hasta que encontremos uno diferente, si nada mas empezar es diferente el resultado sera directamente 0. BEFORE INITIAL, busca solo hasta que aparezca la cadena especificada como Cadena1. AFTER INITIAL, empieza a buscar justo despus de la cadena especificada en Cadena1.

Veamos unos ejemplos para salir de dudas. Primero vamos a definir unaWORKINGSTORAGE. ... WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". 77 CONTA PIC 9(8). ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO TALLYING CONTA FOR CHARACTERS. ... El valor de conta ser de 15 que son los caracteres que tiene la variable TEXTO. INSPECT TEXTO TALLYING CONTA FOR ALL "A". ... El valor de conta ser de 2 que son las veces que aparece la letra A en la variable TEXTO. INSPECT TEXTO TALLYING CONTA FOR LEADING "A". ... El valor de conta ser de 0 porque no aparece ninguna A en el primer carcter de la variable TEXTO. INSPECT TEXTO TALLYING CONTA FOR ALL "A" BEFORE INITIAL "N". ... El valor de conta ser de 1 que son las veces que aparece la letra A en la variable TEXTO hasta la aparicin del caracter N. INSPECT TEXTO TALLYING CONTA FOR ALL "A" AFTER INITIAL "G". ... El valor de conta ser de 1 que son las veces que aparece la letra A en la variable TEXTO, empezando a contar desde el caracter G.

Instr. de Variables
pgina(s) : 3/5 (5707 palabras totales en este texto) (90610 Lecturas)

Formato 2: INSPECT campo1 REPLACING variable1 CHARACTERS BY Cambio1 (( BEFORE/AFTER) INITIAL)Cadena1 (ALL)(LEADING)( FIRST) Cadena2... (Se puede repetir de nuevo) Con este formato podemos cambiar caracteres de Campo1, su funcionamiento es igual que el anterior formato solo que en vez de contar reemplaza. Se ha incluido solo FIRST, que indicara que solo se reemplazara la primera vez que coincidieran las condiciones. El tamao de la sustitucin debe de ser igual al tamao sustituido, ya que la variable campo1 no puede cambiar su tamao. ... WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". 77 CONTA PIC 9(8). ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO REPLACING CHARACTERS BY "H". ... El valor de TEXTO ser "HHHHHHHHHHHHHHH", es decir cambia todos los caracteres por el caracter H. INSPECT TEXTO REPLACING ALL "A" BY "I". ... El valor de TEXTO ser "PIGINI DE COBOL", es decir ha cambiado todas las A por I. INSPECT TEXTO REPLACING FIRST "A" BY "O". ... El valor de TEXTO ser "POGINA DE COBOL", solo cambia la primera A por una O. MOVE "PAGIPATOPETOPA" TO TEXTO. INSPECT TEXTO REPLACING ALL "PA" BY "--" AFTER INITIAL "G" BEFORE INITIAL "T". ... Complicando un poco mas, el valor de TEXTO despues de la sentencia INSPECT ser PAGI--TOPETOPA, es decir se cambia todas las PA por -pero empezando a buscar a partir de la primera letra G y justo hasta la letra T. MOVE "PAGIPATOPETOPA" TO TEXTO. INSPECT TEXTO TALLYING CONTA FOR ALL "PA" REPLACING ALL "TO" BY "PO" AFTER INITIAL "OP". ... Aqu hemos mezclado ambos formatos y el resultado es el siguiente. El valor de CONTA es 3 que son las veces que aparece la cadena PA en TEXTO y despus se ejecuta el REPLACING y el resultado da que TEXTO vale PAGIPATOPEPOPA, ya que ha cambiado todos los TO por PO pero despus de la cadena OP.

Formato 3: INSPECT campo1 CONVERTING Identificador1 TO Identificador2 (( BEFORE/AFTER) INITIAL) Cadena1 ...

(Se puede repetir de nuevo)

Con este formato convertimos los caracteres que se especifiquen en identificador1 por los que pongamos en identificador2, respetando el orden. Veamos algunos ejemplos, se suele utilizar mucho para que al aceptar un campo nos de igual se ha sido introducido en maysculas o en minsculas ya que lo convertiriamos a alguno de los formatos. ... WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO CONVERTING "AO"TO "12". ... El valor de TEXTO ser "P1GIN1 DE C2B2L", convertir todas las A por 1 y todas las O por 2. INSPECT TEXTO CONVERTING " ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "abcdefghijklmnopqrstuvwxyz". ... El valor de TEXTO ser "pagina de cobol" ya que ha convertido todas las letras maysculas por minsculas.

Para finalizar con el comando INSPECT, decir que es un comando muy particular y cada uno deber decidir en cada momento y con que situaciones utilizarlo.

Instr. de Variables
pgina(s) : 4/5 (5707 palabras totales en este texto) (90610 Lecturas)

STRING, se utiliza para unir o concatenar campos o partes de estos y el resultado almacenarlo en otro campo. En la unin se pueden incluir tanto variables como literales o constantes de texto.

STRING campo1, literal1 DELIMITED BY (campo2, literal2)(SIZE) INTO Campo3 (WITH POINTER Identificador1) ( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2)

DELIMITED BY, indica hasta donde vamos a "coger" del campo para concatenar sin contar ese

caracter o cadena que se especifique en campo2 o literal2, es decir si tenemos un campo con un valor = "HOLA" y especificamos DELIMITED BY "L" a la hora de la concatenacin nos hubiera cogido solo el HO, ya que al encontrarse la primera L hubiera parado.

SIZE, indica que se pasar todo el contenido del campo1 o literal1 sin limitaciones. INTO, con esto indicamos en que variable se guardar el resultado, campo3. WITH POINTER, si incluimos esta clusula el valor de identificador1 ser en la posicin en que

empezar a contener datos la variable que recibe el STRING. Ese identificador1 debe estar definido como binario. Por defecto el valor es 1.

ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la concatenacin, por


ejemplo si se especifica Identificador1 con un valor superior al tamao del Campo3.

NOT ON OVERFLOW, se ejecutar Sentencia2 si no existe error en la operacin.

Vamos a ver unos ejemplos y adems vamos a comparar como se hubiera hecho utilizando la Working si no existiera el STRING. ... WORKING-STORAGE SECTION. 01 LAFECHA. 02 FILLER PIC X(7) VALUE "HOY ES ". 02 LDIA PIC Z9. 02 FILLER PIC X(4) VALUE " DE ". 02 LMES PIC X(10). 02 FILLER PIC X(4) VALUE "DE ". 02 LANIO PIC 9999. 01 FECHA. 02 DIA PIC 99 VALUE 22. 02 MES PIC 99 VALUE 06. 02 ANIO PIC 9999 VALUE 2001. 01 CONSTRING PIC X(40). 01 TABLAMES. 02 FILLER PIC X(30) VALUE "ENERO FEBRERO MARZO ". 02 FILLER PIC X(30) VALUE "ABRIL MAYO JUNIO ". 02 FILLER PIC X(30) VALUE "JULIO AGOSTO SEPTIEMBRE". 02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ". 01 LATABLA REDEFINES TABLAMES. 02 TMES PIC X(10) OCCURS 12 TIMES. 01 PUNTO PIC 9(4) BINARY. ... PROCEDURE DIVISION. INICIO. MOVE DIA TO LDIA. MOVE TMES (MES) TO LMES.

MOVE ANIO TO LANIO. STRING "HOY ES " DIA " DE " TMES (MES) " DE " ANIO DELIMITED BY SIZE INTO CONSTRING. ... El valor de LAFECHA sera: HOY ES 22 DE JUNIO El valor de CONSTRING sera: HOY ES 22 DE JUNIO DE 2001. DE 2001.

Fijaros que el resultado es el mismo pero en cambio gracias a STRING no hemos tenido que definir ninguna linea en la WORKING ni tampoco tener que mover campos de unas variables a otras. La clusula DELIMITED BY se ha puesto al final porque dicha clusula se aplica a todos los campos que la preceden, si hubieramos querido coger otra limitacin para un campo en concreto habra que haberlo especificado, por ejemplo vamos a afinar mas el ejemplo y conseguir que entre el mes JUNIO y el DE no exista mas que un espacio. En el ejemplo anterior ha unido los 10 caracteres que tiene la variable TMES. STRING "HOY ES " DIA " DE " DELIMITED BY SIZE TMES (MES) DELIMITED BY " " " DE " ANIO DELIMITED BY SIZE INTO CONSTRING. El valor que tendr ahora CONSTRING ser el siguiente: HOY ES 22 DE JUNIO DE 2001. Como veis la diferencia est en los espacios que le sobran al mes, que al poner DELIMITED BY " " los ha evitado porque solo ha concatenado hasta que ha encontrado el primer caracter en blanco. MOVE 4 TO PUNTO. STRING "HOY ES " DIA " DE " DELIMITED BY SIZE TMES (MES) DELIMITED BY " " " DE " ANIO DELIMITED BY SIZE INTO CONSTRING WITH POINTER PUNTO. El valor que tendr ahora CONSTRING ser el siguiente: HOY ES 22 DE JUNIO DE 2001. Es decir habr empezado a concatenar a partir de la posicin 4 del campo CONSTRING. Si el valor de CONSTRING previamente era espacios habra dejado 3 espacios en blanco y si hubiera sido cualquier otro hubiera respetado los 3 primeros caracteres que tuviera.

Instr. de Variables
pgina(s) : 5/5 (5707 palabras totales en este texto) (90610 Lecturas)

UNSTRING, hace exactamente lo contrario de que hemos visto que haca STRING, es decir divide el contenido de un campo en otros. UNSTRING campo1, literal1 DELIMITED BY (campo2, literal2)(ALL) OR (campo2, literal2)(ALL) (Se puede repetir de nuevo) INTO Campo3, Campo4, .... ( DELIMITER Identificador1) ( COUNT Identificador2) (Se puede repetir de nuevo) (WITH POINTER Identificador3) (TALLYING Identificador4) ( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2)

DELIMITED BY, indica el lmite hasta donde vamos cogiendo el campo1 para partirlo. Igual que en STRING, solo que con la funcin a la inversa. OR, es igual que DELIMITED y se utiliza si hay varios delimitadores sobre los que buscar. INTO, indica en que campo o campos se guardar la informacin que vaya fragmentando. DELIMITER, va a contener en cada caso el elemento separador, si hemos incluido enDELIMITED varios, Identificador1 guardar el carcter que de los elegidos ha sido el causante de la fragmentacin. COUNT, cuenta el nmero de caracteres incluidos en la fragmentacin. DELIMITER y COUNT, se podrn usar si se ha especificado DELIMITED. Podemos usar tantos DELIMITER y COUNT como campos se vayan a crear en la fragmentacin. TALLYING, si especificamos esta opcin la instruccin nos guardar en Identificador4 el nmero de campos que se han utilizado en la fragmentacin. POINTER, indica desde que posicin va a ser examinado el campo que desea desfragmentar, por defecto su valor es 1, es decir desde el primer caracter. ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la operacin. NOT ON OVERFLOW, se ejecutar Sentencia2 si no existe error en la operacin.

Vamos a hacer lo contrario de antes y conseguir una fecha numrica de una frase con la fecha: ... WORKING-STORAGE SECTION. 01 LAFECHA PIC X(30) VALUE "HOY ES 22 DE JUNIO DE 2001". 01 FECHA. 02 DIA PIC 99. 02 MES PIC 99. 02 ANIO PIC 9999. 01 CONSTRING PIC X(40). 01 TABLAMES. 02 FILLER PIC X(30) VALUE "ENERO FEBRERO MARZO ". 02 FILLER PIC X(30) VALUE "ABRIL MAYO JUNIO ". 02 FILLER PIC X(30) VALUE "JULIO AGOSTO SEPTIEMBRE". 02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ". 01 LATABLA REDEFINES TABLAMES.

01 01 01 01

02 TMES PIC X(10) OCCURS 12 TIMES. CONTA PIC 99. PALABRAS PIC 99. LETRAS PIC 99. TEXTOS. 02 TEXTO1 PIC X(20). 02 TEXTO2 PIC X(20). 02 TEXTO3 PIC X(20). 02 TEXTO4 PIC X(20). 02 ELMES PIC X(10).

... PROCEDURE DIVISION. INICIO. UNSTRING LAFECHA DELIMITED BY " " INTO TEXTO1 TEXTO2 DIA TEXTO3 ELMES COUNT LETRAS TEXTO4 ANIO. PERFORM VARYING CONTA FROM 1 BY 1 UNTIL ELMES = TMES (CONTA) OR CONTA = 12 TALLYING PALABRAS END-PERFORM ... El valor de LAFECHA era: HOY ES 22 DE JUNIO DE 2001. Despus de aplicar las instrucciones siguientes el contenido de los campos sera el siguiente:

TEXTO1 = HOY TEXTO2 = ES TEXTO3 = DE TEXTO4 = DE ELMES = JUNIO DIA = 22 ANIO = 2001 FECHA = 22062001 LETRAS = 5 PALABRAS = 7

La variable PALABRAS nos ha guardado el nmero de variables utilizadas en la fragmentacin, en este caso 7. La variable LETRAS ha guardado el nmero de caracteres que ha cogido en la separacin que ha guardado en ELMES, que han sido 5 (JUNIO). Podiamos haber puesto un COUNT para cada una. El PERFORM de despus lo hemos hecho para encontrar en la tabla la posicin que ocupaba el nombre del mes y as poder construir la variable FECHA completa en nmerico. Vamos a hacer un ejemplo de como podramos separar un nombre completo, por ejemplo para el nuevo modelo de la Seguridad Social (en Espaa) y el sistema R.E.D.: ... WORKING-STORAGE SECTION. 01 TEXTO PIC X(30) VALUE "MONTES ROBLES, ANDRES". 01 APELLI1 PIC X(20). 01 APELLI2 PIC X(20). 01 NOMBRE PIC X(20). 01 SEPARA PIC X. 01 SEGURIDAD. 02 AP1 PIC XX. 02 AP2 PIC XX. 02 NOM PIC X.

... PROCEDURE DIVISION. INICIO. UNSTRING TEXTO DELIMITED BY " " OR ", " INTO APELLI1 APELLI2 NOMBRE. Aqu conseguimos separar cada apellido y el nombre en campos diferentes. (APELLI1, APELLI2, NOMBRE) MOVE APELLI1 TO AP1 MOVE APELLI2 TO AP2 MOVE NOMBRE TO NOM. ... Aqu la variable SEGURIDAD tendra el valor: MOROA. Vlido para el sistema RED.

Instruccin Perform
pgina(s) : 1/4 (8338 palabras totales en este texto) (70070 Lecturas)

Creo que por mritos propios esta instruccin se merece un apartado para ella sola. Es una instruccin que nos permite tranferir el control a otro u otros procedimientos o bien realizar una serie de sentencias dentro de ella misma mientras se cumplan las condiciones que le hayamos indicado. Es la instruccin mas importante tanto por su variedad de formatos, como por el nmero de veces que se suele usar dentro de un programa, adems nos puede hacer mucho mas sencillo el realizar una programacin estructurada. Cuando decimos que un programa est estructurado, no cabe duda que es debido al uso de sta instruccin. Pero creo que lo importante no es tanto hablar de ella, sino comenzar a explicarla. Empecemos a ver sus formatos desde el mas simple al mas complicado: Siempre debis de tener en cuenta que los ejemplos son solo para aclarar la explicacin, nunca los tomis como programas completos y con una lgica aplastante.

Formato 1: Con este formato transferimos el control del programa a un prrafo, cuando ste termine vuelve el control a la instruccin que sigue al PERFORM . PERFORM nombre_parrafo ... WORKING-STORAGE SECTION. 01 NOMBRE PIC X(30). 01 OP PIC X. PROCEDURE DIVISION. INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PERFORM PIDENOMBRE. DISPLAY 'HOLA ' LINE 10. DISPLAY NOMBRE LINE 10 COL 6. ACCEPT OP LINE 20. STOP RUN. PIDENOMBRE. DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20. ACCEPT NOMBRE LINE 20 COL 30 PROMPT. DISPLAY SPACES LINE 20 SIZE 70. ... Nota: Simplemente hemos hecho que el programa salte a un prrafo que lo ejecute y que vuelva el control a la secuencia.

Formato 2: Una extensin del anterior es indicarle que ejecute mas de un prrafo, especificando el inicio y el fin. PERFORM nombre_parrafo THRU nombre_parrafo ... WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12). 01 APELLIDO PIC X(12). 01 OP PIC X. PROCEDURE DIVISION. INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. DISPLAY 'HOLA ' LINE 10. DISPLAY NOMBRE LINE 10 COL 6. DISPLAY APELLIDO LINE 10 COL 20. ACCEPT OP LINE 20. 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 este caso PIDENOMBRE y PIDEAPELLIDO van seguidos, pero al poner el THRU lo que conseguimos es que el control no se devuelva hasta llegar al prrafo indicado despus del THRU. Es decir que entre PIDENOMBRE y PIDEAPELLIDO podr haber cinco prrados mas y todos ellos se hubieran ejecutado.

Instruccin Perform
pgina(s) : 2/4 (8338 palabras totales en este texto) (70070 Lecturas)

Formato 3: Seguimos ampliando las capacidades, ahora conseguimos que el PERFORM se realice tantas veces como se indique en el nmero o variable que va delante de TIMES. PERFORM nombre_parrafo THRU nombre_parrafo nmero-variable TIMES ... WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12). 01 APELLIDO PIC X(12). 01 OP PIC X. 01 LI PIC 99 VALUE 10. PROCEDURE DIVISION. INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. PERFORM SALUDAR 3 TIMES. 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. SALUDAR. ADD 1 TO LI. DISPLAY 'HOLA ' LINE LI. DISPLAY NOMBRE LINE LI COL 6. DISPLAY APELLIDO LINE LI COL 20. ACCEPT OP LINE 20. ... Nota: Ahora hemos conseguido que el saludo nos lo muestre 3 veces. Por supuesto THRU y TIMES pueden ir perfectamente juntos. Ya os he dicho al principio que los ejemplos pueden no ser muy lgicos, pero si hacen la funcin de explicacin.

Formato 4: Igual que el antrior formato solo que el nmero de veces que se ejecute depender de una condicin y no de un nmero fijo. PERFORM nombre_parrafo THRU nombre_parrafoUNTIL condicin ... WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12). 01 APELLIDO PIC X(12). 01 OP PIC X. 01 LI PIC 99 VALUE 10. PROCEDURE DIVISION. INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. PERFORM SALUDAR UNTIL LI = 15.

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. SALUDAR. ADD 1 TO LI. DISPLAY 'HOLA ' LINE LI. DISPLAY NOMBRE LINE LI COL 6. DISPLAY APELLIDO LINE LI COL 20. ACCEPT OP LINE 20. ... Nota: En este caso el compilador comprueba antes de iniciar elPERFORM que la condicin no se cumple para ejecutarla, en el momento que se cumpla salta a la siguiente instruccin. En el ejemplo ejecutar elPERFORM hasta que la variable LI alcance el valor 15.

Instruccin Perform
pgina(s) : 3/4 (8338 palabras totales en este texto) (70070 Lecturas)

PRIMERA CONCLUSION En los dos primeros formatos, como podris comprobar a menos que sean instrucciones que se vayan a llamar desde nuestro programa en mas de una ocasin, stas podan haber ido en el lugar del PERFORM, es decir las instrucciones una detrs de otra y evitar el PERFORM. Hasta ahora se ha explicado una manera de utilizar la sentencia PERFORM en la que el control pasa a otro lugar del programa. Como vis el STOP RUN est antes de los prrafos que han sido llamados con los PERFORM lo cual indica que stos no se ejecutarn sino es precisamente por los PERFORM. Si bien con esto conseguimos una estructuracin para nuestro programa la instruccinPERFORM nos permite un mayor grado de estructura incluyendo las sentencias de los prrafos llamados dentro de la propia sentencia PERFORM. Para ello hay que tener en cuenta que la utilizacin del punto en las instrucciones dara lugar al fin de la instruccin y nos dara errores, por ello, para finalizar la instruccin nos basamos en END-PERFORM. Veamos un ejemplo de ello con los dos ltimos formatos explicados anteriormente. PERFORM nmero-variable TIMES sentencias END-PERFORM PERFORM UNTIL condicin sentencias END-PERFORM ... WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12). 01 APELLIDO PIC X(12). 01 OP PIC X. 01 LI PIC 99 VALUE 10. PROCEDURE DIVISION. INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. PERFORM 3 TIMES ADD 1 TO LI DISPLAY 'HOLA ' LINE LI DISPLAY NOMBRE LINE LI COL 6 DISPLAY APELLIDO LINE LI COL 20 ACCEPT OP LINE 20 END-PERFORM 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. ... ...

WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12). 01 APELLIDO PIC X(12). 01 OP PIC X. 01 LI PIC 99 VALUE 10. PROCEDURE DIVISION. INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. PERFORM UNTIL LI = 15 ADD 1 TO LI DISPLAY 'HOLA ' LINE LI DISPLAY NOMBRE LINE LI COL 6 DISPLAY APELLIDO LINE LI COL 20 ACCEPT OP LINE 20 END-PERFORM 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: Esta es una manera mas lgica de utilizar el PERFORM en estos formatos, como ves se consigue una visin muy clara de lo que estamos haciendo y no hay saltos de secuencia innecesarios. Por supuesto el COBOL permite cualquier modalidad de uso y siempre funcionara igual. Como veis no puede haber puntos entre el PERFORM y el END-PERFORM puesto que eso hara terminar con error la sentencia.

(2/4)

Instruccin Perform
pgina(s) : 4/4 (8338 palabras totales en este texto) (70070 Lecturas)

Formato 5: En esta ocasin utilizaremos el PERFORM basndonos en un valor inicial el cual podremos y aumentar o disminuir y terminar cuando se cumpla una condicin. No se si me he liado un poco con la explicacin pero lo que conseguimos es ahorrarnos varias instrucciones y resumirlas en una sola, para que lo comprendis veamos su formato y un ejemplo. Como he explicado anteriormente podemos hacer que el PERFORM invoque a uno o varios prrafos o bien incluir el conjunto de sentencias entre PERFORM y END-PERFORM. En el ejemplo veremos este ltimo caso, porque creo que es mas aconsejable. PERFORM VARYING variable FROM nmero, variable BY nmero, valor UNTIL condicin sentencias END-PERFORM ... WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12). 01 APELLIDO PIC X(12). 01 OP PIC X. 01 LI PIC 99. PROCEDURE DIVISION. INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. PERFORM VARYING LI FROM 10 BY 1 UNTIL LI = 15 DISPLAY 'HOLA ' LINE LI DISPLAY NOMBRE LINE LI COL 6 DISPLAY APELLIDO LINE LI COL 20 ACCEPT OP LINE 20 END-PERFORM 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. ...

La instruccin realiza los siguientes pasos: Inicializa la variable LI con el valor que sigue al FROM, es decir 10, a continuacin va incrementado el valor de LI en 1 que es lo que va despus del BY y ejecuta las sentencias que van a continuacin hasta que se cumple la condicin de LI = 15. Es decir las sentencias se ejecutaran para el valor 10, 11, 12, 13 y 14. La instruccin PERFORM se puede anidar tantas veces como se quiera, teniendo en cuenta que el PERFORM contenido debe de ejecutarse completamente interno o completamente externo al que lo contiene. Si necesitamos que por alguna circunstancia finalice la ejecucin de un PERFORM an cuando la secuencia no corresponde, podemos utilizar la sentencia EXIT, que precisamente lo que propicia es eso, que se interrumpa la sentencia PERFORM. Para finalizar vamos a ver un ejemplo con varios PERFORM anidados:

... WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12). 01 APELLIDO PIC X(12). 01 SALUDO PIC X(30). 01 OP PIC X. 01 LI PIC 99. 01 CONTA1 PIC 99. 01 CONTA2 PIC 9(6). PROCEDURE DIVISION. INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE PERFORM PIDENOMBRE THRU PIDEAPELLIDO STRING 'HOLA ' DELIMITED BY SIZE NOMBRE DELIMITED BY ' ' ' ' DELIMITED BY SIZE APELLIDO DELIMITED BY ' ' INTO SALUDO PERFORM VARYING LI FROM 10 BY 1 UNTIL LI = 15 PERFORM VARYING CONTA1 FROM 1 BY 1 UNTIL CONTA1 > 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.