P. 1
COBOL

COBOL

|Views: 564|Likes:
Publicado porJavier Avila

More info:

Published by: Javier Avila on Jul 06, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

08/11/2013

pdf

text

original

Introducción (915 palabras totales en este texto) (165219 Lecturas

)

La orientación 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 programación debemos de tener presente que nos referimos a un lenguaje dedicado a gestión de datos con una magnífica transportabilidad entre los distintos sistemas, yo he ejecutado el mismo programa en MS-DOS y UNIX sin modificar ni una linea de código y copiando solo el objeto. Si se le llaman lenguajes de programación, es porque realmente se consideran como cualquier idioma, es decir tiene su gramática, sus verbos, sus frases, sus párrafos y el cobol además tiene una gran similitud con el inglés, ya que todo su entorno está sacado de éste idioma. Cobol además es un lenguaje estructurado y sus partes se diferencias claramente en Divisiones. Estas son 4, son obligatorias y cada una de ellas tiene una misión diferente dentro de cada programa como veremos a continuación. El programa cobol se escribe secuencialmente en líneas de 80 caracteres o menos con la siguiente división:

La parte (1) comprende las columnas de la 1 a la 6 ambas inclusive y se utiliza para numerar las líneas, aunque hoy en día prácticamente no se utilizan. La parte (2) comprende la columna 7 y en ella podemos encontrar, un guión () que nos indica que esta línea es continuación de la anterior pero que por su tamaño ocupa mas de una línea, un asteristo (*) que nos indica que el texto que viene a continuación 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 párrafos, 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 incluirán 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 párrafos. Si al final de una linea el compilador no encuentra el punto, interpretará que la instrucción continúa 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 párrafos, además éstos no deben de exceder de 30 caracteres (depende del compilador). Las variables y constantes que se pueden utilizar son numéricas, alfabéticas o alfanuméricas. Las numéricas al contrario de la mayoría de los lenguajes actuales o las bases de datos no miden su tamaño por bytes sino por dígitos, es decir, que una variable de 6 dígitos podrá contener números desde 0 hasta 999999 si es de valor absoluto o incluyendo los negativos si lleva signo. Para las alfanuméricas en cambio no hay cambio alguna y su tamaño viene indicado por el número de caracteres que ocupa. Existen además en cobol unas variables que vienen con un valor propio y que se pueden utilizar libremente, también llamadas Constantes Figurativas, como ZERO, SPACE, LOW-VALUES, 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 explicación 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 ningún problema.

IdentificationDivision (312 palabras totales en este texto) (110118 Lecturas)

Esta es la primera linea de todo programa Cobol e identifica a la primera división donde se especifica el nombre del programa, el del autor y demás datos, su sintaxis sería la siguiente: IDENTIFICATION DIVISION. PROGRAM-IDNombre del programa. AUTHOR Nombre del autor. INSTALLATION Lugar donde está instalado. DATE-WRITTEN Fecha de creación. DATE-COMPILED Fecha de compilación. REMARKSComentarios. Vemos que el único párrafo obligatorio además del nombre de división es el que hace referencia al nombre del programa, los demás nombre de autor, lugar de instalación, fechas de creación y compilación y comentarios son opcionales, eso si, si se incluyen se deben de poner cumpliendo las normas.

Podemos incluir además 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 continuación, por ejemplo. * /////// Este programa es para hacer algo /////// * // atención a la sección 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 demás no son tan pequeñas, sin embargo posee dos de las lineasmas importantes de cualquier programa cobol.

EnvironmentDivision página(s) : 1/2 (1905 palabras totales en este texto) (104327 Lecturas)

Como se aprecia en su sintaxis.. asi como ninguna de sus partes. y en ella se especifican. asi como la relacion entre los ficheros a utilizar con sus correspondencias externas. OBJECT-COMPUTER.ni 9.ni -. etc. su formato sería el siguiente: SPECIAL-NAMES. pero hoy en dia. es decir ni A. ésta división ya no es obligatoria. Su sintaxis sería la siguiente: ENVIRONMENT DIVISION.ni X. suele ser un solo caracter y no puede coincidir con ninguno de los que usamos para definir las variables. . O hacer que todas las letras introducidas sean mayúsculas o minúsculas o que no haya diferencias entre ambas con la clausula ALPHABET. 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. Ordenador donde se escribió el fuente. SPECIAL-NAMES. SOURCE-COMPUTER.ni +. También podriamos cambiar el valor del símbolo de la moneda con: CURRENCY SIGN IS literal . DECIMAL-POINT IS COMMA. que se describen a continuacion: CONFIGURATION SECTION: Donde describimos los tipos de ordenadores en que se escribio y se ejecutará el programa. Cambiar valores para constantes del lenguaje. el ordenador donde se escribió y se ejecutará el programa. pueden variar en cada compilador. o bien el nombre del compilador y asignación de valores a ciertas constantes utilizadas por el compilador. estos valores se introducen en sus respectivas lineas como se ve arriba. es decir con los dispositivos a los que hará referencia el programa objeto cuando vaya a establecer comunicación con dicho fichero. Ordenador donde se ejecuta el objeto.niZ.Es la segunda division por orden de aparición. Diremos antes de continuar que en los primeros cobol había muchas partes que eran obligatorias en cada programa.. ésta segunda division se divide a su vez en dos secciones. por ejemplo. CONFIGURATION SECTION.

por ejemplo ARTICULOS. donde se especificarán todos los ficheros que vamos a utilizar. Cláusula SELECT es aqui donde especificamos el nombre lógico que va a tener el fichero dentro del programa. 123456789012 AB INPUT-OUTPUT SECTION. antes de poder utilizarlo por primera vez. si es un fichero sobre el que vamos a grabar RANDOM o DISC. Con lo cual nos evitamos tener que abrirlo como OUTPUT y cerrarlo. INPUTOUTPUT. Esta tiene dos párrafos FILECONTROL e I-O-CONTROL. Vamos a explicar cada una de las cláusulas que encontramos dentro de la Input-Output Section. RELATIVE o INDEXED. Cláusula ORGANIZATION aqui indicamos la organización de los registros de nuestro fichero. se pueden utilizar otros como INPUT. Para identificar ficheros utilizados para clasificar utilizaremos SORT. si es una impresora PRINTER. Cláusula OPTIONAL si indicamos esta opción al hacer un OPEN I-O. Cláusula ASSIGN aqui especificamos el tipo de dispositivo. se crea. CLIENTES. PROVEEDORES. esta sección solo será obligatoria cuando vayamos a utilizar ficheros. si . FILE-CONTROL. su tipo. suele ser una palabra que identifique lo mas claro posible el contenido del fichero. podrá ser SEQUENTIAL. 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. su modo de acceso asi como el medio en que estarán. 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. CASSETTE. si el archivo no existe.INPUT-OUTPUT SECION: Es la siguiente sección dentro de la Environment.

esta clausula se sustituiría por RELATIVE KEY e indicará el número de registro del fichero. Esta deberá ser alfanúmerica y tendrá que estar especificada en la FD del fichero. un ejemplo claro son los archivos de impresora. 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.nuestro archivo fuera secuencial se podrían omitir ésta clausulaasi como las restantes. 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. todos los listados son secuenciales. página(s) : 2/2 (1905 palabras totales en este texto) (104327 Lecturas) Cláusula ACCESS MODE indica el modo de acceso al fichero. Cláusula 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. tipo AUTOEXEC. unas veces secuencialmente. si nos interesa. y cada código será único para cada artículo y con el nos iremos a su posición y podremos ver todos los demas datos que hagan referencia al registro. otras veces por su clave. deberá . si no se especifica ninguno o si el fichero es SEQUENTIAL entiende que el modo será SEQUENTIAL. podría ser INDEXED. puede ser SEQUENTIAL. De ésta organización se deriva el formato del fichero. por ejemplo de ARTICULOS. SEQUENTIAL si los registros se graban secuencialmente conforme se dan entrada sin importar si están o no repetidos. Existe también para los archivos de texto. RANDOM o DYNAMIC. si cada registro es identificado por un valor entero con su posición relativa (practicamente no se utiliza).BAT la posibilidad de asignarlos directamente especificando LINE SEQUENTIAL en ésta clausula. cualquier fichero de mantenimiento. RELATIVE. Si el archivo fuera RELATIVE.

podría darse el caso de que dos clientes tuvieran el mismo nombre. SOURCE-COMPUTER. OBJECT-COMPUTER. y podríamos acceder a el por las dos claves. Cláusula ALTERNATE RECORD KEY solo para ficheros indexados e identifican una o mas claves alternadas para nuestros registros. SPECIAL-NAMES. SELECT CLIENTES ASSIGN TO RANDOM "C:DATOSCLIENTES. dependiendo del valor nosotros podremos operar o hacer alguna acción en concreto. por ejemplo si hubieramos escogido como clave alternada además del NIF. Si aparece WITH DUPLICATES. FILE-CONTROL. por ejemplo en un fichero de clientes cuya clave principal sería el código. podríamos asignar como clave alternativa el NIF. bien por código o bien por NIF. RMCOBOL. os puedo decir poco mas de éste párrafo porque yo no lo he utilizado nunca (lo que no quiere decir que no sea útil).DAT" ORGANIZATION INDEXED ACCESS DYNAMIC RECORD KEY KEYCLIENTE ALTERNATE RECORD KEY-CLIENTE1 FILE STATUS STACLI. el Nombre del cliente. Ejemplo: ENVIRONMENT DIVISION. indica que ésta clave alternativa pudiera estar duplicada. El párrafo I-O CONTROL se utiliza par indicarle al programa cuantos archivos van a utilizar el mismo area de memoria para trabajar. DECIMAL-POINT IS COMMA. .estar declarado en la WORKING-STORAGE SECTION como una variable numérica sin signo. RMCOBOL. Cláusula FILE STATUS aqui damos un nombre de una variable que especificaremos en laWORKING como un campo alfanumérico de dos caracteres donde el programa depositará el código de error que ocurra en el fichero. será también alfanumérico y deberá también estar declarado en la FD. CONFIGURATION SECTION. INPUT-OUTPUT SECTION.

Hemos declarado el archivo CLIENTES como indexado con dos claves. Apreciar que para cada especificación de fichero en la Select solo se pone el punto al final de todas las clausulas del párrafo. Al indicarle el acceso dinámico 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. si en nuestra red existe una impresora que esta en PENTIUMHPLASER. por ejemplo. 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. Al asignar la impresora. una principal KEYCLIENTE y otra alternativa KEY-CLIENTE1 y hemos asignado una variable para guardar los posibles códigos de error para cuando operemos con éste fichero STACLI. si le damos cualquier otro nombre que no identificara a ninguna impresora. al darle el nombre PRINTER cojerá la impresora que tengamos por defecto. si asignamos el nombre PRINTER.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 .SELECT IMPRESORA ASSIGN TO PRINT "PRINTER". siempre he echado en falta. éste hace referencia a la impresora por defecto pero tambien podríamos utilizar un nombre para especificar una impresora de red. Nota final: Creo que es una de las partes mas interesantes de la programación cobol y que cuando he utilizado alguno de éstos nuevos lenguajes orientados a objetos y que utilizan bases de datos. podemos identificar un nombre en el Autoexec. el resultado sería grabar todo lo que debería salir por la impresora en un archivo con ese nombre. Como el fichero IMPRESORA es secuencial no es necesario ninguna aclaración.

WORKING-STORAGE SECTION. que previamente habremos declarado en la INPUT-OUTPUT SECTION dentro de laENVIRONMENT DIVISION. (No la he utilizado nunca). pero si vamos a utilizar alguna variable. es decir donde nombramos cada dato que vayamos a utilizar en nuestro programa. En ésta sección podremos describir los atributos y campos a utilizar en las pantallas. En realidad haciendo ésto último podemos asignar cualquier archivo que esté en cualquier dirección de la red. registros. ya que el nombre que damos es lógico y su asignación la podemos definir con una variable de entorno donde queramos. COMMUNICATION SECTION. Aqui describiremos todos los campos que componen los registros de todos los archivos que vayamos a utilizar. y es donde se declaran absolutamente todos los nombres de campos. Al igual que en la anterior DIVISION ninguna de sus partes es obligatoria. pero que durante la ejecución del programa vayamos a utilizar. Esta es la sección donde se registrarán las variables que nos servirán para enlazar el programa principal con el que llamemos mediante la orden CALL. ésta DIVISION se divide en varias secciones. En ella declararemos todas las variables no referentes a archivos. Para almacenar todos estos nombres de datos. cada una de ellas orientada a un tipo de datos diferente. SCREEN SECTION. aunque solo sea una.IMPRE. dataDivision página(s) : 1/4 (5050 palabras totales en este texto) (91897 Lecturas) Es la tercera division por orden de aparición. LINKAGE SECTION. y y y y y FILE SECTION. SELECT IMPRESORA ASSIGN TO PRINT IMPRE. tendremos que . variables.

Para el caso de los ficheros de datos en disco se suele poner STANDARD y cuando el fichero es de impresora se . 1024). 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 serán omitidas. Cláusula LABEL RECORD puede tener dos valores STANDARD uOMITTED . 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. si no se espicifica será el propio compilador quien la determine. si no se especifica se supone que cada registro va a ocupar un bloque de memoria. En esta sección describiremos los campos que van a componer el registro de cada uno de los archivos con los que vamos a trabajar. puede ser fija o variable. Cláusula FD nombre del fichero que previamente habiamos descrito en la cláusula SELECT de la INPUT-OUTPUT SECTION en laENVIRONMENT DIVISION. Vamos a explicar un poco mas detalladamente cada cláusula de la FILE SECTION. Cláusula RECORD CONTAINS el número de caracteres que tiene el registro sumando todos sus campos. aqui especificamos el número de ellos que va a contener cada bloque. Quiero dejar claro que ésta es mas amplia. Cláusula BLOCK CONTAINS cuando queremos que por cada bloque en disco se graben mas de un registro. BLOCK CONTAINS Numero de registros por bloque RECORDS RECORD CONTAINS Número de caracteres por registro CHARACTERS LABEL RECORD Etiqueta de registro DATA RECORD Nombre del registro. ésta sería su sintaxis: FD Nombre del fichero.incluirla en la WORKING-STORAGE SECTION y esto nos obligará tambien a definir la DATA DIVISION. Pasemos a continuación a explicar mas a fondo cada una de ellas. Si es fija utilizamos un valor y si es variable un rango desde hasta. (512. o bien será el propio compilador el que haga el cálculo mas apropiado. FILE SECTION.

con la única condición de que al formar parte de un registro la información que contiene nos identifica los datos que se guardarán en el medio en que esté el fichero (disco. 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 habiamospreveido. variables. A continuación vendría la descripción de todos los campos que comprenden el registro. WORKING-STORAGE SECTION. Un buen análisis de los ficheros a utilizar antes de empezar es fundamental y nos evitará muchos calentamientos de cabeza. tendremos que modificar toda su estructura rehaciendo el fichero y recompilando todos los programas a los que afecte. Antes de seguir adelante quisiera decir que siendo el cobol un lenguaje orientado casi exclusivamente al manejo de ficheros de datos. LINKAGE SECTION. por lo que no suele aparecer en casi ningún programa. Cláusula DATA RECORD debido a que un mismo fichero puede tener varias descripciones de 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. definir bien todos sus campos y dejar espacio libre para un posible aumento de datos. si en cambio dejamos un poco de espacio nos evitaremos la reestructuración del archivo. tener claro cuales van a ser sus claves tanto la principal como las alternativas. ésto se consigue utilizando el nombre de variable FILLER como veremos un poco mas abajo. ésta parte que hemos visto la mas importante. impresora).indicaOMITTED. COMMUNICATION SECTION . es sin duda. los campos de un registro no son mas que eso. Normalmente no se utiliza y casi siempre se suele utilizar una sola descripción por fichero. aqui indicamos los nombre de éstas que deberán estar descritas a nivel 01.

Para campos numéricos. identifica los posibles valores condicionales de una variable previamente definida.. Las otras dos secciones. Nombre de campo . S .SCREEN SECTION Para la WORKING y la LINKAGE las normas son las mismas. VALUE... identifica la primera entrada de un registro o la primera entrada de un campo que se va a subdividir. A . Y finalmente podrán venir una serie de cláusulas como: PICTURE / PIC esta palabra es la que utilizamos para identificar el tipo de datos que va a contener la variable. . principalmente se utilizarán letras y números o guiones.. que no podrá ser ninguna palabra cobol ni llevar ningún carácter extraño. SYNC. Es posible que algún 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. JUST. 9 . El nivel 88. COMMUNICATION y SCREEN no las veremos en el manual. REDEFINES. SIGN. El nivel 77.. Los niveles 02 al 49 indicarán las distintas subdivisiones de un campo cuya primera entrada ha sido definida a nivel 01.Indica punto decimal.Para campos alfanuméricos. Los niveles 01 y 77 deberán de ir siempre en el Area A (Col 8) el resto es independiente.Indica variable con signo.. V . PIC. OCCURS. identifica a una variable que no se va a subdividir y que no forma parte de ningún registro... asi que las veremos conjuntamente.Para campos alfabéticos. X . Número de Nivel . A continuación pondremos el nombre del campo... Los posible valores son: DE CAMPOS. Cada campo declarado debe de llevar un número de nivel que le informe al compilador del tipo de campo que es: El nivel 01.

.Indica un espacio en blanco. A continuacion vamos a ver un ejemplo de todo lo que hemos explicado para que se vaya quedando claro. WORKING-STORAGE SECTION. . plaza. . avenida. $ . con ello quizás desaprovechamos mas la memoria pero en cambio tenemos un control mejor del dato que puede contener nuestra variable. Para la tercera "NOMBRE" va a ser también alfanumérica pero con una longitud máxima de 20 caracteres y nos servirá para guardar el nombre de la calle. la primera no tiene PIC. * .Representa un espacio para el 0 a la izquierda en campos numéricos. Fijaros que hemos definido 4 variables. avenida. etc. Puede haber mas pero los mas utilizados son los que se han comentado. la utilizariamos para guardar el tipo de calle. 02 TIPO PIC XX. 01 DOMICILIO..ó + . por que indica que está subdividida en las 3 restantes. La segunda "TIPO" nos dice que es una variable alfanúmerica y que puede contener 2 caracteres como máximo. 02 NOMBRE PIC X(20). 02 NUMERO PIC 9(4). es decir para definir una variable alfanumérica de 10 caracteres se pondría: PIC X(10) o PIC XXXXXXXXXX. que quiere decir que puede contener valores entre 0 y 9999. . plaza. (estas dos pueden variar según hayamos especificado en SPECIAL-NAMES DECIMAL-POINT IS COMMA). Z . etc y la última "NUMERO" indica una variable numérica de 4 dígitos. B . . Los valores S y V solo pueden aparecer una vez por cada variable.Indica punto decimal. Para indicar la longitud del campo se puede repetir el símbolo tantas veces como longitud tenga o expresarla entre paréntesis. paseo.Indican la aparición del signo correspondiente.Indica separación de miles. .DE EDICIÓN.Igual pero se cambia el 0 por *.Representa la aparición del signo $ delante del campo numérico. Observad que en Cobol no se guardan las varables numéricas por bytes como ocurre con todos los lenguajes actuales sino por número de dígitos.

ZZZ. Data Division página(s) : 3/4 (5050 palabras totales en este texto) (91897 Lecturas) Vamos a ver algunos ejemplos mas de variables posibles: WORKING-STORAGE SECTION.37-. 01 RAYA PIC X(10) VALUE "----------". NOMBRE "DE LOS DESAMPARADOS " y NUMERO "15". VALUE esta palabra a continuación del PIC indica el valor inicial que contendrá la variable hasta que éste sea modificado.ZZ-.ZZZ. 01 ESTADO PIC 9. si nos refiriéramos a la variable DOMICILIO ésta tendría el siguiente valor:"AVDE LOS DESAMPARADOS 0015". 77 IMPORTE PIC S9(8)V99. 77 FECHA PIC 9(8).815. 88 DIVORCIADO VALUE 3. 01 MINOMBRE PIC X(30) VALUE "ANDRES MONTES". éste último se representaría: 01/11/1998. Si IMPORTE es 12815V37 en negativo e IMPORTE-EDIT el mismo. 88 CASADO VALUE 2. Suponiendo que el valor de FECHA es 01111998 (1 Nov de 1998) y FECHAEDIT es el mismo. éste se representaría: 12. 77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ. 88 SOLTERO VALUE 1. 77 IMPORTE-EDIT PIC ZZ. Por ejemplo podemos definir una variable: WORKING-STORAGE SECTION. .Si TIPO fuera "AV".

. OCCURS esta cláusula es la que se utiliza para declarar tablas. Este debe de ir a continuación del nombre de campo y antes del nombre del campo a que hace referencia. pero como veis a partir de éste momento DIAS y TADIA tendrán siempre el mismo valor pero con diferente nombre y formato de datos. WORKING-STORAGE SECTION. REDEFINES esta cláusula se utiliza para dar mas de un nombre y formato a un mismo campo. 01 NUMERO-DIAS PIC 99. deben de estar en el mismo nivel y uno a continuación del otro en el orden de declaraciones. si os fijais con ésta cláusula convertimos cualquier variable en una constante. 02 MES PIC 99 OCCURS 28 TO 31 DEPENDING NUMERO-DIAS. En cualquier momento del programa podremos cambiar ese valor. aunque todavía no lo he explicado.Asi tendremos una variable llamada RAYA que contiene 10 guiones y otra llamada MINOMBRE que contiene eso. He incluido la cláusula OCCURS para que sea vea un ejemplo práctico. Normalmente al ejecutar un programa se ponen todas las variables a 0. 77 88. Puede tener varios formatos: WORKING-STORAGE SECTION. 02 DIA PIC XXX OCCURS 7 TIMES. pero si ese programa ha sido llamado desde otro no pasará eso. Para las variables numéricas es conveniente ponerlas siempre con VALUE 0 para que al empezar cada programa estemos seguros de que no nos arrastra ningún valor. 01 DIAS PIC X(21) VALUE "LUNMARMIEJUEVIESABDOM". por eso no viene mal inicializarlas todas a 0. 01 TADIA REDEFINES DIAS. No se puede especificar en niveles 01. 01 TABLA. 02 OTRA PIC X(5) OCCURS 5 INDEXED BY IN-OTRA. mi nombre. 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 subíndice. 02 DIA PIC XXX OCCURS 7 TIMES.

Si le diéramos el mismo valor a las dos variables "ANDRES". es la que se toma por defecto y la que memoria ocupa. si en cambio queremos cambiar este orden tendremos que incluir ésta cláusula. Si hubiéramos guardado en ésta tabla las 3 primeras letras de cada dia de la semana. ya que las alfanuméricas siempre ocuparán un byte por cada caracter). BINARY. JUST la justificación de los valores de los campos suele ser a la izda. ésta variable no puede estar definida antes. es la forma por defecto e indica que cada dígito ocupará un byte. su justificación. Tiene varias posibilidades: y y DISPLAY. 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 márgenes de 28 y 31. USAGE con ésta cláusula determinamos el formato en que se guarda el contenido de las variables (numéricas. son diferentes formas de compactación de los datos. para obtener el valor del lunes pediriamos DIA (1). COMP-1.En la primera "DIA" indico que esa tabla va a tener 7 elementos que llamaremos DIA (nn) y entre paréntesis el orden dentro de la tabla. Con todos los campos se puede operar (obviamente) pero solo los que se definan como DISPLAY serán editables directamente. 01 NOMBRE PIC X(10). la diferencia. COMP-3. para los alfanuméricos y a la derecha para los numéricos. 01 NOMBRE1 PIC X(10) JUST RIGHT. la primera nos daría "ANDRES " y la segunda " ANDRES". COMP-6 (la mas usual) guarda dos dígitos en cada byte. COMP-6. WORKING-STORAGE SECTION. En la tercera le indicamos además que la variable IN-OTRA va a ser la encargada de dirigirnos por los elementos de la tabla. para el del Jueves DIA (4) y para el del domingo DIA (7). COMP-3 es igual pero admite signo el cual .

Cuando el tamaño es impar el signo no ocupa ya que comparte byte con el último dígito. Las restantes formas se utilizan menos. el punto decimal tampoco ocupa espacio. FILE SECTION. uno cada 2 dígitos. uno para los dos decimales. 01 FECHA PIC 9(8) COMP-6. Ocupa 8 bytes uno por cada dígito. 01 PRECIO PIC S9(8)V99 COMP-3. En ésta sección se declaran las variables de igual forma solo que las que aqui declaremos nos van a servir de enlace para pasar información a otro programa que será llamado por el principal. Ocupa 4 bytes. . WORKING-STORAGE SECTION. Ocupa 6 bytes. Data Division página(s) : 4/4 (5050 palabras totales en este texto) (91897 Lecturas) LINKAGE SECTION. Ejemplo: DATA DIVISION.iría en los cuatro últimos bites del último byte. ya que solo indica su posición. yo por ejemplo como las capacidades de los ordenadores son tan grandes ahora. cuatro para la parte entera y uno para el signo. 01 IMPORTE PIC 9(8). Estas tres formas que he utilizado son las mas comunes. cuando defino las variables en la WORKING nunca utilizo ninguna compactación es decir no utilizo la cláusula USAGE (que por cierto y como habreis visto se puede omitir) y por defecto toma DISPLAY (un byte por caracter).

ZZ-. r 03 CLICOD rPIC 9(4) COMP-6. 02 CLINIF PIC X(9).ZZZ. WORKING-STORAGE SECTION.FD CLIENTES BLOCK CONTAINS 4 RECORDS RECORD CONTAINS 128 CHARACTERS LABEL RECORD STANDARD. 02 CLIPOB PIC X(20). dejando 17 caracteres (FILLER). 02 ELEDIA PIC XXX OCCURS 7 TIMES. 02 CLIDIR PIC X(30). 01 REG-CLIENTE. Como veis he diseñado el fichero CLIENTES para que cada bloque de 512 Kb. para una posible ampliación del registro. En la descripción del archivo IMPRESORA se declara una variable a nivel 01 que hace referencia al total del . 01 IMPORTE PIC S9(8)V99. 01 VALORES. 01 LINEA PIC X(132). 02 FILLER PIC X(17). 01 TABLA. 02 CLIPRO PIC X(20). 02 FILLER PIC X(9) VALUE "VIESABDOM" . 02 FILLER PIC X(12) VALUE "LUNMARMIEJUE" . 02 DOS PIC 9(6) 02 TRES PIC 9(4)V99.ZZZ. 02 KEY-CLIENTE. FD IMPRESORA LABEL RECORD OMITTED. 02 UNO PIC 99 VALUE 0. ocupe 4 registros. 02 CLINOM PIC X(30). 01 FECHA PIC 9(8). 01 LINPA. 01 TABLAIDA REDEFINES TABLA. 02 LIMPOR PIC ZZ.

Una cosa que considero importante es dar a las variables un nombre un poco lógico que nos recuerde su contenido. Tenemos que tener en cuenta que como en todos los lenguajes. ya sean independientes o que formen parte de algún fichero para poder operar con ellas en la PROCEDURE DIVISION. Espero que haya quedado por lo menos medio clara la explicación de ésta tercera DIVISION. asi al referirnos a la variable ELDIA (2) su contenido será "MAR". 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 alfanumérico de 30 en un programa necesitamos los 10 primeros caracteres por un lado y los veinte restantes por otro. Nota final: La DATA DIVISION nos sirve para tener todas nuestras variables bien definidas. eso significa que el Cobol no iba mal encaminado. por ejemplo si queremos guardar la . Me acuerdo de cuando empezamos a estudiar que para otros lenguajes no era necesaria la declaración de variables previamente y en cambio ahora en la mayoría de los lenguajes se exige que se declaren. evidentemente con la práctica es con lo que mas vamos a aprender siempre claro está que tengamos al menos unas nociones mínimas.registro para luego ir moviendo a éste campo el valor de lo que queramos imprimir. ya sean de programación o de habla (español. En la WORKING se han declarado algunos campos con distintos formatos. puese nada se subdivide para ese programa y no pasa nada. fijaros en la tabla que gracias al REDEFINES hemos llenado con las tres primeras iniciales de cada dia. Tenemos que tener siempre muy claro que con cualquier campo podemos hacer lo que queramos. frances) son muchas las opciones que nos ofrecen pero al final siempre utilizamos las que mas nos gustan o las que consideramos mas útiles. inglés.

Todo ésto se realiza con instrucciones (ordenes.).. en ella encontramos todos los procesos necesarios para que el programa funcione. pues llamarla FECHA. comandos. etc . Cada uno de ellos con un formato y una solución que resolver. ProcedureDivision (2025 palabras totales en este texto) (70018 Lecturas) Bien. DECLARATIVES..fecha.. Nombre-parrafo. . Nombre-parrafo... A continuación vamos a explicar su formato y algunas consideraciones generales aparte de las propias instrucciones: PROCEDURE DIVISION (USING Variable. del gerente. Variable . que haga para la que fue concebido.F. Nombre-seccion SECTION. Nombre-seccionSECTION. que se explican en otros capítulos del manual.. USE AFTER ERROR PROCEDURE ON tipo. hemos llegado a la última división que existe un los programas Cobol. Este sería a groso modo el formato general de una Procedure. si queremos guardar el N. pero se podría omitir). END DECLARATIVES... etc.. Sentencias..I. Sentencias.. . pero incluso se puede omitir si en un programa no vamos a realizar ningún proceso (es obvio que siempre lo realizaremos. NIFGEREN... Vamos a explicar un poco . verbos.).

OUTPUT. EXTEND. (si se va a utilizar) deberá de ir siempre a continuación de la linea de PROCEDURE DIVISION . A continuación irían los párrafos con sus respectivas instrucciones a realizar en caso de error. que a su vez utilizó la instrucción CALL con las mismas variables. IO . en ella podremos definir tantas Secciones (SECTION) y Párrafos como queramos para organizar mejor las instrucciones y para delimitar acciones concretas. Variable . 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. Si no quisieramos utilizar ésta sección.Despues de subdiviría en tantas secciones como opciones de error tengamos. lo que nos indicará que éste ha sido llamado por otro programa y que esas variables traerán un valor procedente del programa llamador.). pudiendo ser tipo. PERFORMque haciendo referencia a esos nombres de párrafo harán que se rompa la secuencia lógica . Ya sabemos que Cobol es un lenguaje estructurado. Cuando especificamos USING en la linea de PROCEDURE DIVISION .su formato: PROCEDURE DIVISION (USING Variable. pues bien no pensemos que la Procedure va a ser un caos de instrucciones escritas secuencialmente. para compartir en el programa. La linea de DECLARATIVES. es una sección dentro de la PROCEDURE que nos va a servir para controlar los posibles errores en cuanto al manejo de ficheros se refiere. siempre teniendo en cuenta que ésta se acaba cuando se indique END DECLARATIVES.. a partir de aqui incluiremos todas las instucciones necesarias para la correcta ejecución del programa.. 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. el nombre del archivo o su modo de apertura (INPUT. éstas pueden ser definidas por archivo o bien forma de apertura. Nombre-seccion SECTION. no. eso si siempre se ejecutarán secuencialmente. después deberemos de dar los nombres de variables que hayamos definido en laLINKAGE SECTION. ésto se especifica en la linea USER AFTER ERROR PROCEDURE ON tipo. excepto cuando encuentre algún verbo de bifurcación como GO. Se pondrían tantos párrafos y secciones como quisieramos controlar. DECLARATIVES.

con lo que no mayor que puede ser igual que menor o igual que. de Cálculo . cuando se utilice NOT no podrá ser correcta para que la condición sea válida. OR y NOT según se requieran. si se utiliza OR solo alguna de ellas ha de ser correcta. todas las condicionea que incluyan AND han de ser correctas para que pase la condición. En las comparaciones que hagamos podremos utilizar los siguientes formatos: MAYOR QUE [ (NOT) GREATER ] [ (NOT) > ] MENOR QUE [ (NOT) LESS ] [ (NOT) < ] IGUAL QUE Literal [ (NOT) EQUAL ] Literal Variable [ (NOT) = ] 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 comparación. Instr. Tambien podemos utilizar para las condiciones complejas los operandos lógicos. AND.de ejecución.

resta. . 02 UNO PIC 99 VALUE 10.. multiplicación y división que son las que vamos a ver a continuación: ADD . WORKING-STORAGE SECTION. TO variable (ROUNDED) (ON SIZE ERROR ) instrucción 2. 01 VALORES..GIVING variable (ROUNDED) (ON SIZE ERROR ) instrucción 3. trigonometría... y a continuación pondremos un ejemplo y su explicación. no se incluyeron dentro de sus especificaciones verbos que nos puedieran ayudar a resolver cálculos complejos como integrales... 02 DOS PIC 9(6) VALUE 280.ADD variable ó literal variable ó literal .página(s) : 1/4 (4515 palabras totales en este texto) (75125 Lecturas) Debido a que el lenguaje Cobol fue concebido para la gestión de grandes cantidades de datos y a resolver problemas de tipo comercial y de administración. etc.ADD CORR variable TO variable (ROUNDED) ( ON SIZE ERROR) instrucción Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKING .. ésta es la instrucción que utilizaremos para realizar sumas y tiene los siguientes formatos: 1..ADD variable ó literal variable ó literal . 01 OTROS 02 OTRO1 PIC 9. 02 DOS PIC 9(6) VALUE 110. sino simplemente las orientadas a los cálculos básicos. suma. 02 TRES PIC 9(4) VALUE 540.. raices cuadradas..

01 RESULTADO PIC S9(8) VALUE 10. 01 RESTO PIC 99. PROCEDURE DIVISION. INICIO. Formato 1: ADD UNO TRES 5 TO RESULTADO. Se sumarán todas las variables o literales numéricos (cifras) al valor de la variable que se de a continuación del TO, guardandose el resultado también en ésta última.Por tanto al realizar ésta operación 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 tenía 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 también 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 además 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 Cálculo página(s) : 2/4 (4515 palabras totales en este texto) (75125 Lecturas)

SUBTRACT , ésta es la instrucción que utilizaremos para realizar restas y tiene los siguientes formatos: 1.- SUBTRACT variable ó literal variable ó literal ... FROM variable (ROUNDED) (ON SIZE ERROR ) instrucción 2.- SUBTRACT variable ó literal variable ó literal ... FROM variable ó literal GIVINGvariable (ROUNDED) (ON SIZE ERROR) instrucción 3.- SUBTRACT CORR variable FROM variable (ROUNDED) (ON

SIZE ERROR)instrucción Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKINGque hemos utilizado con la instrucción ADD, poniendo a continuación un ejemplo y su explicación. Formato 1: SUBTRACT UNO TRES 5 FROM RESULTADO. Se restarán todas las variables o literales numéricos (cifras) del valor de la variable que se de a continuación del FROM, guardandose el resultado también en ésta última. Por tanto al realizar ésta operación 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 valía +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 instrucción 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 también 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 Cálculo página(s) : 3/4 (4515 palabras totales en este texto) (75125 Lecturas)

MULTIPLY , ésta es la instrucción que utilizaremos para realizar multiplicaciones y tiene los siguientes formatos: 1.- MULTIPLY variable ó literal BY variable ( ROUNDED) (ON SIZE ERROR )instrucción 2.- MULTIPLY variable ó literal BY variable ó literal GIVING variable (ROUNDED) (ON SIZE ERROR ) instrucción Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD y SUBTRACT, veremos a continuación unos ejemplos y su explicación. Formato 1: MULTIPLY 5 BY RESULTADO.

ésta es la instrucción que utilizaremos para realizar divisiones y tiene los siguientes formatos: 1. Divide el valor de la variable TRES entre el número 10. veremos a continuación unos ejemplos y su explicación. Formato 2: MULTIPLY 5 BY TRES GIVING RESULTADO. Formato 1: DIVIDE 10 INTO TRES.DIVIDE variable ó literal INTO variable (ROUNDED) (ON SIZE ERROR )instrucción 2. SUBTRACT y MULTIPLY.Multiplica el número 5 por el valor de la variable RESULTADO. guardando en ésta misma el resultado de la operación que será: 5 x 10 (de la variable RESULTADO) = 50. es decir. sin tener en cuenta su valor inicial. DIVIDE . Formato 2: DIVIDE 7 INTO TRES GIVING RESULTADO . será de: 5 x 540 (de la variable TRES) = 2700. guardando el resultado en la variable TRES: 540 (de la variable TRES) / 10 = 54.DIVIDE variable ó literal (BY ó INTO) variable ó literal GIVING variable(ROUNDED) (REMAINDER ) variable (ON SIZE ERROR ) instrucción Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD. Aquí multiplicaremos el número 5 por el valor de la variable TRES guardando el resultado en la variable RESULTADO...

con ésta orden podemos realizar todos los cálculos aritméticos posibles en una sola instrucción. utilizando los operadores +(suma) -(resta) *(multiplicación) /(división) **(potenciación). es decir en vez de dividir TRES entre 7 dividiríamos 7 entre TRES. sin tener en cuenta su valor inicial. La opción REMAINDER no es obligatoria. además de utilizar paréntesis para especificar mejor la operación a realizar. pero como 7 x 77 son 539 el resto es 1 que será el valor de RESTO. de Cálculo página(s) : 4/4 (4515 palabras totales en este texto) (75125 Lecturas) COMPUTE . 1.COMPUTE variable (ROUNDED) = expresión aritmética (ON SIZE ERROR)instrucción Utilizando la misma WORKING que hemos utilizado anteriormente vamos a ver un ejemplo: Formato 1: COMPUTE RESULTADO = DOS OF VALORES * 16 / 100.REMAINDER RESTO. quedando así: 540 / 7 = 77.. . todo dependerá del uso que queramos hacer de la instrucción. Si en vez de utilizar INTO utilizamos BY cambia el orden de los operandos. La variable que iría a continuación guardará el resto de la división. Instr. Aquí dividiremos el valor del la variable TRES entre 7 guardando el resultado en la variable RESULTADO. y además el resto de la operación lo guardará en la variable RESTO.

por lo tanto: COMPUTE RESULTADO = 2 + 3 * 5.El valor de la variable RESULTADO será de 44.76 éste podría quedar como sigue: y y 77 RESULTADO PIC 99V99. obtenido después de multiplicar 280 (de la variable DOS del grupo VALORES) x 16 y lo que de dividido entre 100.80 pero como la variable RESULTADO no la hemos definido con decimales éstos son depreciados por el compilador. Debemos de tener en cuenta que siempre tienen preferencia los operadores que vayan entre paréntesis. COMPUTE RESULTADO = (2 + 3) * 5. En realidad si hacemos el cálculo en una calculadora nos daremos cuenta que el resultado exacto es 44.76) 77 RESULTADO PIC 99V9. por ejemplo si tras una operación resulta 18.7 . Espero que hayais notado la diferencia y la podais aplicar a vuestros casos en concreto. Puesto que la variable DOS pertenece a dos grupos de variables deberemos especificar a que grupo pertenece (OF VALORES). a continuación los de multiplicación y división (*) 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.valor con redondeo = 18.8) . En cambio ésta otra daría: 2+3=5*5=25. Esta operación daría como resultado 3*5=15+2=17. Para todas éstas instrucciones de cálculo que hemos visto la opcion ROUNDED significa lo mismo y quiere decir que fuerza al redondeo del resultado para cada operación y siempre teniendo en cuenta la definición de la variable que va a guardar ese resultado. (valor = 18. (valor sin redondeo = 18.

(Valor sin redondeo = 18 . la explicación de todas las instrucciones que se verán en ésta sección. etc . Instr. que propiciará que se ejecute la instrucción que pongamos a continuación cuando se produzca un desbordamiento del campo que va a acoger el resultado. es decir. dirección. teléfono.976.400 y la variable la hemos definido con PIC 9(6) y hemos especificado dicha opción se ejecutará la instrucción especificada. para cada amigo tendríamos los mismos datos. Ahora podemos . de Archivos página(s) : 1/5 (6114 palabras totales en este texto) (79108 Lecturas) Sin duda son las instrucciones mas importantes con las que cuenta el lenguaje Cobol. Antes de empezar a explicar éstas instrucciones me gustaría que entendiéseis bien algunos conceptos como fichero. Si comparásemos un fichero de cobol con nuestra vieja agenda de teléfonos. registro y campo. cada uno de esos datos es lo que llamamos campo y el conjunto de todos esos campos para cada amigo sería un registro. podremos abrir archivos. leerlos. es decir. pero estaríamos mas o menos igual. con ellas tendremos la oportunidad de manipular toda la información contenida en nuestros archivos. y ¿Que es un fichero? Podríamos definir un fichero como un conjunto de registros.y 77 RESULTADO PIC 99. nombre. guardar información nueva o modificar datos existentes. Igual ocurre con la frase ON SIZE ERROR instrucción. por ejemplo si el resultado de una operación es 8. para que podais comprender mas claramente.valor con redondeo = 19).. cerrarlos. Todo ésto lo haremos con las instrucciones que voy a explicar a continuación..

Las opciones EXCLUSIVE y WITH LOCK. Informáticamente es mas completa y con ella podremos identificar a cada uno de ellos. En Temáticos trataremos el tema de los ficheros en mas profundidad. escirbirla. es decir no podremos grabar ni modificar datos del mismo. con lo cual tendremos acceso a toda la información de dicho archivo para leerla. OUTPUT. I-O. OPEN. por ejemplo con su nombre o su teléfono o un código que le asignemos nosotros personalmente. o lo que es lo mismo hacerlo disponible para operar sobre el. es el formato que se utiliza en los achivos de impresión y secuenciales. por lo tanto hay que tener cuidado con archivos Indexados. es un campo de nuestra agenda que nos sirve para identificar a cada amigo. igual que el anterior pero no crea el archivo. ésta es la instrucción que utilizaremos para abrir un archivo. el archivo se abrirá solo para lectura. su formato es el siguiente: OPEN (EXCLUSIVE ) modo nombre de archivo ( WITH LOCK) (WITH NO REWIND) Donde modo.comprender mejor que un fichero o archivo es un conjunto de registros. sino que la información se va añadiendo a la ya existente. Se utiliza para archivos secuenciales. EXTEND. indica como se abrirá el archivo y puede tener los siguientes valores según su utilización: y y y y INPUT. en la agenda normal la clave podría ser la lengüeta con la letra del abecedario correspondiente a los apellidos del amigo. el archico se abre solo para escritura. reescribirla o borrarla. el archivo se abrirá como lectura y escritura. obviamente éste archivo debe de haberse descrito en la Environment y la Data según se explicó. nos indica cuando trabajamos en . Tiene la particularidad que crea el fichero nuevo cada vez que se utiliza. y ¿Que es una clave? Una clave. como una agenda es un conjunto de datos de amigos.

para que no la rebobine al abrirla. OPEN INPUT ARTICULOS. se consigue crearlo como nuevo. INICIO.. CREAR-ARCHIVO.. Nota: Con éstas tres instrucciones estamos abriendo tres archivos. Instr. .multipuesto que éste archivo estará bloqueado. OPEN OUTPUT TRABAJO CLOSE TRABAJO. El hecho de que existan dos opciones para lo mismo es por compatibilidad con versiones anteriores. cada uno de una forma diferente.. La opción WITH NO REWIND. es decir que no estará disponible para otros usuarios. En el caso del archivo TRABAJO. exista antes o no. PROCEDURE DIVISION. OPEN I-O CLIENTES OPEN EXTEND IMPRE.. se utiliza cuando utilizamos archivos de cinta. de Archivos página(s) : 2/5 (6114 palabras totales en este texto) (79108 Lecturas) . Tambienpodriamos haberlos puesto en una sola linea de la siguiente forma: OPEN INPUT ARTICULOS IO CLIENTES EXTEND IMPRE. .

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

La opción PREVIOUS RECORD leería el registro anterior. PROCEDURE DIVISION. indica cual de las descripciones de registro que hayamos podido declarar será la que almacene los datos del registro leido. es decir. por lo que su sintaxis tiene dos formatos principales.. La opción NEXT RECORD. Puede ser cualquier orden de cobol. es la instrucción que utilizamos para leer registros de un archivo. conseguimos que los campos declarados en la FD. Formato para leer ficheros de manera secuncial. indica que debe de hacer el programa al llegar al final del fichero. Con ella conseguimos que los datos referentes al registro accedido queden en la descripción de dicho fichero. Tenemos que tener en cuenta que Cobol nos permite mantener mas de una descripción de registro para un mismo archivo. (Indexados o secuenciales) READ nombre de archivo ( NEXT/PREVIOUS RECORD) ( INTO descripción) (AT END / NO AT END sentencia) END-READ nombre de archivo corresponderá a algún archivo abierto anteriormente. producirá un error. Si tuvieramosmas de una. cuando estamos leyendo un archivo de forma secuencial. hasta llegar al final. INICIO. La sentencia que va después de AT END . ésta sería la opción para indicarle cual es la que queremos utilizar en ésta lectura. . indica que se va a leer el siguiente registro y es la que se toma por defecto.. OPEN INPUT ARTICULOS. Esta opción es la única que no es válida para ficheros secuenciales de éste formato.READ. ya que. La opción INTO. tengan el valor correspondiente al registro leido. éste leerá registros uno tras otro. . La sentencia READ. o para leer indexados de manera secuencial. debe de estar abierto. se utiliza para leer ficheros secuanciales o indexados. pero es evidente que si volvemos a leer una vez llegado al final.

Si lo hicieramos éste sería su formato.. éste solo se podría leer así. en el caso de que el archivo fuera secuencial. como del final al principio con la opción PREVIOUS.. .. . CLOSE ARTICULOS. .LECTURA. Nota: Si bien este formato nos sirve para leer cualquier tipo de archivo de manera secuencial. de Archivos página(s) : 3/5 (6114 palabras totales en este texto) (79108 Lecturas) .. deberemos de haber especificado en la SELECT.. Instr.. .. además en éste caso podriamos leerlo tanto del principio al final con la opción NEXT. GO LECTURA. READ ARTICULOS NEXT RECORD AT END GO CERRAR. CERRAR. Existen muchas ocasiones en que un archivo indexado nos interesa leerlo de manera secuencial. que su acceso va a ser DYNAMIC o SEQUENTIAL.. Para poder leer un fichero indexado de manera secuencial.

READ nombre de archivo (INTO descripción) (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. Asi por ejemplo para acceder a un fichero de poblaciones cuya clave fuera su código postal. La opción KEY. . Nota: Sin duda la forma mas usual de acceder a un registro será por su clave.. CLOSE ARTICULOS. CERRAR. PROCEDURE DIVISION. MOVE 100 TO CLAVE-ARTICULO... ERROR. . OPEN INPUT ARTICULOS. . READ ARTICULOS INVALID KEY GO ERROR. .. LECTURA.. siempre que éste tenga mas de una.Formato para leer ficheros indexados con acceso aleatorio. . indica por que clave se va a leer el fichero. GO LECTURA.... . INICIO. . La sentencia después de INVALID KEY se utiliza para ejecutar una acción cuando se intenta acceder a un registro que no existe... .... es decir cuando el registro existe. dando cualquier código accederiamos a ese registro en concreto.. En el caso de utilizarNOT INVALID KEY sería al contrario.

A partir de ese momento estarán disponibles tantas veces como queramos para leerla. . WRITE. permitir crear un registro. OPEN I-O ARTICULOS. indica con cual de las descripciones de registro que hayamos podido declarar se graben los datos en el fichero.. ésta instrucción será la que nos sirva para almacenar en el fichero los datos. Es decir. y lo que nos ahorra en realidad es mover los datos de esa descripción que hemos usado como "temporal" a la auténtica descripción del registro.. WRITE nombre de registro ( FROM descripción) ( INVALID KEY / NOT INVALID KEY sentencia) END-WRITE La opción FROM... dependerá del contexto en que se encuentre. MOVE 100 TO CLAVE-ARTICULO. con ésta instrucción se consigue grabar la información contenida en ese momento en los campos del registro de un fichero. INVALID KEY .. etc. tienen la misma función dada en la instrucción READ.. LECTURA. se produciría cuando al grabar el registro.La acción que hagamos después de un INVALID KEY. INICIO. podremos volver a solicitar otra clave. Las cláusulas de INVALID KEY y NOT INVALID KEY. WRITE REGISTRO-ARTICULO INVALID KEY GO ERROR. Solo que aqui. si introducimos una ficha nueva en la agenda con los datos de un nuevo amigo. Hay que señalar que ésta descripción puede estar definida en la WORKING. . Y por supuesto el fichero debe de estar abierto como OUTPUT o I-O. éste ya existiese o hubiera algún error por el cual no se pudieran grabar los datos. . PROCEDURE DIVISION. MOVE "ANDRES MONTES" TO NOMBRE. ..

es decir para listar. existe para ésta instrucción otro muy común. pero no las vamos a ver aquí por ser poco usadas. suele ser que existe un registro ya con esa clave. Nota: Aunque se puedan utilizar varias descripciones. archivo mal abierto o sin abrir. que será muy utilizado y distinto en su filosofía al resto.. ¿Porque? Sencillo. Además de éste formato. Y es el que utilizamos para enviar datos a la impresora.. ERROR. Quiero hacer un ejemplo mas extenso para éste caso. IDENTIFICATION DIVISION. a parte de ese. LISTADO. Existen algunas otras cláusulas. El error mas probable siempre que sea una INVALID KEY. WRITE nombre de registro ( FROM descripción) ( AFTER número de lineas)(PAGE)END-WRITE Además para éste formato tendremos la cláusula AFTER. ... falta de espacio en disco. para imprimir. . poniendo AFTER PAGE. en la cual indicamos el número de lineas que debe de avanzar la impresora antes de escribir..GO CERRAR. y luego en la WORKING. definiremos nuestro fichero con un registro de tamaño igual al ancho de nuestro listado. CERRAR. donde se hace indispensable el uso de mas de una descripción por registro. lo mas lógico es utilizar siempre la misma para cada fichero. Es en éste caso. describiremos el formato de cada una de las lineas que utilizaremos en la impresión.. CLOSE ARTICULOS. o bien que lo haga directamente al principio de la siguiente página. PROGRAM-ID. . .

02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA 1". . pero al escribir sobre el fichero impresora utilizamos las descripciones de LINEA1 y LINEA2. CONFIGURATION SECTION.. 01 LINEA2. FILE SECTION. WRITE REG-IMPRE FROM LINEA1 AFTER PAGE. CERRAR. WORKING-STORAGE SECTION.. INPUT-OUTPUT SECTION... .. salte a una página en blanco. .. 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. DATA DIVISION.. DECIMAL-POINT IS COMMA. OPEN OUTPUT IMPRESORA ESCRIBIR. INICIO. . 01 REG-IMPRE PIC X(80). hemos definido el registro como REG-IMPRE. Nota: Como podeis ver... 01 LINEA1. . SELECT IMPRESORA ASSIGN TO PRINT "LPT1".ENVIRONMENT DIVISION. 02 FILLER PIC X(30) VALUE SPACES. FD IMPRESORA LABEL RECORD OMITTED. 02 FILLER PIC X(30) VALUE SPACES. WRITE REG-IMPRE FROM LINEA2 AFTER 2. CLOSE IMPRESORA.. . 02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA 2". PROCEDURE DIVISION. FILE-CONTROL.

Instr... de Archivos página(s) : 4/5 (6114 palabras totales en este texto) (79108 Lecturas) REWRITE. ERROR. LECTURA. MOVE "OTRO NOMBRE" TO NOMBRE. ésta instrucción se utiliza para regrabar datos de un registro ya existente. MOVE 100 TO CLAVE-ARTICULO. REWRITE nombre de registro ( FROM descripción) ( 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. OPEN I-O ARTICULOS. PROCEDURE DIVISION.. REWRITE REGISTRO-ARTICULO INVALID KEY GO ERROR.. Toda la sintaxis es exactamente igual que la explicada en WRITE. .... INICIO. MOVE "ANDRES MONTES" TO NOMBRE.. GO CERRAR.. . . . . WRITE REGISTRO-ARTICULO INVALID KEY GO ERROR.

es decir ejecutará la sentencia que pongamos a continuación cuando una de las condiciones se cumpla. . nunca podremos alterar la clave. MOVE 100 TO CLAVE-ARTICULO. READ ARTICULOS INVALID KEY GO ERROR. lo que conseguimos es borrar todos los datos de un registro. Nota: Podemos decir que ésta sentencia es la que utilizaremos para modificar el contenido de cualquier registro. OPEN I-O ARTICULOS. como en las instrucciones anteriores. pero eso si. Si quisieramos modificar cualquiera de los campos clave de un registro.. . CLOSE ARTICULOS. que la clave exista o que no exista. instrucción para borrar un registro de un fichero. INICIO.. LECTURA. PROCEDURE DIVISION. deberíamos crear uno nuevo con el mismo contenido pero con la clave que ahora queramos y luego borrar el que teníamos. La explicación es corta.. DELETE. pero tiene pocos mas matices.CERRAR.. se usan exactamente igual que en las demás relativas a ficheros. 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. . solo los campos que no formen parte de la clave principal. Su sintaxix es la siguiente: DELETE nombre de fichero ( INVALID KEY / NOT INVALID KEY sentencia) END-DELETE Las únicas cláusulas INVALID y NOT INVALID KEY.

CERRAR.DELETE ARTICULOS INVALID KEY GO ERROR. .. podremos colocarnos en la posición del fichero que queramos dentro de unas normas.. .. que veremos a continuación. . CLOSE ARTICULOS. para una lectura mas rápida. para ver todos los que cuyo código es mayor a 9.. en cambio con ésta orden. . Nota: Obviamente para borrar un registro. y nos sirve para posicionarnos en cualquier parte del mismo.000.. . GO CERRAR. .000 clientes..... ERROR. primero hemos de tenerlo en memoria.. por eso en el ejemplo lo he leido primero. clasificados por código. ésta instrucción es de suma importancia en el tratamiento de ficheros. START nombre de fichero KEY (expresión) nombre de clave ( INVALID KEY / NOT INVALID KEY sentencia) END-START . Instr. tendríamos que leernos el fichero secuencialmente hasta llegar al sitio correcto. de Archivos página(s) : 5/5 (6114 palabras totales en este texto) (79108 Lecturas) START. Si imaginamos un fichero con 10...

que la clave exista o que no exista. GREATER OR EQUAL (>=) mayor o igual que.. . OPEN I-O ARTICULOS. 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.. se usan exactamente igual que en las demás relativas a ficheros. COLOCAR. . como en las instrucciones anteriores. GREATER (>) mayor que. MOVE 100 TO CLAVE-ARTICULO. EQUAL (=) igual a. ERROR. NOT LESS (NOT <) no menor que. . LECTURA. INICIO...Las únicas cláusulas INVALID y NOT INVALID KEY. START ARTICULOS KEY NOT LESS KEY CLAVEARTICULOS INVALID KEY GO ERROR. .. LAST final del fichero (RM/COBOL). LESS OR EQUAL (<=) menor o igual que. PROCEDURE DIVISION. NOT GREATER (NOT >) no mayor que. GO LECTURA. La expresión a la que se hace referencia en la sintaxis. es decir ejecutará la sentencia que pongamos a continuación cuando una de las condiciones se cumpla.. FIRST principio de fichero (RM/COBOL). pueden ser las siguientes: y y y y y y y y y LESS (<) menor que. READ ARTICULOS NEXT RECORD AT END GO CERRAR.

. Temáticos . realmente le damos el valor del registro que hemos leido a los campos o variables que lo componen... De esta manera conservamos la estructura y no obligamos con el punto a finalizar ninguna instrucción o bucle en el que estemos metidos. ya que sino. CLOSE ARTICULOS. He realizado un temático dedicado integramente al uso de ficheros. . le estamos dando el valor de las variables en ese momento al registro para que se grabe en disco y cuando borramos. ERROR.. RESUMIENDO En la programación estructurada es conveniente sustituir el punto como final de una instrucción por la cláusula END-.. .. Una vez vistas todas las intrucciones relativas a ficheros. Recordad que con ésta instrucción SOLO nos situamos en un sitio determinado del fichero.. Que cuando grabamos o regrabamos. Nota: Aquiempezariamos a leer el ficher artículos desde la clave que no sea menor que 100.. Fijaros como luego la lectura se hace en otro párrafo diferente. estamos quitando fisicamente del disco esa información. a partir de ahí podremos operar como queramos. ... GO CERRAR.. para cada instrucción. Tendremos siempre en cuenta que cuando leemos... podéis echarle un vistazo por si os han quedado dudas... . siempre estariamos haciendo el START.. CERRAR. quiero dejar bien claro su utilización. es decir de 100 en adelante..

serán las que hagan uso de la pantalla. también es posible utilizarla para "cogerlos" también del sistema. Aunque la forma mas usual de utilizarla. aquí vamos a explicar las comunes y principales. para aceptar valores de variables de entorno definidas previamente a nivel de sistema o para aceptar pantallas completas definidas en la SCREEN-SECTION. DAY. Vamos a utilizar ésta sección para hacer un análisis profundo de dichas instrucciones. incluso diferentes según el compilador. ENVIRONMENT variable de entorno) . ésta ha sido una de las instrucciones que mas cláusulas se le han ido añadiendo. ya sea como salida o entrada de información. DAY-OF-WEEK. CENTURY-DATE. ACCEPT variable FROM (DATE. Además siguen aumentando sus posibilidades. Veamos sus formatos principales: Formato para aceptar datos del sistema o variables de entorno. Aunque su sintaxis principal nunca ha variado. de Pantalla página(s) : 1/3 (5792 palabras totales en este texto) (68602 Lecturas) Sin duda alguna e independientemente del lenguaje de programación escogido. las instrucciones que mas se suelen utilizar. Para la programación en Windows. es para aceptar datos por el teclado. CENTURY-DAY.Instr. ACCEPT. pondré la información en la Sección "Programando en Windows". TIME. ESCAPE-KEY. es la instrucción que usaremos para la entrada de datos.

así será el valor que contendrá la variable usada. ESCAPE-KEY. DAY. por lo que la variable debe de estar definida con PIC 9(6). siendo 1 el Lunes.. CENTURY-DAY. devuelve la fecha en formato AAMMDD. nos devuelve el valor que dicha variable tenga asignado. Además de todas éstas opciones. pero acepta la fecha con 8 dígitos en formato SSAAMMDD. normalmente éstas variables se asignan en el fichero de configuración del compilador o desde una variable del sistema. FLECHA ARRIBA=52. pero los básicos suelen ser los mismos. es decir para guardar el dia de la semana. devuelve el año y el día del año en que estamos con el formato AADDD. FLECHA-ABAJO=53 y las teclas de función desde F01 hasta F8 tomarían los valores del 1 al 8. la variable debe de estar como PIC 9(8). no es fija. cuando sabemos con seguridad. es que no tendría mucho sentido malgastar espacio. devuelve la hora con formato HHMMSSMM. por ejemplo: ENTER=13. debe de estar definida con PIC 99 y según el compilador los valores pueden ser distintos. para el 1 de Enero y así sucesivamente. cada compilador ha ido incorporando las que ha creido conveniente y por ejemplo con algunas de las nuevas es posible . Puede ser muy útil para darle capacidades a usuarios diferentes por ejemplo. TAB=9. la variable debe de estar definida comoPIC 9. Tener en cuenta que la variable de entorno debe de ir entre comillas para que sea reconocida. DAY-OF-WEEK.. igual que DATE. Veamos cada una de las opciones: y y y y y y y y DATE. CENTUY-DATE. pero acepta 4 dígitos para el año. igual que DAY. devuelve el código de la tecla de excepción pulsada. pero podíamos haber escogido PIC 9(8).Según la opción escogida. he indicado una variable con PIC 9. una vez completada la sentencia. 2 el Martes. quedando el formato AAAADDD. ENVIRONMENT "Variable de entorno" . TIME. Definir con PIC 9(8). que el dato posible es de 1 a 7. devuelve un dígito que indica el día de la semana. . La definición de la variable que he dado. Definir con PIC 9(7). siendo el valor 1. Debe de estar definida con PIC 9(5). lo que pasa. pero si la mas conveniente. y por lo tanto de PIC 9. Aquí.

77 FECHA8 PIC 9(8). . ACCEPT DIA FROM DAY-OF-WEEK. así que voy a explicar las mas comunes a continuación: Recordad que lo que se explica aquí puede ser válido tanto paraACCEPT como para DISPLAY.. etc . ACCEPT FECHA FROM DATE.. El 4 nos indicaría que el día de la semana sería Jueves. la línea. PROCEDURE DIVISION. ACCEPT variable CLAUSULAS .. FECHA8=19990701 DIA=4... y LINE variable.. el terminal.... La lista de cláusulas es muy larga. constante numérica. 77 DIA PIC 9.999. Nota: Si usarames éste programa el día 1 de Julio de 1. . puede ser una variable o un número. ON EXCEPTION variable instrucción. Formato para aceptar datos por el teclado. tendremos siempre en cuenta que la línea 1 será la primera de arriba de la pantalla. (ACCEPT Y DISPLAY) le indicamos la línea donde se aceptará el campo. .. y por desgracia algunos compiladores pueden tener mas que otros.. . normalmente podremos trabajar con 24 líneas.saber información sobre el sistema sobre el que trabajamos. INICIO. WORKING-STORAGE SECTION. 77 FECHA PIC 9(6). el valor de las variables sería: FECHA=990701. ACCEPT FECHA8 FROM CENTURY-DATE.

(ACCEPT) conseguiremos que la espera para introducir el campo sea limitada y vendrá dada por el valor que le asignemos. (ACCEPT Y DISPLAY) con ésta opción le indicamos si queremos o no que emita un pitido al llegar al comando. Si no se especifica tomará el valor 1. constante numérica. constante numérica. en la pantalla no salen los datos que vamos introduciendo. (ACCEPT Y DISPLAY) si aparece ésta cláusula. TIME variable. el valor de la variable asociada a CURSOR será de 10. LOW. El valor se indica en centésimas de segundo. POSITION variable. Por ejemplo si aceptamos un campo de PIC X(40) y solo rellenamos 9 caracteres. ERASE EOS. (ACCEPT Y DISPLAY) le indicamos que borre toda la página desde la posición de la línea en la que estamos. NO BEEP. | . (ACCEPT) si especificamos ésta cláusula. CURSOR variable. Por defecto sonará. OFF hace que los datos que introducimos no se vean. (ACCEPT Y DISPLAY) le indicamos el nivel de luminosidad con que se acepta el campo. OFF.y y y y y y y y y y Si no se específica tomará la referencia de la siguiente línea en la que estemos. BEEP. ERASE. haremos que se borra toda la pantalla. (ACCEPT Y DISPLAY) le indicamos que borre la línea sobre la que estamos desde la posición del ACCEPT. TAB. Si no indicamos ninguna el sistema coge HIGH por defecto. se utiliza cuando queremos aceptar una contraseña o alguna clave. (ACCEPT) la presencia de ésta cláusula hace que no salte al siguiente campo hasta que no pulsemos ENTER. (ACCEPT Y DISPLAY) aquí le indicamos la columna dentro de la línea y sus valores pueden ser desde 1 (izquierda) hasta 80 (derecha) de la pantalla. el campo que aceptemos parpadeará. LOW sin brillo. BLINK. Por defecto al introducir el número de caracteres o dígitos del campo salta automáticamente. solo puede ir especificado uno:HIGH con brillo. En algunos terminales es posible capturar 132 columnas. ERASE EOL. el sistema guardará en la variable la posición donde se ha terminado la introducción de los datos. COL. COLUMN. HIGH.

se hará negro sobre blanco. Es muy aconsejable cuando estamos modificando datos. si normalmente es blanco sobre negro. Es bastante útil ya que el usuario puede ver claramente la longitud del campo. lo ignore. mientras se acepta saldrán los guiones bajos para indicar el tamaño pero al salir del campo se volverá a displayar y éstos guiones desaparecerán. e introducimos un valor no aplicable. (ACCEPT) variamos el tamaño de la variable que teníamos declarado. CONTROL tipo de control. ECHO. CONVERT. UPDATE. (ACCEPT) hace que el valor actual del campo aparezca y al aceptar podamos modificar sobre su contenido actual. (ACCEPT Y DISPLAY) ésta cláusula es . Por ejemplo si definimos una variable con PIC X(40) y le indicamos al aceptarla SIZE 10. pues en su color inverso. Por ejemplo si introducimos una letra en un campo numérico será ignorada siCONVERT aparece. (ACCEPT Y DISPLAY) conseguimos que el campo que aceptamos se vea en video inverso. REVERSE. constante numérica.Instr. Es decir si le hemos puesto PROMPT ECHO. de Pantalla página(s) : 2/3 (5792 palabras totales en este texto) (68602 Lecturas) y y y y y y y PROMPT carácter. SIZE variable. (ACCEPT) conseguimos que rellene con algún carácter específico o por defecto el cursor bajo (_) la longitud del campo que vamos a aceptar. y si tenemos otros colores. (ACCEPT) con ésta cláusula hacemos que vuelva a "pintar" el contenido del campo después de aceptado. (ACCEPT Y DISPLAY) con ésta cláusula conseguimos que si estamos aceptando un campo numérico o alfabético. solo aceptará 10 caracteres para esa variable.

(ACCEPT) obligamos a que una vez empecemos a introducir un campo. el valor de la tecla se guardará en la variable que definamos y a continuación podremos realizar una instrucción. (ACCEPT) con éstas opciones obligamos a que el valor del campo aceptado esté en Mayúsculas (UPPER ) o Minúsculas (LOWER). UPPER. Pero todo esto se ve mejor con los ejemplos que a continuación voy a indicar. etc. Su uso puede variar según los compiladores. (ACCEPT) con ésta opción obligamos al usuario a que no deje el campo en blanco e introduzca cualquier dato. Decir que la variable debe de estar definida con PIC 9 COMP-1. REQUIRED. (ACCEPT y DISPLAY) cláusula propia de Acucobol con la que conseguimos aceptar el campo con un determinado color dependiendo de una tabla para asignación de colores. colores. el valor que se le debería de asigna a la cláusula COLOR será de 258 (256 fondo blanco + 2 letra azul). Mas abajo encontrareis mas información. FULL. mientras no introduzcamos los 30 caracteres no nos dejará seguir. . debemos de sumar las dos cantidades correspondientes a la letra y al fondo. Color Negro Azul Verde Celeste Rojo Morado Marrón Blanco Letra Fondo 1 32 2 64 3 96 4 128 5 160 6 192 7 224 8 256 Observaciones Para conseguir los colores. es decir si aceptamos una variable con PIC X(30). Por ejemplo si estamos aceptando un campo con PIC X(40) y cuando estamos metiendo su valor pulsamos la tecla escape. es decir que no es reconocida dentro de la tabla de caracteres admitida. si tenemos ésta cláusula puesta la variable tomará el valor 27 (correspondiente a la tecla escape) y a continuación se ejecutaría la instrucción que hubiéramos puesto. este no se acepte hasta que esté completo. ON EXCEPTION variable instrucción (ACCEPT) si al aceptar el campo introducimos una de las teclas que causa excepción. LOWER.y y y y y bastante amplia y en ella podemos atribuir otras opciones como caracteres gráficos.. COLOR. por ejemplo si queremos el fondo blanco y la letra azul.

77 CODIGO PIC 9(5). WORKING-STORAGE SECTION.. brown y cyan). red. El formato es el siguiente: CONTROL "FCOLOR=color.. BCOLOR=WHITE" ON EXCEPTION ESCA MOVE 1 TO QW.. directamente desde laPROCEDURE DIVISION y con el comando ACCEPT propio de Cobol. Formatos Windows (100&100) de ACCEPT en Acucobol: Con Acucobol (y hablo de él.. 77 ESCA PIC 9 COMP-1.. green. . Voy a explicar algunos de los atributos que se pueden utilizar cuando la frase CONTROL se especifica en ACCEPT o DISPLAY.. 77 NOMBRE PIC X(30).. color de fondo y la gama de colores igual que la anterior. color de primer plano. INICIO. por ser el que utilizo en la actualidad) se permite aceptar cualquier control gráfico típico de windows... y y FCOLOR. utilizaremos los nombres de los colores (white.. . magenta. . black. Evidentemente cambia un poco sobre todo porque las cláusulas o propiedades son mucho mas amplias. BCOLOR. ACCEPT NOMBRE LINE 10 COL 20 PROMPT LOW REVERSE ECHO CONTROL "FCOLOR=BLUE...TIPOS DE CONTROL. 77 QW PIC 9.. PROCEDURE DIVISION.. como un ENTRYFIELD. . Nota: Con el primer ACCEPT conseguiriamos introducir un valor en ..... ACCEPT CODIGO LINE 12 COL 20 CONVERT. blue.".

. etc . F2. (1/3) | Instr. Algunos compiladores como Acucobol han implementado la siguiente opción: ACCEPT OMITTED. gracias a ECHO. Con ella mostraremos cualquier texto. es la instrucción que usaremos como salida de datos en pantalla.la variable NOMBRE. este se volverá a mostrar tal y como va a quedar. de Pantalla página(s) : 3/3 (5792 palabras totales en este texto) (68602 Lecturas) DISPLAY.. F3 tomará el valor 1. Si pulsamos ENTER (13) ESCAPE (27). Teneis que tener en cuenta que algunas de las cláusulas que explico es posible que no funcionen en todos los compiladores. cualquier constante . Muchas veces cuando se muestra un mensaje. cualquier variable. Tabular (9). se acepta una variable a continuación solo para dar tiempo al usuario. La siguiente orden nos permitirá aceptar la variable CODIGO en la cual los carácteres no numéricos no se admitirán al llevar la clásusula CONVERT. Os aconsejo que hagáis todo tipo de pruebas con las opciones disponibles hasta que el resultado sea el que deseáis. 2. esta se guardaría en la variable ESCA y luego podríamos preguntar por su valor. así como es posible que existan otras que yo desconozca debido a que son usadas por otros compiladores. Por ejemplo si pulsamos F1. lo aceptaremos en brillo suave con video reverso y una vez introducido el campo. 3. Además se aceptará en color azul con fondo blanco y si pulsamos una de las teclas que causan excepcion según los valores permitidos. y así no tenemos que definir ninguna variable.

DISPLAY variable. . BCOLOR. también se utiliza para crear y borrar las pantallas virtuales con las que Cobol puede trabajar. su explicación la obtendréis arriba.. TIPOS DE CONTROL.. Existe una tabla para asignar los valores. la "m" nos da la vertical (Alt+179 (¦)) Aqui no se ven bien. con lo que solo las indicaré. Además de los vistos en ACCEPT y DISPLAY podemos utilizar otros: CONTROL "FCOLOR=color.. según una tabla es posible utilizar caracteres semigráficos en cualquier sistema.. . 77 NOMBRE PIC X(30).. ERASE.. os podeis ir a la sección que existe específica para ello en TEMATICOS. COL..o cualquier valor. BEEP.. REVERSE.... Mas abajo hablaré un poco de todo esto que os digo y de su futuro. En RM/Cobol. por determinados compiladores y no sería justo pensar que su única función es la que voy a explicar aquí. Todos funcionan igual que con la sentencia ACCEPT.. . LOW. y LINE. BLINK. SIZE. GRAPHICS. y y y y FCOLOR. literal CLAUSULAS . pero para ver su uso.. PROCEDURE DIVISION. . De todas maneras ésta instrucción está siendo implementada en muchos mas campos. WORKING-STORAGE SECTION. lo que si es cierto es que ésta es la común a todos los compiladores. WINDOW-REMOVE. HIGH. gracias a ésta cláusula podemos conseguir esos carácteres... igual que en ACCEPT. Las cláusulas asociadas a esta instrucción son practicamente las mismas que hemos visto para ACCEPT. Cuando programamos en MS-DOS. estos caracteres se pueden asignar muy facilmente pero al trabajar con sistemas UNIX-LINUX.. WINDOW-CREATE. igual que en ACCEPT..".. por ejemplo la "q" nos da la linea horizontal (Alt+196 (-)) con la que se forman los cuadros. en resumidas es la instrucción para que aparezca lo que sea en pantalla.

os podeis ir a la sección que existe específica para ello TEMATICOS. LINES variable. DISPLAY "INTRODUZCA EL NOMBRE" LINE 10 COL 10 REVERSE. . ... .. Otros formatos de DISPLAY: DISPLAY nombre de pantalla CLAUSULAS .. pero para ver su uso.. en todos los ACCEPT y DISPLAYque vayamos a utilizar mientras queramos mantener éste formato. hasta que se encuentre el compilador con otra linea que lo cambie. (No todos los compiladores). DISPLAY " " LINE 1 ERASE CONTROL "FCOLOR=BLUE. longitud de la línea (horizontal). O sea que no será necesario seguir incluyendo la cláusula CONTROL.. se incorporan además éstas cláusulas: y y SIZE variable.INICIO. como con BCOLOR. ACCEPT NOMBRE LINE 10 COL 34 PROMPT LOW ECHO.. conseguimos dibujar una línea vertical u horizontal donde le indiquemos con las cláusulas correspondientes.. DISPLAY LINE CLAUSULAS .. altura de la línea (vertical). constante numérica. constante numérica. BCOLOR=WHITE". es que los colores que tomen seguirán activos hasta encontrar otra orden que los cambie. Nota: Una cosa a tener en cuenta tanto con FCOLOR.. DISPLAY WINDOW CLAUSULAS . 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. en Acucobol se utiliza para crear las ventanas virtuales con las que Cobol puede trabajar. podemos mostrar una pantalla completa que previamente hayamos definido en la SCREEN SECTION.

pero no todos los compiladores lo tienen implementado. Os aseguro que es muy grato obtener resultados Windows.. Necesitaría una sección unica y exclusivamente para la programación gráfica. constante numérica. igual a la anterior per conseguimos dibujar un cuadro. CENTERED. altura del cuadro (vertical). STANDARD WINDOW. TOP.. pero todo se andará. Pero es un tema demasiado amplio para tratarlo desde aquí. BITMAP. ha conseguido implementar a la orden DISPLAY la potencia necesaria para displayar ventanas Windows (100%100) así como cualquier tipo de control. LINES variable. anchura del cuadro (horizontal). LEFT posición que ocupará el título dentro del cuadro. Instr. Formatos Windows (100&100) de DISPLAY en Acucobol: Acucobol en su afán por conseguir una programación totalmente integrada con los sistemas gráficos. Hoy podemos con una linea de código displayar un COMBOBOX. constante alfanumérica. y asignarle cualquiera de sus propiedades. etc. título del cuadro.DISPLAY BOX CLAUSULAS . ENTRY-LABEL. FRAME. programando directamente con el editor de MS-DOS (ese azul con muy pocas opciones) sin necesidad de ninguna herramienta externa.. TITLE variable. que también existe. PUSH-BUTTON. de Variables . Se incorporan además éstas cláusulas: y y y y SIZE variable... muy útil. FLOATING WINDOW. constante numérica. RIGHT. BUTTON. LABEL.

Si además el campo al que se mueven los datos es de edición. De todo se verá al final una serie de ejemplos bien detallados. Con el primer formato las variables que siguen al TO tomarán el dato de la variable o del valor que le preceden. variable.página(s) : 1/5 (5707 palabras totales en este texto) (74243 Lecturas) Daré cabida en esta sección a la explicación de todas las instrucciones que hacen referencia a las variables y sus valores. es la instrucción que usaremos para enviar datos de una variable a otra u otras. valor TOvariable. respetando la posición del punto decimal si lo hubiera. ya sea procedente de otra variable o bien desde un valor fijo o constante. Siempre tendremos una serie de normas o restricciones para asegurarnos de que los valores han pasado correctamente.. Como todas. y Los campos numéricos siempre se van a alinear a la derecha. evidentemente se perderán los que no quepan y si es mas grande el resto se pondrá a ceros.. MOVE. Si la variable que recibe el campo es mas pequeña. este grupo de instrucciones tiene su vital importancia en la programación y son usadas habitualmente. Estos son los dos formatos que posee: Formato 1: MOVE variable. variable.. Lo que en realidad hace es que la una variable adquiera un valor determinado. . al hacer el .

al definirla. . 77 NUMERO2 PIC 9(8)V99. éste sería el resultado: NUMERO1=001536 NUMERO2=0000153600 (La coma decimal es virtual) NUMERO3= 1.. este a su vez se formateará con la edición declarada en laWORKING..536. una justificación a la derecha (JUST RIGHT)..ZZ. MOVE TEXTO1 TO TEXTO2 TEXTO3. 77 TEXTO2 PIC X(10).ZZZ. WORKING-STORAGE SECTION. 77 NUMERO1 PIC 9(6). . MOVE NUMERO1 TO NUMERO2 NUMERO3. 77 TEXTO3 PIC X(20) JUST RIGHT. 77 TEXTO1 PIC X(15) VALUE "LENGUAJE COBOL". Si son alfanuméricos la alineación se efectuará a la izquierda a menos que se haya especificado en la WORKING..paso del valor.. 77 NUMERO3 PIC ZZZ. PROCEDURE DIVISION. . Nota: Después de aplicar estas sentencias.00 TEXTO1=LENGUAJE COBOL TEXTO2=LENGUAJE C TEXTO3= LENGUAJE COBOL Formato 2: .. INICIO. MOVE 1536 TO NUMERO1. Al igual que en los numéricos si es mas pequeño se perderán los caracteres que no quepan y si es mas grande el resto irá relleno de espacios en blanco.

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

. PROCEDURE DIVISION. . es decir pondrá a ceros todas las variables numéricas o de edición y a espacios en blanco las alfabéticas y alfanuméricas... INICIO. . Nota: Después de hacer INITIALIZE el valor de TEXTO será igual a espacios y el de NUMERO igual a ceros. 77 NUMERO PIC 9(8) VALUE "12345678". No funciona con campos definidos como FILLER. Es el mismo resultado que utilizar MOVE haciendo uso de las CONSTANTES FIGURATIVAS que vimos en la Introducción de los manuales: . WORKING-STORAGE SECTION. 77 TEXTO PIC X(10) VALUE "HOLA MUNDO". el resultado es el que queríamos. de Variables página(s) : 2/5 (5707 palabras totales en este texto) (74243 Lecturas) INITIALIZE. Y puede ser muy útil para inicializar tablas completamente cuando nos referimos al nivel mas alto de la misma. se utiliza para inicializar variables según su descripción.. . Instr. (evidente).. INITIALIZE TEXTO NUMERO.NOMBRE=ANDRES MON Fijaros que aunque el orden ni el tamaño era el mismo..

INSPECT. reemplazar o contar y reemplazar caracteres o grupos de caracteres dentro de un campo. así que vamos a ver cada uno de ellos por separado. y y y y CHARACTERS.MOVE SPACES TO TEXTO. (Se puede repetir de nuevo) Este formato es el utilizado para contar el número de veces que aparece Identificador1 en el campo1 y guardará el valor en la variable1 que previamente hayamos definido en la WORKING. etc . indica que tiene que buscar la cadena especificada en Cadena2. pero en el segundo teníamos que saber de que tipo eran las variables para moverles SPACES o ZEROS.. indica que cuente todos los caracteres del campo incluso los espacios en blanco. BEFORE INITIAL. busca solo hasta que aparezca la cadena especificada como Cadena1. mientras que en el primer caso. Se puede contar las veces que aparece un caracter.. indica que tiene que buscar en todos los caracteres del campo. LEADING. . Esta instrucción tiene formatos diferentes según lo que se desee hacer. esta sentencia se utiliza para contar. ALL. Formato 1: INSPECT campo1 TALLYING variable1 FOR ( CHARACTERS) (( BEFORE/AFTER) INITIAL) Cadena1 (ALL)(LEADING) Cadena2 . si nada mas empezar es diferente el resultado sera directamente 0. la cadena especificada en Cadena2. El resultado es el mismo en ambos casos... o cambiar todos esos caracteres por otros. pero solo hasta que encontremos uno diferente. MOVE ZEROS TO NUMERO. es el compilador quien se encarga se saber el tipo de la variable.

. . INSPECT TEXTO TALLYING CONTA FOR LEADING "A". Veamos unos ejemplos para salir de dudas. PROCEDURE DIVISION. . El valor de conta será de 15 que son los caracteres que tiene la variable TEXTO.. INSPECT TEXTO TALLYING CONTA FOR ALL "A" BEFORE INITIAL "N".. . INSPECT TEXTO TALLYING CONTA FOR CHARACTERS. .....y AFTER INITIAL. empieza a buscar justo después de la cadena especificada en Cadena1.. . WORKING-STORAGE SECTION.. INICIO. El valor de conta será de 1 que son las veces que aparece la letra A en la variable TEXTO hasta la aparición del caracter N. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL".. El valor de conta será de 0 porque no aparece ninguna A en el primer carácter de 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 ALL "A" . Primero vamos a definir unaWORKING-STORAGE. .. 77 CONTA PIC 9(8).

. PROCEDURE DIVISION.AFTER INITIAL "G". WORKING-STORAGE SECTION.. que indicaría que solo se reemplazaría la primera vez que coincidieran las condiciones.. El valor de conta será de 1 que son las veces que aparece la letra A en la variable TEXTO. . El tamaño de la sustitución debe de ser igual al tamaño sustituido. INSPECT TEXTO REPLACING CHARACTERS BY "H". . INICIO. de Variables página(s) : 3/5 (5707 palabras totales en este texto) (74243 Lecturas) Formato 2: INSPECT campo1 REPLACING variable1 CHARACTERS BY Cambio1 (( BEFORE/AFTER) INITIAL)Cadena1 (ALL)(LEADING)( FIRST) Cadena2.. ya que la variable campo1 no puede cambiar su tamaño. .. empezando a contar desde el caracter G.. (Se puede repetir de nuevo) Con este formato podemos cambiar caracteres de Campo1.. Se ha incluido solo FIRST. .. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". su funcionamiento es igual que el anterior formato solo que en vez de contar reemplaza. Instr. 77 CONTA PIC 9(8).

Aquí hemos mezclado ambos formatos y el resultado es el siguiente. INSPECT TEXTO REPLACING ALL "PA" BY "--" AFTER INITIAL "G" BEFORE INITIAL "T". INSPECT TEXTO REPLACING FIRST "A" BY "O".. El valor de TEXTO será "PIGINI DE COBOL". .. es decir cambia todos los caracteres por el caracter H.. es decir se cambia todas las PA por -.... MOVE "PAGIPATOPETOPA" TO TEXTO.. El valor de TEXTO será "POGINA DE COBOL". INSPECT TEXTO REPLACING ALL "A" BY "I".pero empezando a buscar a partir de la primera letra G y justo hasta la letra T. El valor de CONTA es 3 que son las veces que aparece la cadena PA en TEXTO y después se ejecuta el REPLACING y el resultado da que TEXTO vale PAGIPATOPEPOPA. . El valor de TEXTO será "HHHHHHHHHHHHHHH".. Formato 3: . INSPECT TEXTO TALLYING CONTA FOR ALL "PA" REPLACING ALL "TO" BY "PO" AFTER INITIAL "OP". ya que ha cambiado todos los TO por PO pero después de la cadena OP.. es decir ha cambiado todas las A por I. . Complicando un poco mas. MOVE "PAGIPATOPETOPA" TO TEXTO. .. el valor de TEXTO despueés de la sentencia INSPECT será PAGI--TOPETOPA. solo cambia la primera A por una O..

PROCEDURE DIVISION.. . convertirá todas las A por 1 y todas las O por 2.. Para finalizar con el comando INSPECT.. . ... INSPECT TEXTO CONVERTING "AO"TO "12".. . decir que es un comando muy particular y cada uno deberá decidir en cada momento y con que situaciones utilizarlo. INSPECT TEXTO CONVERTING " ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" TO "abcdefghijklmnñopqrstuvwxyz". El valor de TEXTO será "P1GIN1 DE C2B2L". respetando el orden. de nuevo) (Se puede repetir Con este formato convertimos los caracteres que se especifiquen en identificador1 por los que pongamos en identificador2. El valor de TEXTO será "pagina de cobol" ya que ha convertido todas las letras mayúsculas por minúsculas. Veamos algunos ejemplos. .. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL"..INSPECT campo1 CONVERTING Identificador1 TO Identificador2 (( BEFORE/AFTER) INITIAL) Cadena1 .. INICIO.. se suele utilizar mucho para que al aceptar un campo nos de igual se ha sido introducido en mayúsculas o en minúsculas ya que lo convertiriamos a alguno de los formatos. WORKING-STORAGE SECTION.

Ese identificador1 debe estar definido como binario. se utiliza para unir o concatenar campos o partes de estos y el resultado almacenarlo en otro campo. INTO. STRING campo1. NOT ON OVERFLOW. se ejecutaría Sentencia1 si hubiera habido un error al hacer la concatenación. literal2)(SIZE) INTO Campo3 (WITH POINTER Identificador1) ( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2) y y y y y y DELIMITED BY. ON OVERFLOW. En la unión se pueden incluir tanto variables como literales o constantes de texto. si incluimos esta cláusula el valor de identificador1 será en la posición en que empezará a contener datos la variable que recibe el STRING. por ejemplo si se especifica Identificador1 con un valor superior al tamaño del Campo3.Instr. WITH POINTER. campo3. ya que al encontrarse la primera L hubiera parado. indica que se pasará todo el contenido del campo1 o literal1 sin limitaciones. se ejecutará Sentencia2 si no existe error en la operación. indica hasta donde vamos a "coger" del campo para concatenar sin contar ese caracter o cadena que se especifique en campo2 o literal2. SIZE. literal1 DELIMITED BY (campo2. de Variables página(s) : 4/5 (5707 palabras totales en este texto) (74243 Lecturas) STRING. con esto indicamos en que variable se guardará el resultado. . es decir si tenemos un campo con un valor = "HOLA" y especificamos DELIMITED BY "L" a la hora de la concatenación nos hubiera cogido solo el HO. Por defecto el valor es 1.

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

STRING "HOY ES " DIA " DE " DELIMITED BY SIZE TMES (MES) DELIMITED BY " " " DE " ANIO DELIMITED BY SIZE INTO CONSTRING WITH POINTER PUNTO. . El valor de LAFECHA sería: HOY ES 22 DE JUNIO El valor de CONSTRING sería: HOY ES 22 DE JUNIO DE 2001. si hubieramos querido coger otra limitación para un campo en concreto habría que haberlo especificado. que al poner DELIMITED BY " " los ha evitado porque solo ha concatenado hasta que ha encontrado el primer caracter en blanco. 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. MOVE 4 TO PUNTO. 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. por ejemplo vamos a afinar mas el ejemplo y conseguir que entre el mes JUNIO y el DE no exista mas que un espacio. La cláusula DELIMITED BY se ha puesto al final porque dicha cláusula se aplica a todos los campos que la preceden. Como veis la diferencia está en los espacios que le sobran al mes. El valor que tendrá ahora CONSTRING será el siguiente: HOY ES 22 DE JUNIO DE 2001. DE 2001.

Igual que en STRING. es decir divide el contenido de un campo en otros. hace exactamente lo contrario de que hemos visto que hacía STRING... Si el valor de CONSTRING previamente era espacios habría dejado 3 espacios en blanco y si hubiera sido cualquier otro hubiera respetado los 3 primeros caracteres que tuviera. literal2)(ALL) (Se puede repetir de nuevo) INTO Campo3.. de Variables página(s) : 5/5 (5707 palabras totales en este texto) (74243 Lecturas) UNSTRING. es igual que DELIMITED y se utiliza si hay varios delimitadores . literal2)(ALL) OR (campo2.El valor que tendrá ahora CONSTRING será el siguiente: HOY ES 22 DE JUNIO DE 2001. solo que con la función a la inversa. literal1 DELIMITED BY (campo2. . OR. Instr. ( DELIMITER Identificador1) ( COUNT Identificador2) (Se puede repetir de nuevo) (WITH POINTER Identificador3) (TALLYING Identificador4) ( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2) y y DELIMITED BY. Es decir habrá empezado a concatenar a partir de la posición 4 del campo CONSTRING. indica el límite hasta donde vamos cogiendo el campo1 para partirlo. Campo4. UNSTRING campo1.

. 01 FECHA. cuenta el número de caracteres incluidos en la fragmentación. POINTER. 02 DIA PIC 99. DELIMITER y COUNT. 02 ANIO PIC 9999. se podrán usar si se ha especificado DELIMITED. se ejecutará Sentencia2 si no existe error en la operación. COUNT. INTO. se ejecutaría Sentencia1 si hubiera habido un error al hacer la operación. 02 FILLER PIC X(30) VALUE "ENERO FEBRERO MARZO ". WORKING-STORAGE SECTION. ON OVERFLOW. va a contener en cada caso el elemento separador. Podemos usar tantos DELIMITER y COUNT como campos se vayan a crear en la fragmentación. si especificamos esta opción la instrucción nos guardará en Identificador4 el número de campos que se han utilizado en la fragmentación. es decir desde el primer caracter.y y y y y y y y sobre los que buscar. si hemos incluido enDELIMITED varios. por defecto su valor es 1. Vamos a hacer lo contrario de antes y conseguir una fecha numérica de una frase con la fecha: . . indica en que campo o campos se guardará la información que vaya fragmentando. 02 FILLER PIC X(30) VALUE "ABRIL MAYO JUNIO ".. indica desde que posición va a ser examinado el campo que desea desfragmentar. TALLYING. NOT ON OVERFLOW. DELIMITER. 01 CONSTRING PIC X(40). 01 TABLAMES. Identificador1 guardará el carácter que de los elegidos ha sido el causante de la fragmentación. 02 MES PIC 99. 01 LAFECHA PIC X(30) VALUE "HOY ES 22 DE JUNIO DE 2001".

02 FILLER PIC X(30) VALUE "JULIO AGOSTO SEPTIEMBRE"... 02 TEXTO3 PIC X(20). Después de aplicar las instrucciones siguientes el contenido de los campos sería el siguiente:        TEXTO1 = HOY TEXTO2 = ES TEXTO3 = DE TEXTO4 = DE ELMES = JUNIO DIA = 22 ANIO = 2001 . PROCEDURE DIVISION. 02 TMES PIC X(10) OCCURS 12 TIMES. 02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ". El valor de LAFECHA era: HOY ES 22 DE JUNIO DE 2001.. PERFORM VARYING CONTA FROM 1 BY 1 UNTIL ELMES = TMES (CONTA) OR CONTA = 12 TALLYING PALABRAS END-PERFORM . 01 TEXTOS. UNSTRING LAFECHA DELIMITED BY " " INTO TEXTO1 TEXTO2 DIA TEXTO3 ELMES COUNT LETRAS TEXTO4 ANIO. 01 LATABLA REDEFINES TABLAMES.. 01 LETRAS PIC 99. INICIO. 02 TEXTO1 PIC X(20). 02 ELMES PIC X(10). 02 TEXTO4 PIC X(20). 01 CONTA PIC 99. . 02 TEXTO2 PIC X(20). 01 PALABRAS PIC 99.

01 NOMBRE PIC X(20).. Aquí conseguimos separar cada apellido y el nombre en campos diferentes. 01 TEXTO PIC X(30) VALUE "MONTES ROBLES. PROCEDURE DIVISION. 01 SEPARA PIC X. WORKING-STORAGE SECTION. ANDRES". " INTO APELLI1 APELLI2 NOMBRE. Vamos a hacer un ejemplo de como podríamos separar un nombre completo.. Podiamos haber puesto un COUNT para cada una. INICIO. NOMBRE) . 02 NOM PIC X. . La variable LETRAS ha guardado el número de caracteres que ha cogido en la separación que ha guardado en ELMES. que han sido 5 (JUNIO). 02 AP1 PIC XX.E. 01 SEGURIDAD. en este caso 7. 01 APELLI2 PIC X(20).: .D. UNSTRING TEXTO DELIMITED BY " " OR ". El PERFORM de después lo hemos hecho para encontrar en la tabla la posición que ocupaba el nombre del mes y así poder construir la variable FECHA completa en númerico. APELLI2.. 01 APELLI1 PIC X(20). (APELLI1. por ejemplo para el nuevo modelo de la Seguridad Social (en España) y el sistema R. 02 AP2 PIC XX..   FECHA = 22062001 LETRAS = 5 PALABRAS = 7 La variable PALABRAS nos ha guardado el número de variables utilizadas en la fragmentación.

sino comenzar a explicarla. Es una instrucción 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.MOVE APELLI1 TO AP1 MOVE APELLI2 TO AP2 MOVE NOMBRE TO NOM. Válido para el sistema RED. . nunca los toméis como programas completos y con una lógica aplastante. Pero creo que lo importante no es tanto hablar de ella. además nos puede hacer mucho mas sencillo el realizar una programación estructurada. Es la instrucción mas importante tanto por su variedad de formatos. . Aquí la variable SEGURIDAD tendría el valor: MOROA. no cabe duda que es debido al uso de ésta instrucción. Instrucción Perform página(s) : 1/4 (8338 palabras totales en este texto) (57303 Lecturas) Creo que por méritos propios esta instrucción se merece un apartado para ella sola.. Empecemos a ver sus formatos desde el mas simple al mas complicado: Siempre debéis de tener en cuenta que los ejemplos son solo para aclarar la explicación. Cuando decimos que un programa está estructurado.. como por el número de veces que se suele usar dentro de un programa.

ACCEPT OP LINE 20. cuando éste termine vuelve el control a la instrucción que sigue al PERFORM . PROCEDURE DIVISION. DISPLAY 'HOLA ' LINE 10. STOP RUN. 01 OP PIC X.. PERFORM PIDENOMBRE. DISPLAY 'INTRODUZCA EL NOMBRE . WORKING-STORAGE SECTION. 01 NOMBRE PIC X(30). ACCEPT NOMBRE LINE 20 COL 30 PROMPT.. INICIO. PERFORM nombre_parrafo . DISPLAY SPACES LINE 20 SIZE 70..Formato 1: Con este formato transferimos el control del programa a un párrafo. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.. DISPLAY NOMBRE LINE 10 COL 6. 01 APELLIDO PIC X(12). Formato 2: Una extensión del anterior es indicarle que ejecute mas de un párrafo.. 01 OP PIC X. especificando el inicio y el fin... . 01 NOMBRE PIC X(12). . WORKING-STORAGE SECTION. PERFORM nombre_parrafo THRU nombre_parrafo . Nota: Simplemente hemos hecho que el programa salte a un párrafo que lo ejecute y que vuelva el control a la secuencia. PIDENOMBRE. PROCEDURE DIVISION.' LINE 20.

DISPLAY SPACES LINE 21 SIZE 70. Nota: En este caso PIDENOMBRE y PIDEAPELLIDO van seguidos. PIDEAPELLIDO. DISPLAY SPACES LINE 20 SIZE 70. . DISPLAY 'INTRODUZCA EL APELLIDO . Instrucción Perform página(s) : 2/4 (8338 palabras totales en este texto) (57303 Lecturas) Formato 3: Seguimos ampliando las capacidades. DISPLAY APELLIDO LINE 10 COL 20. STOP RUN. DISPLAY 'INTRODUZCA EL NOMBRE .. ACCEPT APELLIDO LINE 21 COL 30 PROMPT. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. PIDENOMBRE.. DISPLAY 'HOLA ' LINE 10. pero al poner el THRU lo que conseguimos es que el control no se devuelva hasta llegar al párrafo indicado después del THRU. ACCEPT OP LINE 20..' LINE 21.' LINE 20.INICIO. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. ACCEPT NOMBRE LINE 20 COL 30 PROMPT. Es decir que entre PIDENOMBRE y PIDEAPELLIDO podrá haber cinco párradosmas y todos ellos se hubieran ejecutado.. DISPLAY NOMBRE LINE 10 COL 6. ahora conseguimos que .

PERFORM nombre_parrafo THRU nombre_parrafo númerovariable TIMES .. DISPLAY NOMBRE LINE LI COL 6. DISPLAY SPACES LINE 21 SIZE 70. Ya os he dicho al principio que los ejemplos pueden no ser muy lógicos. DISPLAY SPACES LINE 20 SIZE 70. STOP RUN. INICIO. PERFORM SALUDAR 3 TIMES. Nota: Ahora hemos conseguido que el saludo nos lo muestre 3 veces.. DISPLAY 'INTRODUZCA EL NOMBRE . 01 APELLIDO PIC X(12).' LINE 21.el PERFORM se realice tantas veces como se indique en el número o variable que va delante de TIMES.. 01 LI PIC 99 VALUE 10.' LINE 20.. ACCEPT APELLIDO LINE 21 COL 30 PROMPT. WORKING-STORAGE SECTION. Por supuesto THRU y TIMES pueden ir perfectamente juntos. . DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. DISPLAY APELLIDO LINE LI COL 20. PIDEAPELLIDO. SALUDAR. 01 NOMBRE PIC X(12). DISPLAY 'HOLA ' LINE LI. DISPLAY 'INTRODUZCA EL APELLIDO . 01 OP PIC X.. PIDENOMBRE. PROCEDURE DIVISION. ACCEPT NOMBRE LINE 20 COL 30 PROMPT. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. pero si hacen la función .. ACCEPT OP LINE 20. ADD 1 TO LI.

. SALUDAR. PERFORM SALUDAR UNTIL LI = 15. INICIO. DISPLAY 'INTRODUZCA EL NOMBRE . 01 NOMBRE PIC X(12). ACCEPT NOMBRE LINE 20 COL 30 PROMPT.de explicación. DISPLAY SPACES LINE 20 SIZE 70. Formato 4: Igual que el antrior formato solo que el número de veces que se ejecute dependerá de una condición y no de un número fijo.. ACCEPT APELLIDO LINE 21 COL 30 PROMPT. PROCEDURE DIVISION.. DISPLAY 'INTRODUZCA EL APELLIDO . ADD 1 TO LI. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. DISPLAY NOMBRE LINE LI COL 6. PIDEAPELLIDO. PIDENOMBRE. DISPLAY SPACES LINE 21 SIZE 70. 01 LI PIC 99 VALUE 10..' LINE 21. Nota: En este caso el compilador comprueba antes de iniciar el PERFORMque la condición no se cumple para ejecutarla. . 01 APELLIDO PIC X(12).. WORKING-STORAGE SECTION. 01 OP PIC X. DISPLAY APELLIDO LINE LI COL 20. ACCEPT OP LINE 20.' LINE 20. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. STOP RUN... DISPLAY 'HOLA ' LINE LI. PERFORM nombre_parrafo THRU nombre_parrafoUNTIL condición .

para finalizar la instrucción nos basamos en END-PERFORM. PERFORM número-variable TIMES sentencias END-PERFORM . Veamos un ejemplo de ello con los dos últimos formatos explicados anteriormente. Hasta ahora se ha explicado una manera de utilizar la sentencia PERFORM en la que el control pasa a otro lugar del programa. En el ejemplo ejecutará elPERFORM hasta que la variable LI alcance el valor 15. Como véis el STOP RUN está antes de los párrafos que han sido llamados con los PERFORM lo cual indica que éstos no se ejecutarán sino es precisamente por los PERFORM.en el momento que se cumpla salta a la siguiente instrucción. Para ello hay que tener en cuenta que la utilización del punto en las instrucciones daría lugar al fin de la instrucción y nos daría errores. Instrucción Perform página(s) : 3/4 (8338 palabras totales en este texto) (57303 Lecturas) PRIMERA CONCLUSION En los dos primeros formatos. como podréis comprobar a menos que sean instrucciones que se vayan a llamar desde nuestro programa en mas de una ocasión. es decir las instrucciones una detrás de otra y evitar el PERFORM. Si bien con esto conseguimos una estructuración para nuestro programa la instrucciónPERFORM nos permite un mayor grado de estructura incluyendo las sentencias de los párrafos llamados dentro de la propia sentencia PERFORM. por ello. éstas podían haber ido en el lugar del PERFORM.

WORKING-STORAGE SECTION.. . PIDEAPELLIDO. PROCEDURE DIVISION. . ACCEPT APELLIDO LINE 21 COL 30 PROMPT..' LINE 20... DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. ACCEPT NOMBRE LINE 20 COL 30 PROMPT. 01 OP PIC X. . 01 OP PIC X. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. DISPLAY SPACES LINE 21 SIZE 70. 01 APELLIDO PIC X(12). INICIO. 01 NOMBRE PIC X(12). DISPLAY SPACES LINE 20 SIZE 70.. 01 LI PIC 99 VALUE 10..PERFORM UNTIL condición sentencias END-PERFORM . 01 APELLIDO PIC X(12). DISPLAY 'INTRODUZCA EL APELLIDO .' LINE 21. 01 NOMBRE PIC X(12).. PIDENOMBRE. DISPLAY 'INTRODUZCA EL NOMBRE . 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. WORKING-STORAGE SECTION..

DISPLAY 'INTRODUZCA EL APELLIDO . DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. PIDEAPELLIDO.01 LI PIC 99 VALUE 10. PIDENOMBRE. como veís se consigue una visión muy clara de lo que estamos haciendo y no hay saltos de secuencia innecesarios. PROCEDURE DIVISION.' LINE 21. DISPLAY SPACES LINE 20 SIZE 70. 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. . ACCEPT APELLIDO LINE 21 COL 30 PROMPT. DISPLAY 'INTRODUZCA EL NOMBRE . ACCEPT NOMBRE LINE 20 COL 30 PROMPT. Por supuesto el COBOL permite cualquier modalidad de uso y siempre funcionaría igual..' LINE 20.. PERFORM PIDENOMBRE THRU PIDEAPELLIDO. Nota: Esta es una manera mas lógica de utilizar el PERFORM en estos formatos. DISPLAY SPACES LINE 21 SIZE 70. INICIO.. .. Como veis no puede haber puntos entre el PERFORM y el END-PERFORM puesto que eso haría terminar con error la sentencia.

PROCEDURE DIVISION. para que lo comprendáis veamos su formato y un ejemplo. porque creo que es mas aconsejable... 01 APELLIDO PIC X(12). En el ejemplo veremos este último caso. 01 OP PIC X. valor UNTIL condición sentencias END-PERFORM . PERFORM PIDENOMBRE THRU PIDEAPELLIDO. WORKING-STORAGE SECTION. 01 NOMBRE PIC X(12).Instrucción Perform página(s) : 4/4 (8338 palabras totales en este texto) (57303 Lecturas) Formato 5: En esta ocasión utilizaremos el PERFORM basándonos en un valor inicial el cual podremos y aumentar o disminuir y terminar cuando se cumpla una condición. No se si me he liado un poco con la explicación pero lo que conseguimos es ahorrarnos varias instrucciones y resumirlas en una sola. PERFORM VARYING variable FROM número. Como he explicado anteriormente podemos hacer que el PERFORM invoque a uno o varios párrafos o bien incluir el conjunto de sentencias entre PERFORM y ENDPERFORM. 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 . variable BY número. DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE. INICIO. 01 LI PIC 99.

01 OP PIC X. 01 SALUDO PIC X(30). ACCEPT NOMBRE LINE 20 COL 30 PROMPT.' LINE 20. DISPLAY 'INTRODUZCA EL APELLIDO .. PIDENOMBRE. 01 APELLIDO PIC X(12).END-PERFORM STOP RUN. WORKING-STORAGE SECTION. es decir 10. Es decir las sentencias se ejecutarían para el valor 10. que precisamente lo que propicia es eso. ACCEPT APELLIDO LINE 21 COL 30 PROMPT. podemos utilizar la sentencia EXIT.. 01 LI PIC 99. 13 y 14.. 01 CONTA1 PIC 99. La instrucción PERFORM se puede anidar tantas veces como se quiera. Si necesitamos que por alguna circunstancia finalice la ejecución de un PERFORM aún cuando la secuencia no corresponde. La instrucción realiza los siguientes pasos: Inicializa la variable LI con el valor que sigue al FROM. DISPLAY SPACES LINE 20 SIZE 70.' LINE 21.. DISPLAY SPACES LINE 21 SIZE 70. que se interrumpa la sentencia PERFORM. 11. 01 NOMBRE PIC X(12). . Para finalizar vamos a ver un ejemplo con varios PERFORM anidados: . 12. DISPLAY 'INTRODUZCA EL NOMBRE . .. a continuación va incrementado el valor de LI en 1 que es lo que va después del BY y ejecuta las sentencias que van a continuación hasta que se cumple la condición de LI = 15. teniendo en cuenta que el PERFORM contenido debe de ejecutarse completamente interno o completamente externo al que lo contiene. PIDEAPELLIDO..

. PIDENOMBRE.01 CONTA2 PIC 9(6). después de aceptar el nombre y el apellido construimos una frase y la guardamos en la variablen SALUDO utilizando el comando STRING.' LINE 20 ACCEPT NOMBRE LINE 20 COL 30 PROMPT. que como dijimos antes sería para 10... 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. 13 y 14). 11. 12. Nota: En el ejemplo como véis. A continuación y para mantener los mismos ejemplos de toda la sección hacemos que aparezca en pantalla el SALUDO 5 veces. PROCEDURE DIVISION. . . DISPLAY 'INTRODUZCA EL NOMBRE . (dependiendo del valor de LI. 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. INICIO.. PIDEAPELLIDO.

si al comenzar ya está rota la condición. PERFORM WITH TEST [AFTER . valorUNTIL condición sentencias END-PERFORM Con la opción TEST BEFORE. AUMENTANDO LAS CONDICIONES Efectivamente además de la primera condición podemos incrementar el . Con la opción TEST AFTER. incluso aunque entremos en el PERFORM con la condición rota. Como pódeis observar el único punto de toda la secuencia se haya en el STOP RUN. que es la opción por defecto se comprueba primero la condición y si se cumple se ejcuta el resto. con lo cual es posible que las sentencias no se ejecuten ninguna vez. por defecto el contenido del PERFORM se ejecuta después de hacer la comprobación de la condición que precede a UNTIL .BEFORE ] VARYING variable FROM número.Pero ahora hemos intercalado dos PERFORM dentro de éste. se ejecutan las sentencias antes de comprobar la condición. El hecho de mantener los márgenes izquierdos. variableBY número. es para dar mas claridad a la programación y conseguir que ésta sea lo mas estructurada posible. podemos desarrollar aún mas la instrucción incluyendo dos nuevos elementos. EJECUTANDO ANTES O DESPUES En primer lugar. pero podemos hacer que ésta se realice antes. AUN HAY MAS Pues sí. 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 escribiéramos el SALUDO con una máquina de escribir. con lo cual las sentencias se van a ejecutar al menos en una ocasión.

.. En esa nueva sección se verá un caso mas práctico y real de utilización de PERFORM con uso de lecturas de ficheros y demás experiencias cotidianas en el mundo de la programación en el ámbito de la gestión. Además podemos ir incrementando el número de condiciones a nuestro antojo. Las ventajas de la programación estructurada las quiero explicar en un apartado dentro de ésta misma sección de Manuales. .. Esto lo conseguimos incluyendo mas cláusulas precedidas de AFTER. RESUMIENDO Una mayor utilización de PERFORM sin duda traerá un uso menor de la declaración GO y con ello conseguimos una programación estructurada. valor UNTIL condición AFTER variable FROM número.. PERFORM WITH TEST [AFTER . variable BY número.BEFORE ]VARYING variable FROM número. variable BY número. que serán la siguiente aportación al manual. una vez explique las sentenicas GO e IF. valor UNTIL condición sentencias AFTER .número de condiciones para que se cumplan los requisitos y así ejecutar las sentencias.. obteniendo por consiguiente unos niveles de perfeccionamiento muy altos. consiguiendo de éste modo hacer unos anidamientos y un desarrollo mas completo de la sentencia. END-PERFORM Al aplicar este formato cuando se cumpla la primera condición pasará el control al AFTER y comprobará de nuevo la condición que precede al siguiente UNTIL según los valores especificados en la línea que contiene AFTER.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->