cobol

86
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 d icho antes, no hay muchas diferencias. Al pensar en Cobol como lenguaje de progra mació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, s us  párrafos y el cobol además tiene una gran similitud con el inglés, ya que todo su entorno está sacado de és te 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 s iguiente 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 ser vir dependiendo de los compiladores para indicaciones

Upload: javier-avila

Post on 06-Jul-2015

539 views

Category:

Documents


0 download

TRANSCRIPT

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 1/86

 

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 unamagnífica transportabilidad entre los distintos sistemas, yo he ejecutado elmismo 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 considerancomo 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 todosu entorno está sacado de éste idioma. Cobol además es un lenguajeestructurado y sus partes se diferencias claramente en Divisiones.Estas son 4, son obligatorias y cada una de ellas tiene una misión diferentedentro de cada programa como veremos a continuación.

El programa cobol se escribe secuencialmente en líneas de 80 caracteres omenos 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 sutamaño ocupa mas de una línea, un asteristo (*) que nos indica que el textoque viene a continuación es un comentario y por lo tanto que el compilador loignore, o bien puede servir dependiendo de los compiladores para indicaciones

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 2/86

 

del debug.

La parte (3) se le llama Area A comprende las columnas 8 a 11 ambasinclusive 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 losniveles de variables 01 y 77.

La parte (4) llamada Area B comprende desde la columna 12 a la 72 y en ellasse incluirán todas las instrucciones del programa, las lineas de las secciones ylos 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 deuna linea, en el han de terminar todas las secciones, divisiones y párrafos. Si alfinal de una linea el compilador no encuentra el punto, interpretará que lainstrucción continúa hasta que aparezca el punto de fin de linea.

Al igual que en otros lenguajes, el cobol dispone de palabras reservadas queno debemos de utilizar como nombres de variables o de párrafos, además éstosno deben de exceder de 30 caracteres (depende del compilador).

Las variables y constantes que se pueden utilizar son numéricas, alfabéticas oalfanuméricas. Las numéricas al contrario de la mayoría de los lenguajesactuales 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 hasta999999 si es de valor absoluto o incluyendo los negativos si lleva signo. Paralas alfanuméricas en cambio no hay cambio alguna y su tamaño vieneindicado por el número de caracteres que ocupa.Existen además en cobol unas variables que vienen con un valor propio y quese pueden utilizar libremente, también llamadas Constantes Figurativas, comoZERO, SPACE, LOW-VALUES, HIGH-VALUES, etc...

Quisiera respetar para todo el manual las mismas pautas, color Amarillo paralas palabras reservadas cobol, subrayado para las obligatorias, en cursiva los

 

comentarios y en normal el resto.

Nota final: 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 3/86

 

Es obvio que cada manual estará orientado a la manera de trabajar de quien loescribe, con ello quiero decir que habrá cosas que no explicaré mucho oincluso 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 primeradivisión donde se especifica el nombre del programa, el del autor y demásdatos, su sintaxis sería la siguiente:

IDENTIFICATION DIVISION.PROGRAM-ID Nombre del pr og rama. AUTHOR  Nombre del aut or. INSTALLATION Lu g ar d onde está in stalad o. 

 

DATE-WRITTEN Fecha de creación. DATE-COMPILED Fecha de com pilación. 

REMARKSC omentario s. 

Vemos que el único párrafo obligatorio además del nombre de división es elque 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 sonopcionales, eso si, si se incluyen se deben de poner cumpliendo las normas.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 4/86

 

Podemos incluir además todos los comentarios o explicaciones que creamosoportunas incluyendo en la columna 7 un asterisco (*) que nos indica que elcompilador hará caso omiso de lo que venga a continuación, por ejemplo.

* /////// Este pr og rama es para hacer al  go /////// 

* // atención a la sección de la fecha ////  

Ejemplo: 

IDENTIFICATION DIVISION.PROGRAM-ID. MANCLI.AUTHOR. ANDRES MONTES.INSTALLATION. WWW.REMARKS. Pr og rama para mantenimient o de ficher o 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)

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 5/86

 

Es la segunda division por orden de aparición, y en ella se especifican, elordenador donde se escribió y se ejecutará el programa, asi como la relacionentre los ficheros a utilizar con sus correspondencias externas, es decir con losdispositivos a los que hará referencia el programa objeto cuando vaya aestablecer comunicación con dicho fichero.

Diremos antes de continuar que en los primeros cobol había muchas partesque eran obligatorias en cada programa, pero hoy en dia, por ejemplo, éstadivisión ya no es obligatoria, asi como ninguna de sus partes. Su sintaxis seríala siguiente:

ENVIRONMENT DIVISION.CONFIGURATION SECTION.SOURCE-COMPUTER. Ordenad or d onde se escribió el fuente. 

OBJECT-COMPUTER. Ordenad or d onde se ejecuta el ob jet o. SPECIAL-NAMES. Cambiar val ores para con stantes del leng uaje, pueden 

variar en cada com pilad or. Como se aprecia en su sintaxis, ésta segunda division se divide a su vez en dossecciones, que se describen a continuacion:CONFIGURATION SECTION: Donde describimos los tipos de ordenadoresen que se escribio y se ejecutará el programa, o bien el nombre del compilador y asignación de valores a ciertas constantes utilizadas por el compilador, estosvalores se introducen en sus respectivas lineas como se ve arriba.

Para la linea de SPECIAL-NAMES el uso mas habitual es el de cambiar el punto decimal usado por los ingleses por la coma y asi poder especificar los puntos para los miles, su formato sería el siguiente:

SPECIAL-NAMES.DECIMAL-POINT IS COMMA.

También podriamos cambiar el valor del símbolo de la moneda con:

CURRENCY SIGN IS literal , suele ser un solo caracter y no puede coincidir con ninguno de los que usamos para definir las variables, es decir ni A,niZ,ni9,ni -,ni +,ni X, etc...

O hacer que todas las letras introducidas sean mayúsculas o minúsculas o queno haya diferencias entre ambas con la clausula ALPHABET.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 6/86

 

INPUT-OUTPUT SECION: Es la siguiente sección dentro de la Environment,donde se especificarán todos los ficheros que vamos a utilizar, su tipo, sumodo de acceso asi como el medio en que estarán, esta sección solo seráobligatoria cuando vayamos a utilizar ficheros. Esta tiene dos párrafos FILE-CONTROL e I-O-CONTROL.

123456789012A B

INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT [OPTIONAL] Nombre-de-archivoASSIGN TO Tipo-de-dispositivoORGANIZATION IS Tipo de organizacion

ACCESS MODE IS Mode de acceso al ficheroRECORD KEY IS Clave del registroALTERNATE RECORD KEY IS Claves alternativas registroWITH DUPLICATESFILE STATUS IS Variable de estado del fichero.Vamos a explicar cada una de las cláusulas que encontramos dentro de laInput-Output Section.Cláusula SELECT es aqui donde especificamos el nombre lógico que va atener el fichero dentro del programa, suele ser una palabra que identifique lomas claro posible el contenido del fichero, por ejemplo ARTICULOS,

PROVEEDORES, CLIENTES.

Cláusula OPTIONAL si indicamos esta opción al hacer un OPEN I-O, si elarchivo no existe, se crea. Con lo cual nos evitamos tener que abrirlo comoOUTPUT y cerrarlo, antes de poder utilizarlo por primera vez.

Cláusula ASSIGN aqui especificamos el tipo de dispositivo, si es unaimpresora PRINTER, si es un fichero sobre el que vamos agrabar RANDOM o DISC, se pueden utilizar otros como INPUT, INPUT-

OUTPUT, CASSETTE, MAGNETIC-TAPE, pero sin duda los mas utilizadosson los dos primeros para identificar si el fichero utilizará una salida impresa ose utilizará sobre disco. Para identificar ficheros utilizados para clasificar utilizaremos SORT.

Cláusula ORGANIZATION aqui indicamos la organización de los registrosde nuestro fichero, podrá ser SEQUENTIAL, RELATIVE o INDEXED, si

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 7/86

 

nuestro archivo fuera secuencial se podrían omitir ésta clausulaasi como lasrestantes.De ésta organización se deriva el formato del fichero, SEQUENTIAL si losregistros se graban secuencialmente conforme se dan entrada sin importar siestán o no repetidos, un ejemplo claro son los archivos de impresora, todos loslistados son secuenciales.RELATIVE, si cada registro es identificado por un valor entero con su

 posición relativa (practicamente no se utiliza).INDEXED es la mas utilizada e identifica a ficheros que sus registros sonaccesibles mediante una clave unica e irrepetible o por varias que pueden estar duplicadas, cualquier fichero de mantenimiento, por ejemplo deARTICULOS, podría ser INDEXED, y cada código será único para cadaartículo y con el nos iremos a su posición y podremos ver todos los demasdatos que hagan referencia al registro.

Existe también para los archivos de texto, tipo AUTOEXEC.BAT la posibilidad de asignarlos directamente especificando LINE SEQUENTIAL enésta clausula.

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

Cláusula ACCESS MODE indica el modo de acceso al fichero, puedeser SEQUENTIAL, RANDOM o DYNAMIC, si no se especifica ninguno o siel fichero es SEQUENTIAL entiende que el modo será SEQUENTIAL.RANDOM indica que accederemos a el aleatoriamente por su clavey DYNAMIC (la mas utilizada) con la que podremos acceder al fichero en elmodo que queramos dentro del programa, unas veces secuencialmente, si nos

interesa, otras veces por su clave.Cláusula RECORD KEY se utiliza solo si el fichero es indexado y en eldecimos cual es el nombre de la clave por la cual accederemos a los registros.Esta deberá ser alfanúmerica y tendrá que estar especificada en la FD delfichero. Si el archivo fuera RELATIVE, esta clausula se sustituiría

 por RELATIVE KEY e indicará el número de registro del fichero, deberá

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 8/86

 

estar declarado en la WORKING-STORAGE SECTION como una variablenumérica sin signo.

Cláusula ALTERNATE RECORD KEY solo para ficheros indexados eidentifican una o mas claves alternadas para nuestros registros, por ejemplo enun fichero de clientes cuya clave principal sería el código, podríamos asignar como clave alternativa el NIF, y podríamos acceder a el por las dos claves,

 bien por código o bien por NIF, será también alfanumérico y deberá tambiénestar declarado en la FD. Si aparece WITH DUPLICATES, indica que éstaclave alternativa pudiera estar duplicada, por ejemplo si hubieramos escogidocomo clave alternada además del NIF, el Nombre del cliente, podría darse elcaso de que dos clientes tuvieran el mismo nombre.

Cláusula FILE STATUS aqui damos un nombre de una variable que

especificaremos en laWORKING como un campo alfanumérico de doscaracteres donde el programa depositará el código de error que ocurra en elfichero, dependiendo del valor nosotros podremos operar o hacer algunaacción en concreto.

El párrafo I-O CONTROL se utiliza par indicarle al programa cuantosarchivos van a utilizar el mismo area de memoria para trabajar, os puedo decir 

 poco mas de éste párrafo porque yo no lo he utilizado nunca (lo que no quieredecir que no sea útil).

Ejemplo: 

ENVIRONMENT DIVISION.CONFIGURATION SECTION.SOURCE-COMPUTER. RMCOBOL.OBJECT-COMPUTER. RMCOBOL.SPECIAL-NAMES. DECIMAL-POINT IS COMMA.INPUT-OUTPUT SECTION.

FILE-CONTROL.SELECT CLIENTES ASSIGN TO RANDOM"C:DATOSCLIENTES.DAT" ORGANIZATIONINDEXEDACCESS DYNAMIC RECORD KEY KEY-CLIENTE ALTERNATE RECORD KEY-CLIENTE1FILE STATUS STACLI.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 9/86

 

SELECT IMPRESORA ASSIGN TO PRINT"PRINTER".

Hemos declarado el archivo CLIENTES comoindexado con dos claves, una principal KEY-CLIENTE y otra alternativa KEY-CLIENTE1 y hemosasignado una variable para guardar los posiblescódigos de error para cuando operemos con éstefichero STACLI. Al indicarle el acceso dinámico ledecimos que una vez dentro del programa podremosacceder al fichero secuencialmente o biendirectacmente al registro que queramos por cualquierade las claves.

Como el fichero IMPRESORA es secuencial no esnecesario ninguna aclaración, al darle el nombrePRINTER cojerá la impresora que tengamos por defecto, si le damos cualquier otro nombre que noidentificara a ninguna impresora, el resultado seríagrabar todo lo que debería salir por la impresora en unarchivo con ese nombre.

Nota final: 

Creo que es una de las partes mas interesantes de la programación cobol y quecuando he utilizado alguno de éstos nuevos lenguajes orientados a objetos yque utilizan bases de datos, siempre he echado en falta. Para mi siempre esgrato dirigirme a la Environment de cualquier programa y saber con exactitudtodos los ficheros que se van a utilizar en ese programa.

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 asignar la impresora, si asignamos el nombre PRINTER, éste hacereferencia a la impresora por defecto pero tambien podríamos utilizar unnombre para especificar una impresora de red, por ejemplo, si en nuestra redexiste una impresora que esta en PENTIUMHPLASER, podemos identificar un nombre en el Autoexec.bat para asignar ese valor a una variable de entornocomo: IMPRE="PENTIUMHPLASER" y luego en el programa especificar como nombre de dispositivo de la impresora

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 10/86

 

IMPRE, SELECT IMPRESORA ASSIGN TO PRINT IMPRE.

En realidad haciendo ésto último podemos asignar cualquier archivo que estéen cualquier dirección de la red, ya que el nombre que damos es lógico y suasignación la podemos definir con una variable de entorno donde queramos.

dataDivision 

 página(s) : 1/4(5050 palabras totales en este texto)(91897 Lecturas)

Es la tercera division por orden de aparición, y es donde se declaranabsolutamente todos los nombres de campos, registros, variables, es decir donde nombramos cada dato que vayamos a utilizar en nuestro programa. Paraalmacenar todos estos nombres de datos, ésta DIVISION se divide en variassecciones, cada una de ellas orientada a un tipo de datos diferente.

y  FILE SECTION. Aqui describiremos todos los campos que componenlos registros de todos los archivos que vayamos a utilizar, que

 previamente habremos declarado en la INPUT-OUTPUTSECTION dentro de laENVIRONMENT DIVISION.

y  WORKING-STORAGE SECTION. En ella declararemos todas lasvariables no referentes a archivos, pero que durante la ejecución del

 programa vayamos a utilizar.y  LINKAGE SECTION. 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.y  COMMUNICATION SECTION. (No la he utilizado nunca).y  SCR EEN SECTION. En ésta sección podremos describir los atributos

y campos a utilizar en las pantallas.

Al igual que en la anterior DIVISION ninguna de sus partes es obligatoria, pero si vamos a utilizar alguna variable, aunque solo sea una, tendremos que

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 11/86

 

incluirla en la WORKING-STORAGE SECTION y esto nos obligará tambiena definir la DATA DIVISION. Pasemos a continuación a explicar mas a fondocada una de ellas.FILE SECTION. En esta sección describiremos los campos que van a componer el registro decada uno de los archivos con los que vamos a trabajar, ésta sería su sintaxis: 

FD  Nombre del ficher o. BLOCK CONTAINS Numero de registros por bloque R ECORDS

R ECORD CONTAINS Número de caracteres por 

registro CHARACTERS

LABEL R ECORD Etiqueta de registro 

DATA R ECORD Nombre del registro. 

Vamos a explicar un poco mas detalladamente cada cláusula de la FILE 

SECTION. Quiero de jar claro que ésta es mas amplia, pero que como en

el resto del manual voy a explicar lo que creo que es mas importante y en

definitiva lo que mas se utiliza. 

Cláusula FD nombre del fichero que previamente habiamos descrito en la

cláusula SELECT de la INPUT-OUTPUT SECTION en

laENVIRONMENT DIVISION. 

Cláusula BLOCK CONTAINS cuando queremos que por cada bloque endisco se graben mas de un registro, aqui especificamos el número de ellos

que va a contener cada bloque, (512, 1024), si no se especifica se supone

que cada registro va a ocupar un bloque de memoria, o bien será el

propio compilador el que haga el cálculo mas apropiado. 

Cláusula R ECORD CONTAINS el número de caracteres que tiene el

registro sumando todos sus campos, puede ser fi ja o variable. Si es fi ja

utilizamos un valor y si es variable un rango desde hasta, si no se

espicifica será el propio compilador quien la determine. 

Cláusula LABEL R ECORD puede tener dos

valores STANDARD uOMITTED , el primer caso indica que cada vez

que se accede a un registro el compilador hará las comprobaciones

estandares descritas por el propio compilador y en el segundo éstas serán

omitidas. Para el caso de los ficheros de datos en disco se suele

poner STANDARD y cuando el fichero es de impresora se

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 12/86

 

indicaOMITTED. 

Cláusula DATA R ECORD debido a que un mismo fichero puede tener

varias descripciones de registro, aqui indicamos los nombre de éstas que

deberán estar descritas a nivel 01. Normalmente no se utiliza y casi

siempre se suele utilizar una sola descripción por fichero, por lo que no

suele aparecer en casi ningún programa. 

A continuación vendría la descripción de todos los campos que

comprenden el registro, pero antes de ver ésto es aconse jable tener claro

como se define una variable con todas sus opciones ya que a fin de

cuentas, los campos de un registro no son mas que eso, variables, con la

única 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, impresora). 

Antes de seguir adelante quisiera decir que siendo el cobol un lengua je

orientado casi exclusivamente al mane jo de ficheros de datos, es sin duda,

ésta parte que hemos visto la mas importante. Un buen análisis de los

ficheros a utilizar antes de empezar es fundamental y nos evitará muchos

calentamientos de cabeza, tener claro cuales van a ser sus claves tanto la

principal como las alternativas, definir bien todos sus campos y de jar

espacio libre para un posible aumento de datos. Esto lo digo porque si

creamos un fichero con 80 caracteres por registro y al cabo de un tiempodebemos de introducir un nuevo campo que no habiamospreveido,

tendremos que modificar toda su estructura rehaciendo el fichero y

recompilando todos los programas a los que afecte, si en cambio de jamos

un poco de espacio nos evitaremos la reestructuración del archivo, ésto se

consigue utilizando el nombre de variable FILLER como veremos un

poco mas aba jo. 

WORKING-STORAGE SECTION. 

LINKAGE SECTION. 

COMMUNICATION SECTION 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 13/86

 

SCR EEN SECTION Para la WORKING y la LINKAGE las normas son las mismas, asi que lasveremos conjuntamente. Las otras dossecciones, COMMUNICATION y SCREEN no las veremos en el manual.

 Número de Nivel ...... Nombre de campo ...... PIC, VALUE, REDEFINES,OCCURS, JUST, SIGN, SYNC.

Cada campo declarado debe de llevar un número de nivel que le informe alcompilador del tipo de campo que es:

El nivel 01, identifica la primera entrada de un registro o la primera entrada deun campo que se va a subdividir.El nivel 77, identifica a una variable que no se va a subdividir y que no forma

 parte de ningún registro.El nivel 88, identifica los posibles valores condicionales de una variable

 previamente definida.Los niveles 02 al 49 indicarán las distintas subdivisiones de un campo cuya

 primera entrada ha sido definida a nivel 01. Los niveles 01 y 77 deberán de ir siempre en el Area A (Col 8) el resto es independiente.

A continuación pondremos el nombre del campo, que no podrá ser ninguna palabra cobol ni llevar ningún carácter extraño, principalmente se utilizaránletras y números o guiones. Es posible que algún campo que definamos nuncavaya a ser usado por el programa pero si en cambio es necesario que exista

 para que nos reserve el espacio, le llamaremos FILLER.

Y finalmente podrán venir una serie de cláusulas como:

PICTUR E / PIC esta palabra es la que utilizamos para identificar el tipo dedatos que va a contener la variable. Los posible valores son:

DE CAMPOS.9 - Para campos numéricos.A - Para campos alfabéticos.X - Para campos alfanuméricos.S - Indica variable con signo.V - Indica punto decimal.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 14/86

 

DE EDICIÓN.$ - Representa la aparición del signo $ delante del campo numérico.. - Indica separación de miles., - Indica punto decimal. (estas dos pueden variar según hayamos especificadoen SPECIAL-NAMES DECIMAL-POINT IS COMMA).Z - Representa un espacio para el 0 a la izquierda en campos numéricos.* - Igual pero se cambia el 0 por *.B - Indica un espacio en blanco.- ó + - Indican la aparición del signo correspondiente.

Puede haber mas pero los mas utilizados son los que se han comentado.

Para indicar la longitud del campo se puede repetir el símbolo tantas vecescomo longitud tenga o expresarla entre paréntesis, es decir para definir una

variable alfanumérica de 10 caracteres se pondría:PIC X(10) o PIC XXXXXXXXXX. Los valores S y V solo pueden aparecer una vez por cada variable.

A continuacion vamos a ver un ejemplo de todo lo que hemos explicado paraque se vaya quedando claro.

WORKING-STORAGE SECTION.01 DOMICILIO.

02 TIPO PIC XX.

02 NOMBRE PIC X(20).02 NUMERO PIC 9(4).

Fijaros que hemos definido 4 variables, la primera no tiene PIC, por queindica que está subdividida en las 3 restantes. La segunda "TIPO" nos dice quees una variable alfanúmerica y que puede contener 2 caracteres como máximo,la utilizariamos para guardar el tipo de calle, avenida, paseo, plaza, etc.. Parala tercera "NOMBRE" va a ser también alfanumérica pero con una longitudmáxima de 20 caracteres y nos servirá para guardar el nombre de la calle,

 plaza, avenida, etc y la última "NUMERO" indica una variable numérica de 4dígitos, que quiere decir que puede contener valores entre 0 y 9999.

Observad que en Cobol no se guardan las varables numéricas por bytes comoocurre con todos los lenguajes actuales sino por número de dígitos, con elloquizás desaprovechamos mas la memoria pero en cambio tenemos un controlmejor del dato que puede contener nuestra variable.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 15/86

 

 Si TIPO fuera "AV", NOMBRE "DE LOS DESAMPARADOS " y NUMERO"15", si nos refiriéramos a la variable DOMICILIO ésta tendría el siguientevalor:"AVDE LOS DESAMPARADOS 0015".

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.77 FECHA PIC 9(8).77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ.77 IMPORTE PIC S9(8)V99.77 IMPORTE-EDIT PIC ZZ.ZZZ.ZZZ,ZZ-.01 ESTADO PIC 9.

88 SOLTERO VALUE 1.88 CASADO VALUE 2.88 DIVORCIADO VALUE 3.

Suponiendo que el valor de FECHA es 01111998 (1 Nov de 1998) y FECHA-EDIT es el mismo, éste último se representaría: 01/11/1998.Si IMPORTE es 12815V37 en negativo e IMPORTE-EDIT el mismo, éste serepresentaría: 12.815,37-.

VALUE esta palabra a continuación del PIC indica el valor inicial quecontendrá la variable hasta que éste sea modificado. Por ejemplo podemosdefinir una variable:

WORKING-STORAGE SECTION.01 RAYA PIC X(10) VALUE "----------".01 MINOMBRE PIC X(30) VALUE "ANDRES MONTES".

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 16/86

 

 Asi tendremos una variable llamada RAYA que contiene 10 guiones y otrallamada MINOMBRE que contiene eso, mi nombre, si os fijais con éstacláusula convertimos cualquier variable en una constante. En cualquier momento del programa podremos cambiar ese valor. Para las variablesnuméricas es conveniente ponerlas siempre con VALUE 0 para que alempezar cada programa estemos seguros de que no nos arrastra ningún valor.

 Normalmente al ejecutar un programa se ponen todas las variables a 0, pero siese programa ha sido llamado desde otro no pasará eso, por eso no viene malinicializarlas todas a 0.

R EDEFINES esta cláusula se utiliza para dar mas de un nombre y formato aun mismo campo. Este debe de ir a continuación del nombre de campo y antes

del nombre del campo a que hace referencia, deben de estar en el mismo nively uno a continuación del otro en el orden de declaraciones.

WORKING-STORAGE SECTION.01 DIAS PIC X(21) VALUE "LUNMARMIEJUEVIESABDOM".01 TADIA REDEFINES DIAS.

02 DIA PIC XXX OCCURS 7 TIMES.

He incluido la cláusula OCCURS para que sea vea un ejemplo práctico,aunque todavía no lo he explicado, pero como veis a partir de éste momento

DIAS y TADIA tendrán siempre el mismo valor pero con diferente nombre yformato de datos.

OCCURS esta cláusula es la que se utiliza para declarar tablas. Una tabla esun conjunto de elementos con un mismo tipo y longitud que se denominan conel mismo nombre y se diferencian por un subíndice. No se puede especificar en niveles 01, 77 88. Puede tener varios formatos:

WORKING-STORAGE SECTION.01 NUMERO-DIAS PIC 99.01 TABLA.

02 DIA PIC XXX OCCURS 7 TIMES.02 MES PIC 99 OCCURS 28 TO 31 DEPENDING NUMERO-DIAS.02 OTRA PIC X(5) OCCURS 5 INDEXED BY IN-OTRA.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 17/86

 

En la primera "DIA" indico que esa tabla va a tener 7 elementos quellamaremos DIA (nn) y entre paréntesis el orden dentro de la tabla. Sihubiéramos guardado en ésta tabla las 3 primeras letras de cada dia de lasemana, para obtener el valor del lunes pediriamos DIA (1), para el del JuevesDIA (4) y para el del domingo DIA (7).

En la segunda "MES" le indicamos que los elementos de la tabla pueden variar dependiendo del valor de la variable "NUMERO-DIAS" que ha de estar definida antes de la tabla y siempre dentro de los márgenes de 28 y 31.

En la tercera le indicamos además que la variable IN-OTRA va a ser laencargada de dirigirnos por los elementos de la tabla, ésta variable no puedeestar definida antes.

JUST la justificación de los valores de los campos suele ser a la izda. para losalfanuméricos y a la derecha para los numéricos, si en cambio queremoscambiar este orden tendremos que incluir ésta cláusula.

WORKING-STORAGE SECTION.01 NOMBRE PIC X(10).01 NOMBRE1 PIC X(10) JUST RIGHT.

Si le diéramos el mismo valor a las dos variables "ANDRES", la primera nos

daría "ANDRES " y la segunda " ANDRES", la diferencia, su justificación.

USAGE con ésta cláusula determinamos el formato en que se guarda elcontenido de las variables (numéricas, ya que las alfanuméricas siempreocuparán un byte por cada caracter). Con todos los campos se puede operar (obviamente) pero solo los que se definan como DISPLAY serán editablesdirectamente. Tiene varias posibilidades:

y  DISPLAY, es la forma por defecto e indica que cada dígitoocupará un byte, es la que se toma por defecto y la que memoriaocupa.

y  BINARY, COMP-1, COMP-3, COMP-6, son diferentes formasde compactación de los datos. COMP-6 (la mas usual) guarda dosdígitos en cada byte, COMP-3 es igual pero admite signo el cual

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 18/86

 

iría en los cuatro últimos bites del último byte. Las restantesformas se utilizan menos.

WORKING-STORAGE SECTION.01 IMPORTE PIC 9(8). Ocupa 8 bytes uno por cada dí  g it o. 01 FECHA PIC 9(8) COMP-6. Ocupa 4 bytes, uno cada 2 dí  g it o s. 01 PRECIO PIC S9(8)V99 COMP-3. Ocupa 6 bytes, uno para l o s d o s

decimales, cuatr o para la parte entera  y uno para el si gno. 

Cuando el tamaño es impar el signo no ocupa ya que comparte byte con elúltimo dígito, el punto decimal tampoco ocupa espacio, ya que solo indica su

 posición. Estas tres formas que he utilizado son las mas comunes, yo por ejemplo como las capacidades de los ordenadores son tan grandes ahora,cuando defino las variables en la WORKING nunca utilizo ninguna

compactación es decir no utilizo la cláusula USAGE (que por cierto y comohabreis visto se puede omitir) y por defecto toma DISPLAY (un byte por caracter).

Data Division 

 página(s) : 4/4(5050 palabras totales en este texto)(91897 Lecturas)

LINKAGE SECTION. En ésta sección se declaran las variables de igualforma 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.

Ejemplo: 

DATA DIVISION.FILE SECTION.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 19/86

 

 FD CLIENTES BLOCK CONTAINS 4 RECORDS

RECORD CONTAINS 128 CHARACTERSLABEL RECORD STANDARD.

01 REG-CLIENTE.02 KEY-CLIENTE.r 03 CLICOD rPIC 9(4) COMP-6.02 CLINOM PIC X(30).02 CLIDIR PIC X(30).02 CLIPOB PIC X(20).02 CLIPRO PIC X(20).02 CLINIF PIC X(9).02 FILLER PIC X(17).

FD IMPRESORA LABEL RECORD OMITTED.01 LINEA PIC X(132).WORKING-STORAGE SECTION.01 TABLA.

02 FILLER PIC X(12) VALUE"LUNMARMIEJUE" .

02 FILLER PIC X(9) VALUE "VIESABDOM" .01 TABLAIDA REDEFINES TABLA.

02 ELEDIA PIC XXX OCCURS 7 TIMES.

01 FECHA PIC 9(8).01 IMPORTE PIC S9(8)V99.01 VALORES.

02 UNO PIC 99 VALUE 0.02 DOS PIC 9(6)02 TRES PIC 9(4)V99.

01 LINPA.02 LIMPOR PIC ZZ.ZZZ.ZZZ,ZZ-.

Como veis he diseñado el fichero CLIENTES para quecada bloque de 512 Kb, ocupe 4 registros, dejando 17caracteres (FILLER), para una posible ampliación delregistro.

En la descripción del archivo IMPRESORA se declarauna variable a nivel 01 que hace referencia al total del

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 20/86

 

registro para luego ir moviendo a éste campo el valor de

 

lo que queramos imprimir.

En la WORKING se han declarado algunos campos con

distintos formatos, fijaros en la tabla que graciasal REDEFINES hemos llenado con las tres primerasiniciales de cada dia, asi al referirnos a la variableELDIA (2) su contenido será "MAR".

Nota final: 

La DATA DIVISION nos sirve para tener todas nuestras variables biendefinidas, ya sean independientes o que formen parte de algún fichero para

 poder operar con ellas en la PROCEDURE DIVISION. Me acuerdo decuando empezamos a estudiar que para otros lenguajes no era necesaria ladeclaración de variables previamente y en cambio ahora en la mayoría de loslenguajes se exige que se declaren, eso significa que el Cobol no iba malencaminado.

Tenemos que tener siempre muy claro que con cualquier campo podemoshacer lo que queramos, por ejemplo si en un registro de 120 caracteresnosotros en un programa solo vamos a utilizar los 40 primeros podemosdefinir todo lo restante como un campo FILLER y listo o viceversa si uncampo de un registro lo tenemos definido como alfanumérico de 30 en un

 programa necesitamos los 10 primeros caracteres por un lado y los veinterestantes por otro, puese nada se subdivide para ese programa y no pasa

 

nada.

Espero que haya quedado por lo menos medio clara la explicación de éstatercera DIVISION, evidentemente con la práctica es con lo que mas vamos aaprender siempre claro está que tengamos al menos unas nociones mínimas.

Tenemos que tener en cuenta que como en todos los lenguajes, ya sean de programación o de habla (español, inglés, frances) son muchas las opcionesque nos ofrecen pero al final siempre utilizamos las que mas nos gustan o lasque consideramos mas útiles.

Una cosa que considero importante es dar a las variables un nombre un pocológico que nos recuerde su contenido, por ejemplo si queremos guardar la

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 21/86

 

fecha, pues llamarla FECHA, si queremos guardar el N.I.F. del gerente, NIFGEREN, etc ...

ProcedureDivision 

(2025 palabras totales en este texto)

 

(70018 Lecturas)

Bien, hemos llegado a la última división que existe un los programas Cobol,en ella encontramos todos los procesos necesarios para que el programafuncione, que haga para la que fue concebido.Todo ésto se realiza con instrucciones (ordenes, verbos, comandos, etc..), quese explican en otros capítulos del manual. Cada uno de ellos con un formato yuna solución que resolver.

 

A continuación vamos a explicar su formato y algunas consideracionesgenerales aparte de las propias instrucciones:

PROCEDUR E DIVISION (USING V ariable, V ariable ...).DECLARATIVES. Nombre-seccionSECTION.USE AFTER ERROR PROCEDUR E ON tipo. Nombre-parraf o.S entencias......END DECLARATIVES. Nombre-seccion SECTION. Nombre-parraf o.

S entencias. .....

Este sería a groso modo el formato general de una Procedure, pero incluso se puede omitir si en un programa no vamos a realizar ningún proceso (es obvioque siempre lo realizaremos, pero se podría omitir). Vamos a explicar un poco

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 22/86

 

su formato:

PROCEDUR E DIVISION (USING V ariable, V ariable ...).

 

Cuando especificamos USING en la linea de PROCEDURE DIVISION ,después deberemos de dar los nombres de variables que hayamos definido enlaLINKAGE SECTION, para compartir en el programa, lo que nos indicaráque éste ha sido llamado por otro programa y que esas variables traerán un

 

valor procedente del programa llamador, que a su vez utilizó lainstrucción CALL con las mismas variables.

DECLARATIVES, es una sección dentro de la PROCEDURE que nos va aservir para controlar los posibles errores en cuanto al manejo de ficheros serefiere. La linea de DECLARATIVES, (si se va a utilizar) deberá de ir siempre a continuación de la linea de PROCEDURE DIVISION .Despues de

subdiviría en tantas secciones como opciones de error tengamos, éstas puedenser definidas por archivo o bien forma de apertura, es decir podremoscontrolar los errores que nos lleguen de un fichero en concreto o de todosaquellos que hayan sido abiertos de de igual forma, ésto se especifica en lalinea USER AFTER ERROR PROCEDURE ON tipo, pudiendo ser tipo, elnombre del archivo o su modo de apertura (INPUT, OUTPUT, I-O , EXTEND. A continuación irían los párrafos con sus respectivasinstrucciones a realizar en caso de error.Se pondrían tantos párrafos y secciones como quisieramos controlar, siempre

teniendo en cuenta que ésta se acaba cuando se indique ENDDECLARATIVES.Si no quisieramos utilizar ésta sección, podriamos de igual manera controlar 

 

los errores en nuestro programa preguntando siempre por la variable de error de cada fichero que se definió como FILE STATUS en la FILE-CONTROL.

 Nombre-seccion SECTION, a partir de aqui incluiremos todas lasinstucciones necesarias para la correcta ejecución del programa.

Ya sabemos que Cobol es un lenguaje estructurado, pues bien no pensemosque la Procedure va a ser un caos de instrucciones escritas secuencialmente,no, en ella podremos definir tantas Secciones (SECTION) y Párrafos comoqueramos para organizar mejor las instrucciones y para delimitar accionesconcretas, eso si siempre se ejecutarán secuencialmente, excepto cuandoencuentre algún verbo de bifurcación como GO, PERFORMque haciendoreferencia a esos nombres de párrafo harán que se rompa la secuencia lógica

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 23/86

 

de ejecució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  V 

ariable [ (NOT) = ] V 

ariable 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, con loque no ma yor que puede ser igual que menor o i g ual que. 

Tambien podemos utilizar para las condiciones complejas los operandoslógicos, AND, OR y NOT según se requieran, todas las condicionea queincluyan AND han de ser correctas para que pase la condición, si seutiliza OR solo alguna de ellas ha de ser correcta, cuando se utilice NOT no

 podrá ser correcta para que la condición sea válida.

Instr. de Cálculo 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 24/86

 

 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 grandescantidades de datos y a resolver problemas de tipo comercial y deadministración, no se incluyeron dentro de sus especificaciones verbos quenos puedieran ayudar a resolver cálculos complejos como integrales,trigonometría, raices cuadradas, etc..., sino simplemente las orientadas a loscálculos básicos, suma, resta, multiplicación y división que son las quevamos a ver a continuación:

ADD , ésta es la instrucción que utilizaremos para realizar sumas y tiene lossiguientes formatos:

1.- ADD variable ó literal variable ó literal  ... TO variable (ROUNDED)(ON SIZE ERROR ) in strucción 

2.- ADD variable ó literal variable ó

literal  ...GIVING variable (ROUNDED) (ON SIZE ERROR ) in strucción 

3.- ADD CORR  variable TO variable (ROUNDED) ( ON SIZE 

ERROR ) in strucción 

Para ver las explicaciones de cada uno de los formatos partiremos de lamisma WORKING , y a continuación pondremos un ejemplo y suexplicación.

WORKING-STORAGE SECTION.01 VALORES.

02 UNO PIC 99 VALUE 10.02 DOS PIC 9(6) VALUE 280.02 TRES PIC 9(4) VALUE 540.

01 OTROS02 OTRO1 PIC 9.02 DOS PIC 9(6) VALUE 110.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 25/86

 

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 alrealizar ésta operación el valor de la variableRESULTADO, será de: 10 (de la variable UNO) + 540 (dela variable TRES) + 5 + 10 (de Resultado) = 565.

Como veis UNO + TRES + 5 suman 555 pero ésto se sumaal valor que ya tenía la variable RESULTADO, con lo quela 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 lasuma de las variables anteriores, sin tener en cuenta su valor inicial, es decir, será de: 10 (de la variable UNO) + 540 (dela variable TRES) + 5 = 555.

Formato 3: 

ADD CORR VALORES TO OTROS.

Con éste formato conseguimos que las variables del campocompuesto VALORES se sumen al valor de las variablescon el mismo nombre del campo compuesto OTROS,obteniendo como resultado: 280 (de la variable DOS delcampo VALORES) + 110 (de la variable DOS del campo

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 26/86

 

OTROS) = 390.Si hubiera coincidido alguna variable mas con el mismonombre 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 queformen parte de otra, aunque yo personalmente nunca lo uso

 porque solo puede dar lugar a confusiones. Si de todasformas lo utilizais, hay que tener en cuenta que parareferirse a éstas variables no solo bastará con poner su

nombre, sino que además habrá que especificar a quecampo 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 ) in strucción 

2.- SUBTRACT variable ó literal variable ó literal  ... FROM variable ó

literal  GIVINGvariable (ROUNDED) (ON SIZE ERROR ) in strucción 

3.- SUBTRACT CORR  variable FROM variable (ROUNDED) (ON 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 27/86

 

SIZE ERROR )in strucción 

Para ver las explicaciones de cada uno de los formatos partiremos de lamisma WORKINGque hemos utilizado con la instrucción ADD, poniendo acontinuació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 variableRESULTADO, será de: -10 (de la variable UNO) - 540 (dela variable TRES) - 5 + 10 (de Resultado) = -545.Como veis se le han restado los valores de UNO, TRES y 5que suman -555 pero como RESULTADO valía +10, éstese suma y da un valor de -545.

Este formato lo podemos utilizar para hacer contadores enretroceso, poniendo:SUBTRACT 1 FROM RESULTADO.

Formato 2: SUBTRACT UNO 5 FROM TRES GIVINGRESULTADO.

Aquí lo que conseguiremos será restar el valor de lavariable UNO y 5 del valor de la variable TRES y elresultado guardarlo en la variable RESULTADO, sin tener 

en cuenta su valor inicial, es decir, será de: 540 (de lavariable TRES) - 10 (de la variable UNO) - 5 = 525.

Formato 3: SUBTRACT CORR VALORES FROM OTROS.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 28/86

 

Al igual que con la instrucción ADD, con éste formato

 

conseguimos que las variables del campo compuestoVALORES se resten al valor de las variables con el mismonombre 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 mismonombre en ambos campos también se hubiese restado.

Nota: Tened en cuenta que al utilizar restas el signo puedeser negativo y si no tenemos bien declarada la variable queva 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 )in strucción 

2.- MULTIPLY variable ó literal BY variable ó

literal  GIVING variable (ROUNDED) (ON SIZE ERROR ) in strucción 

Utilizando la misma WORKING que hemos utilizado con lasinstrucciones ADD y SUBTRACT, veremos a continuación unos ejemplos ysu explicación.

Formato 1: MULTIPLY 5 BY RESULTADO.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 29/86

 

Multiplica el número 5 por el valor de la variableRESULTADO, guardando en ésta misma el resultado de laoperación que será: 5 x 10 (de la variable RESULTADO) =50.

Formato 2: MULTIPLY 5 BY TRES GIVING RESULTADO.

Aquí multiplicaremos el número 5 por el valor de la variableTRES guardando el resultado en la variable RESULTADO,sin tener en cuenta su valor inicial, es decir, será de: 5 x 540(de la variable TRES) = 2700.

DIVIDE , ésta es la instrucción que utilizaremos para realizar divisiones ytiene los siguientes formatos:

1.- DIVIDE variable ó literal  INTO variable (ROUNDED) (ON SIZE 

ERROR )in strucción 

2.- DIVIDE variable ó literal (BY ó INTO) variable ó

literal  GIVING variable(ROUNDED) (R EMAINDER ) variable (ON SIZE ERROR ) in strucción 

Utilizando la misma WORKING que hemos utilizado con lasinstrucciones ADD, SUBTRACT y MULTIPLY, veremos a continuaciónunos ejemplos y su explicación.

Formato 1: DIVIDE 10 INTO TRES.

Divide el valor de la variable TRES entre el número 10,guardando el resultado en la variable TRES: 540 (de lavariable TRES) / 10 = 54.

Formato 2: DIVIDE 7 INTO TRES GIVING RESULTADO

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 30/86

 

REMAINDER RESTO.

Aquí dividiremos el valor del la variable TRES entre 7guardando el resultado en la variable RESULTADO, sin tener 

en cuenta su valor inicial, y además el resto de la operación loguardará en la variable RESTO, quedando así: 540 / 7 = 77, pero como 7 x 77 son 539 el resto es 1 que será el valor deRESTO. Si en vez de utilizar INTO utilizamos BY cambia elorden de los operandos, es decir en vez de dividir TRES entre7 dividiríamos 7 entre TRES.

La opción REMAINDER no es obligatoria, todo dependerádel uso que queramos hacer de la instrucción. La variable queiría a continuación guardará el resto de la división.

Instr. de Cálculo 

 página(s) : 4/4(4515 palabras totales en este texto)(75125 Lecturas)

COMPUTE , 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), además de utilizar paréntesis

 para especificar mejor la operación a realizar.

1.- COMPUTE variable (ROUNDED) = expresión arit mética (ON SIZE 

 

ERROR )in strucción 

Utilizando la misma WORKING que hemos utilizado anteriormente vamos aver un ejemplo:

Formato 1: COMPUTE RESULTADO = DOS OF VALORES * 16 /100.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 31/86

 

 

El valor de la variable RESULTADO será de 44, obtenidodespués de multiplicar 280 (de la variable DOS del grupoVALORES) x 16 y lo que de dividido entre 100. En realidad

 

si hacemos el cálculo en una calculadora nos daremos cuentaque el resultado exacto es 44,80 pero como la variableRESULTADO no la hemos definido con decimales éstos sondepreciados por el compilador.

Puesto que la variable DOS pertenece a dos grupos devariables deberemos especificar a que grupo pertenece (OFVALORES).

Debemos de tener en cuenta que siempre tienen preferencialos operadores que vayan entre paréntesis, a continuación losde multiplicación y división (*) y (/) y por último los desuma y resta (+) y (-) y el orden en que va a ir realizando lasoperaciones será de izquierda a derecha, por lo tanto:

COMPUTE RESULTADO = 2 + 3 * 5.

Esta operación daría como resultado 3*5=15+2=17.

COMPUTE RESULTADO = (2 + 3) * 5.

En cambio ésta otra daría: 2+3=5*5=25.Espero que hayais notado la diferencia y la podais aplicar avuestros casos en concreto.

Para todas éstas instrucciones de cálculo que hemos visto laopcion ROUNDED significa lo mismo y quiere decir que fuerza al redondeo

del resultado para cada operación y siempre teniendo en cuenta la definiciónde la variable que va a guardar ese resultado, por ejemplo si tras una operaciónresulta 18,76 éste podría quedar como sigue:

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

redondeo = 18,8)

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 32/86

 

y  77 RESULTADO PIC 99. (Valor sin redondeo = 18 - valor conredondeo = 19).

Igual ocurre con la frase ON SIZE ERROR in strucción, que propiciará que se

ejecute la instrucción que pongamos a continuación cuando se produzca undesbordamiento del campo que va a acoger el resultado, por ejemplo si elresultado de una operación es 8.976.400 y la variable la hemos definidocon PIC 9(6) y hemos especificado dicha opción se ejecutará la instrucciónespecificada.

Instr. 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, con ellas tendremos la oportunidad de manipular toda la informacióncontenida en nuestros archivos, es decir, podremos abrir archivos, cerrarlos,leerlos, guardar información nueva o modificar datos existentes. Todo ésto loharemos con las instrucciones que voy a explicar a continuación.

Antes de empezar a explicar éstas instrucciones me gustaría que entendiéseis bien algunos conceptos como fichero, registro y campo, para que podaiscomprender mas claramente, la explicación de todas las instrucciones que severán en ésta sección.

y  ¿Que es un fichero? Podríamos definir un fichero como un conjunto de

 

registros, pero estaríamos mas o menos igual. Si comparásemos unfichero de cobol con nuestra vieja agenda de teléfonos, para cada amigotendríamos los mismos datos, es decir, nombre, teléfono, dirección, etc... cada uno de esos datos es lo que llamamos campo y el conjunto detodos esos campos para cada amigo sería un registro. Ahora podemos

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 33/86

 

comprender mejor que un fichero o archivo es un conjunto de registros,como una agenda es un conjunto de datos de amigos.

y  ¿Que es una clave? Una clave, es un campo de nuestra agenda que nos

 

sirve para identificar a cada amigo, en la agenda normal la clave podríaser la lengüeta con la letra del abecedario correspondiente a losapellidos del amigo. Informáticamente es mas completa y con ella

 

 podremos identificar a cada uno de ellos, por ejemplo con su nombre osu teléfono o un código que le asignemos nosotros personalmente.

En Temáticos trataremos el tema de los ficheros en mas profundidad.

OPEN, ésta es la instrucción que utilizaremos para abrir un archivo, o lo quees lo mismo hacerlo disponible para operar sobre el, obviamente éste archivodebe de haberse descrito en la Environment y la Data según se explicó, suformato es el siguiente:

OPEN (EXCLUSIVE ) mod o nombre de archivo ( WITH LOCK ) (WITH 

NO R EWIND)

Donde modo, indica como se abrirá el archivo y puede tener los siguientesvalores según su utilización:

y  INPUT, el archivo se abrirá solo para lectura, es decir no podremosgrabar ni modificar datos del mismo.

y  I-O, el archivo se abrirá como lectura y escritura, con lo cual tendremosacceso a toda la información de dicho archivo para leerla, escirbirla,reescribirla o borrarla.

y  OUTPUT, el archico se abre solo para escritura, es el formato que seutiliza en los achivos de impresión y secuenciales. Tiene la

 particularidad que crea el fichero nuevo cada vez que se utiliza, por lotanto hay que tener cuidado con archivos Indexados.

y  EXTEND, igual que el anterior pero no crea el archivo, sino que lainformación se va añadiendo a la ya existente. Se utiliza para archivossecuenciales.

Las opciones EXCLUSIVE y WITH LOCK, nos indica cuando trabajamos en

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 34/86

 

multipuesto que éste archivo estará bloqueado, es decir que no estarádisponible para otros usuarios. El hecho de que existan dos opciones para lomismo es por compatibilidad con versiones anteriores.

La opción WITH NO REWIND, se utiliza cuando utilizamos archivos decinta, para que no la rebobine al abrirla.

...PROCEDURE DIVISION.INICIO.

OPEN INPUT ARTICULOS.OPEN I-O CLIENTESOPEN EXTEND IMPRE.

CREAR-ARCHIVO.

OPEN OUTPUT TRABAJO CLOSE TRABAJO....

Nota: Con éstas tres instrucciones estamos abriendo tresarchivos, cada uno de una forma diferente.Tambienpodriamos haberlos puesto en una sola linea de lasiguiente forma:

OPEN INPUT ARTICULOS I-

O CLIENTES EXTEND IMPRE.

En el caso del archivo TRABAJO, se consigue crearlo comonuevo, exista antes o no.

Instr. de Archivos  página(s) : 2/5(6114 palabras totales en este texto)(79108 Lecturas)

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 35/86

 

 CLOSE, ésta es la instrucción contraria a OPEN, es decir termina la conexiónestablecida con el archivo, a partir del momento que aparezca ésta instrucciónel archivo no estará disponible para operar con él, hasta la próxima vez que se

abra. Obviamente antes de cerrarlo debe de estar abierto.CLOSE nombre de archivo ( WITH LOCK ) (WITH NO R EWIND )

El nombre de archivo corresponderá a algún archivo abierto anteriormente.

 

Las opciones WITH LOCK y WITH NO REWIND , tienen la mismaexplicación que la vista en la orden OPEN.

...

PROCEDURE DIVISION.INICIO.OPEN INPUT ARTICULOS.OPEN I-O CLIENTESOPEN EXTEND IMPRE.

...

...

...CERRAR.

CLOSE ARTICULOS CLIENTES IMPRE.

...

Nota: Apuntaré que si finalizamos el programa con lasentencia STOP RUN, que luego veremos, los archivos queestuvieran abiertos se cierran automáticamente aunque no sehaya especificado la orden CLOSE. Anque siempre es

 preferible utilizarla, ya que puede haber algunoscompiladores mas antiguos que no los cierren.

Me gustraría destacar de éstas dos instrucciones vistas que lomas normal es no utilizar ninguna de las opciones, es decir solo abrir de una manera el archivo para su uso y una vezhayamos acabado con él, cerrarlo.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 36/86

 

R EAD, es la instrucción que utilizamos para leer registros de un archivo, debede estar abierto. Con ella conseguimos que los datos referentes al registroaccedido queden en la descripción de dicho fichero, es decir, conseguimos quelos campos declarados en la FD, tengan el valor correspondiente al registro

leido.

La sentencia READ, se utiliza para leer ficheros secuanciales o indexados, o para leer indexados de manera secuencial, por lo que su sintaxis tiene dosformatos principales.

Formato para leer ficheros de manera secuncial. (Indexados o

 

secuenciales) 

 

R EAD nombre de archivo ( NEXT/PR EVIOUS R ECORD)

( INTO descripción) (AT END / NO AT END  sentencia) END-R EAD 

 

nombre de archivo corresponderá a algún archivo abierto anteriormente.

La opción NEXT RECORD, indica que se va a leer el siguiente registro y es laque se toma por defecto, ya que, cuando estamos leyendo un archivo de formasecuencial, éste leerá registros uno tras otro, hasta llegar al final.

La opción PREVIOUS RECORD leería el registro anterior. Esta opción es laúnica que no es válida para ficheros secuenciales de éste formato.

La opción INTO, indica cual de las descripciones de registro que hayamos podido declarar será la que almacene los datos del registro leido. Tenemos quetener en cuenta que Cobol nos permite mantener mas de una descripción deregistro para un mismo archivo. Si tuvieramosmas de una, ésta sería la opción

 para indicarle cual es la que queremos utilizar en ésta lectura.

La sentencia que va después de AT END , indica que debe de hacer el programa al llegar al final del fichero. Puede ser cualquier orden de cobol,

 pero es evidente que si volvemos a leer una vez llegado al final, producirá unerror.

...PROCEDURE DIVISION.INICIO.

OPEN INPUT ARTICULOS.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 37/86

 

LECTURA.READ ARTICULOS NEXT RECORD AT END GO

CERRAR....

......GO LECTURA.

CERRAR.CLOSE ARTICULOS.

...

Nota: Si bien este formato nos sirve para leer cualquier tipode archivo de manera secuencial, en el caso de que el archivo

fuera secuencial, éste solo se podría leer así.Existen muchas ocasiones en que un archivo indexado nosinteresa leerlo de manera secuencial. Si lo hicieramos éstesería su formato, además en éste caso podriamos leerlo tantodel principio al final con la opción NEXT, como del final al

 principio con la opción PREVIOUS.

Para poder leer un fichero indexado de manera secuencial,deberemos de haber especificado en la SELECT, que su

acceso va a ser DYNAMIC o SEQUENTIAL.

Instr. de Archivos 

 página(s) : 3/5(6114 palabras totales en este texto)(79108 Lecturas)

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 38/86

 

Formato para leer ficheros indexados con acceso aleatorio. 

 

R EAD nombre de archivo (INTO descripción) (K EY nombre de clave)

 

( INVALID K EY / NOT INVALID K EY sentencia) END-R EAD 

Las opciones que se repiten con con el formato anterior tienen el mismoformtato y producen el mismo resultado.

 

La opción KEY, indica por que clave se va a leer el fichero, siempre que éstetenga mas de una.

La sentencia después de INVALID KEY se utiliza para ejecutar una accióncuando se intenta acceder a un registro que no existe. En el caso deutilizarNOT INVALID KEY sería al contrario, es decir cuando el registro

existe.

...PROCEDURE DIVISION.INICIO.

OPEN INPUT ARTICULOS.LECTURA.

MOVE 100 TO CLAVE-ARTICULO.READ ARTICULOS INVALID KEY GO ERROR.

...

...

...GO LECTURA.

ERROR.......CERRAR.

CLOSE ARTICULOS....

Nota: Sin duda la forma mas usual de acceder a un registroserá por su clave. Asi por ejemplo para acceder a un ficherode poblaciones cuya clave fuera su código postal, dandocualquier código accederiamos a ese registro en concreto.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 39/86

 

La acción que hagamos después de un INVALID KEY,dependerá del contexto en que se encuentre, podremos volver a solicitar otra clave, permitir crear un registro, etc..

WRITE, con ésta instrucción se consigue grabar la información contenida enese momento en los campos del registro de un fichero. Es decir, siintroducimos una ficha nueva en la agenda con los datos de un nuevo amigo,ésta instrucción será la que nos sirva para almacenar en el fichero los datos. A

 partir de ese momento estarán disponibles tantas veces como queramos paraleerla. Y por supuesto el fichero debe de estar abierto como OUTPUT o I-O.

WRITE nombre de re g istr o ( FROM descripción) ( INVALID K EY / NOT 

 

INVALID K EY sentencia)END-WRITE 

La opción FROM, indica con cual de las descripciones de registro quehayamos podido declarar se graben los datos en el fichero. Hay que señalar que ésta descripción puede estar definida en la WORKING, y lo que nosahorra en realidad es mover los datos de esa descripción que hemos usadocomo "temporal" a la auténtica descripción del registro.

Las cláusulas de INVALID KEY y NOT INVALID KEY, tienen la mismafunción dada en la instrucción READ. Solo que aqui, INVALID KEY , se produciría cuando al grabar el registro, éste ya existiese o hubiera algún error  por el cual no se pudieran grabar los datos.

...PROCEDURE DIVISION.INICIO.

OPEN I-O ARTICULOS.LECTURA.

MOVE 100 TO CLAVE-ARTICULO.MOVE "ANDRES MONTES" TO NOMBRE.WRITE REGISTRO-ARTICULO INVALID KEY GO

ERROR.......

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 40/86

 

GO CERRAR.ERROR.......

CERRAR.CLOSE ARTICULOS....

Nota: Aunque se puedan utilizar varias descripciones, lo maslógico es utilizar siempre la misma para cada fichero. El error mas probable siempre que sea una INVALID KEY, suele ser que existe un registro ya con esa clave, a parte de ese, faltade espacio en disco, archivo mal abierto o sin abrir.

Además de éste formato, existe para ésta instrucción otro muy común. Y es el

 

que utilizamos para enviar datos a la impresora, es decir para listar, paraimprimir.

Es en éste caso, donde se hace indispensable el uso de mas de una descripción por registro. ¿Porque? Sencillo, definiremos nuestro fichero con un registro de

tamaño igual al ancho de nuestro listado, y luego en la WORKING,describiremos el formato de cada una de las lineas que utilizaremos en laimpresión. Quiero hacer un ejemplo mas extenso para éste caso, que será muyutilizado y distinto en su filosofía al resto.

WRITE nombre de re g istr o ( FROM descripción) ( AFTER númer o de

 

lineas)(PAGE)END-WRITE 

Además para éste formato tendremos la cláusula AFTER, en la cual indicamosel número de lineas que debe de avanzar la impresora antes de escribir, o bienque lo haga directamente al principio de la siguiente página, poniendo AFTER PAGE. Existen algunas otras cláusulas, pero no las vamos a ver aquí por ser 

 poco usadas.

IDENTIFICATION DIVISION.PROGRAM-ID. LISTADO.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 41/86

 

ENVIRONMENT DIVISION.CONFIGURATION SECTION.

DECIMAL-POINT IS COMMA.INPUT-OUTPUT SECTION.

FILE-CONTROL.SELECT IMPRESORA ASSIGN TO PRINT "LPT1".DATA DIVISION.FILE SECTION.FD IMPRESORA LABEL RECORD OMITTED.01 REG-IMPRE PIC X(80).WORKING-STORAGE SECTION.01 LINEA1.

02 FILLER PIC X(30) VALUE SPACES.02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA

1".01 LINEA2.

02 FILLER PIC X(30) VALUE SPACES.02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA

2".......PROCEDURE DIVISION.INICIO.

OPEN OUTPUT IMPRESORAESCRIBIR.WRITE REG-IMPRE FROM LINEA1 AFTER PAGE.WRITE REG-IMPRE FROM LINEA2 AFTER 2.

...

...CERRAR.

CLOSE IMPRESORA....

Nota: Como podeis ver, hemos definido el registro comoREG-IMPRE, pero al escribir sobre el fichero impresorautilizamos las descripciones de LINEA1 y LINEA2, de éstamanera conseguimos que se impriman las dos lineas en unaimpresora conectado al puerto LPT1 y que antes de escribir la primera linea, salte a una página en blanco.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 42/86

 

 

Instr. de Archivos 

 página(s) : 4/5(6114 palabras totales en este texto)(79108 Lecturas)

R EWRITE, ésta instrucción se utiliza para regrabar datos de un registro ya

existente. Toda la sintaxis es exactamente igual que la explicada en WRITE.R EWRITE nombre de re g istr o ( FROM descripción) ( INVALID K EY /

 

NOT INVALID K EY sentencia) END-R EWRITE 

Todas las opciones igual que en WRITE. Por lo que en el ejemplo vamos a ver ambos casos juntos.

...PROCEDURE DIVISION.

INICIO.OPEN I-O ARTICULOS.

LECTURA.MOVE 100 TO CLAVE-ARTICULO.MOVE "ANDRES MONTES" TO NOMBRE.WRITE REGISTRO-ARTICULO INVALID KEY GO

ERROR.MOVE "OTRO NOMBRE" TO NOMBRE.REWRITE REGISTRO-ARTICULO INVALID KEY

GO ERROR.......

GO CERRAR.ERROR.......

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 43/86

 

CERRAR.CLOSE ARTICULOS.

...

Nota: Podemos decir que ésta sentencia es la queutilizaremos para modificar el contenido de cualquier registro, pero eso si, nunca podremos alterar la clave, solo loscampos que no formen parte de la clave principal.

Si quisieramos modificar cualquiera de los campos clave deun registro, deberíamos crear uno nuevo con el mismocontenido pero con la clave que ahora queramos y luego

 borrar el que teníamos.

DELETE, instrucción para borrar un registro de un fichero. La explicación escorta, pero tiene pocos mas matices, lo que conseguimos es borrar todos losdatos de un registro. Su sintaxix es la siguiente:

DELETE nombre de ficher o ( INVALID K EY / NOT INVALID

 

K EY sentencia) END-DELETE 

Las únicas cláusulas INVALID y NOT INVALID KEY, se usan exactamenteigual que en las demás relativas a ficheros, es decir ejecutará la sentencia que

 pongamos a continuación cuando una de las condiciones se cumpla, que laclave exista o que no exista.

Si nos fijamos vemos que la gran diferencia está en que aquí la orden hacereferencia al nombre del fichero y no al del registro, como en las instruccionesanteriores.

...PROCEDURE DIVISION.INICIO.

OPEN I-O ARTICULOS.LECTURA.

MOVE 100 TO CLAVE-ARTICULO.READ ARTICULOS INVALID KEY GO ERROR.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 44/86

 

DELETE ARTICULOS INVALID KEY GO ERROR.......

GO CERRAR.

ERROR.......CERRAR.

CLOSE ARTICULOS.......

Nota: Obviamente para borrar un registro, primero hemos de

tenerlo en memoria, por eso en el ejemplo lo he leido primero.

Instr. de Archivos 

 página(s) : 5/5(6114 palabras totales en este texto)(79108 Lecturas)

STAR T, ésta instrucción es de suma importancia en el tratamiento deficheros, y nos sirve para posicionarnos en cualquier parte del mismo, parauna lectura mas rápida. Si imaginamos un fichero con 10.000 clientes,

clasificados por código, para ver todos los que cuyo código es mayor a 9.000,tendríamos que leernos el fichero secuencialmente hasta llegar al sitiocorrecto, en cambio con ésta orden, podremos colocarnos en la posición delfichero que queramos dentro de unas normas, que veremos a continuación.

STAR T nombre de ficher o K EY (expresión) nombre de clave ( INVALID

 

K EY / NOT INVALID K EY sentencia) END-STAR T 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 45/86

 

 Las únicas cláusulas INVALID y NOT INVALID KEY, se usan exactamenteigual que en las demás relativas a ficheros, es decir ejecutará la sentencia que

 pongamos a continuación cuando una de las condiciones se cumpla, que la

clave exista o que no exista.

Si nos fijamos vemos que la gran diferencia está en que aquí la orden hace

 

referencia al nombre del fichero y no al del registro, como en las instruccionesanteriores.

La expresión a la que se hace referencia en la sintaxis, pueden ser lassiguientes:

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

...PROCEDURE DIVISION.INICIO.

OPEN I-O ARTICULOS.COLOCAR.

MOVE 100 TO CLAVE-ARTICULO.START ARTICULOS KEY NOT LESS KEY CLAVE-

ARTICULOSINVALID KEY GO ERROR.

LECTURA.

READ ARTICULOS NEXT RECORD AT END GOCERRAR.

...GO LECTURA.

ERROR....

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 46/86

 

...GO CERRAR.

ERROR....

...CERRAR.CLOSE ARTICULOS.

...

...

Nota: Aquiempezariamos a leer el ficher artículos desde laclave que no sea menor que 100, es decir de 100 en adelante.Fijaros como luego la lectura se hace en otro párrafo

diferente, ya que sino, siempre estariamos haciendo

 

el START. Recordad que con ésta instrucción SOLO nossituamos en un sitio determinado del fichero, a partir de ahí

 podremos operar como queramos.

R ESUMIENDO 

En la programación estructurada es conveniente sustituir el punto como finalde una instrucción por la cláusula END-....... para cada instrucción. De esta

manera conservamos la estructura y no obligamos con el punto a finalizar ninguna instrucción o bucle en el que estemos metidos.

Una vez vistas todas las intrucciones relativas a ficheros, quiero dejar bienclaro su utilización.

Tendremos siempre en cuenta que cuando leemos, realmente le damos el valor del registro que hemos leido a los campos o variables que lo componen. Quecuando grabamos o regrabamos, le estamos dando el valor de las variables en

ese momento al registro para que se grabe en disco y cuando borramos,estamos quitando fisicamente del disco esa información.

He realizado un temático dedicado integramente al uso de ficheros, podéisecharle un vistazo por si os han quedado dudas. Temáticos 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 47/86

 

 

Instr. de Pantalla 

 página(s) : 1/3(5792 palabras totales en este texto)(68602 Lecturas)

Sin duda alguna e independientemente del lenguaje de programaciónescogido, las instrucciones que mas se suelen utilizar, serán las que hagan uso

de la pantalla, ya sea como salida o entrada de información.

 

Para la programación en Windows, pondré la información en la Sección"Programando en Windows".

Vamos a utilizar ésta sección para hacer un análisis profundo de dichasinstrucciones.

ACCEPT, es la instrucción que usaremos para la entrada de datos. Aunque susintaxis principal nunca ha variado, ésta ha sido una de las instrucciones que

 

mas cláusulas se le han ido añadiendo, incluso diferentes según el compilador,aquí vamos a explicar las comunes y principales.

Aunque la forma mas usual de utilizarla, es para aceptar datos por el teclado,también es posible utilizarla para "cogerlos" también del sistema, para aceptar valores de variables de entorno definidas previamente a nivel de sistema o

 para aceptar pantallas completas definidas en la SCREEN-SECTION. Además

siguen aumentando sus posibilidades. Veamos sus formatos principales:Formato para aceptar datos del sistema o variables de entorno. 

 

ACCEPT variable FROM (DATE, DAY, DAY-OF-WEEK, TIME,

CENTURY-DATE, CENTURY-DAY, ESCAPE-K EY,

ENVIRONMENT variable de ent or no)

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 48/86

 

Según la opción escogida, así será el valor que contendrá la variable usada,una vez completada la sentencia. Veamos cada una de las opciones:

y  DATE, devuelve la fecha en formato AAMMDD, por lo que la variable

debe de estar definida con PIC 9(6).y  CENTUY-DATE, igual que DATE, pero acepta la fecha con 8 dígitosen formato SSAAMMDD. Definir con PIC 9(8).

y  DAY, devuelve el año y el día del año en que estamos con el formatoAADDD, siendo el valor 1, para el 1 de Enero y así sucesivamente.Debe de estar definida con PIC 9(5).

y  CENTURY-DAY, igual que DAY, pero acepta 4 dígitos para el año,quedando el formato AAAADDD. Definir con PIC 9(7).

y  DAY-OF-WEEK, devuelve un dígito que indica el día de la semana,siendo 1 el Lunes, 2 el Martes, ... Aquí, la variable debe de estar 

definida comoPIC 9.y  TIME, devuelve la hora con formato HHMMSSMM, la variable debe

de estar como PIC 9(8).y  ESCAPE-KEY, devuelve el código de la tecla de excepción pulsada,

debe de estar definida con PIC 99 y según el compilador los valores pueden ser distintos, pero los básicos suelen ser los mismos, por ejemplo: ENTER=13, FLECHA ARRIBA=52, FLECHA-ABAJO=53 ylas teclas de función desde F01 hasta F8 tomarían los valores del 1 al 8,TAB=9.

y ENVIRONMENT "

V ariable de ent or no" , nos devuelve el valor quedicha variable tenga asignado, normalmente éstas variables se asignan

en el fichero de configuración del compilador o desde una variable delsistema. Puede ser muy útil para darle capacidades a usuarios diferentes

 por ejemplo. Tener en cuenta que la variable de entorno debe de ir entrecomillas para que sea reconocida.

La definición de la variable que he dado, no es fija, pero si la mas

conveniente, es decir para guardar el dia de la semana, he indicado unavariable con PIC 9, pero podíamos haber escogido PIC 9(8), lo que pasa, esque no tendría mucho sentido malgastar espacio, cuando sabemos conseguridad, que el dato posible es de 1 a 7, y por lo tanto de PIC 9.

Además de todas éstas opciones, cada compilador ha ido incorporando las queha creido conveniente y por ejemplo con algunas de las nuevas es posible

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 49/86

 

saber información sobre el sistema sobre el que trabajamos, el terminal, lalínea, etc ....

...

WORKING-STORAGE SECTION.77 DIA PIC 9.77 FECHA PIC 9(6).77 FECHA8 PIC 9(8)....PROCEDURE DIVISION.INICIO.

ACCEPT DIA FROM DAY-OF-WEEK.ACCEPT FECHA FROM DATE.ACCEPT FECHA8 FROM CENTURY-DATE.

...

Nota: Si usarames éste programa el día 1 de Julio de 1.999,el valor de las variables sería:

FECHA=990701.FECHA8=19990701DIA=4.

El 4 nos indicaría que el día de la semana sería Jueves.

Formato para aceptar datos por el teclado. 

 

ACCEPT variable CLAUSULAS ... ON EXCEPTION variable in strucción. 

La lista de cláusulas es muy larga, y por desgracia algunos compiladores pueden tener mas que otros, 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.

y  LINE variable, con stante numérica, (ACCEPT Y DI S  PLAY) leindicamos la línea donde se aceptará el campo, puede ser una variable oun número, tendremos siempre en cuenta que la línea 1 será la primerade arriba de la pantalla, normalmente podremos trabajar con 24 líneas.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 50/86

 

Si no se específica tomará la referencia de la siguiente línea en la queestemos.

y  COLUMN, COL, POSITION variable, con stante

numérica, (ACCEPT Y DI S  PLAY) aquí le indicamos la columna dentro

de la línea y sus valores pueden ser desde 1 (izquierda) hasta 80(derecha) de la pantalla. En algunos terminales es posible capturar 132columnas. Si no se especifica tomará el valor 1.

 

y  BEEP, NO BEEP, (ACCEPT Y DI S  PLAY) con ésta opción leindicamos si queremos o no que emita un pitido al llegar al comando.Por defecto sonará.

y  BLINK , (ACCEPT Y DI S  PLAY) si aparece ésta cláusula, el campo queaceptemos parpadeará.

y  HIGH, LOW, OFF, (ACCEPT Y DI S  PLAY) le indicamos el nivel deluminosidad con que se acepta el campo, solo puede ir especificado

uno:HIGH con brillo, LOW sin brillo, OFF hace que los datos queintroducimos no se vean, se utiliza cuando queremos aceptar unacontraseña o alguna clave, en la pantalla no salen los datos que vamosintroduciendo. Si no indicamos ninguna el sistema coge HIGH por defecto.

y  TAB, (ACCEPT) la presencia de ésta cláusula hace que no salte alsiguiente campo hasta que no pulsemos ENTER. Por defecto alintroducir el número de caracteres o dígitos del campo saltaautomáticamente.

y  TIME variable, con stante numérica, (ACCEPT) conseguiremos que laespera para introducir el campo sea limitada y vendrá dada por el valor que le asignemos. El valor se indica en centésimas de segundo.

 

y  CURSOR variable, (ACCEPT) si especificamos ésta cláusula, elsistema guardará en la variable la posición donde se ha terminado laintroducción de los datos. Por ejemplo si aceptamos un campo de PICX(40) y solo rellenamos 9 caracteres, el valor de la variable asociadaa CURSOR será de 10.

y  ERASE, haremos que se borra toda la pantalla.y  ERASE EOL, (ACCEPT Y DI S  PLAY) le indicamos que borre la línea

sobre la que estamos desde la posición del ACCEPT.y  ERASE EOS, (ACCEPT Y DI S  PLAY) le indicamos que borre toda la

 página desde la posición de la línea en la que estamos.

|

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 51/86

 

 

Instr. de Pantalla 

 página(s) : 2/3(5792 palabras totales en este texto)(68602 Lecturas)

y PROMPT carácter , (ACCEPT) conseguimos que rellene con algúncarácter específico o por defecto el cursor bajo (_) la longitud delcampo que vamos a aceptar. Es bastante útil ya que el usuario puede ver claramente la longitud del campo.

y  ECHO, (ACCEPT) con ésta cláusula hacemos que vuelva a "pintar" elcontenido del campo después de aceptado. Es decir si le hemos

 puesto PROMPT ECHO, 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.

y  R EVERSE, (ACCEPT Y DI S  PLAY) conseguimos que el campo que

aceptamos se vea en video inverso, si normalmente es blanco sobrenegro, se hará negro sobre blanco, y si tenemos otros colores, pues en sucolor inverso.

y  SIZE variable, con stante numérica, (ACCEPT) variamos el tamaño dela variable que teníamos declarado. Por ejemplo si definimos unavariable con PIC X(40) y le indicamos al aceptarla SIZE 10, solo

 

aceptará 10 caracteres para esa variable.y  CONVER T, (ACCEPT Y DI S  PLAY) con ésta cláusula conseguimos

que si estamos aceptando un campo numérico o alfabético, e

introducimos un valor no aplicable, lo ignore. Por ejemplo siintroducimos una letra en un campo numérico será ignoradasiCONVERT aparece.

y  UPDATE, (ACCEPT) hace que el valor actual del campo aparezca y alaceptar podamos modificar sobre su contenido actual. Es muyaconsejable cuando estamos modificando datos.

y  CONTROL tipo de contr ol , (ACCEPT Y DI S  PLAY) ésta cláusula es

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 52/86

 

 bastante amplia y en ella podemos atribuir otras opciones comocaracteres gráficos, colores, etc.. Su uso puede variar según loscompiladores. Mas abajo encontrareis mas información.

y  ON EXCEPTION variable in strucción (ACCEPT) si al aceptar el

campo introducimos una de las teclas que causa excepción, es decir queno es reconocida dentro de la tabla de caracteres admitida, el valor de latecla se guardará en la variable que definamos y a continuación

 

 podremos realizar una instrucción. Por ejemplo si estamos aceptando uncampo con PIC X(40) y cuando estamos metiendo su valor pulsamos latecla escape, si tenemos ésta cláusula puesta la variable tomará el valor 27 (correspondiente a la tecla escape) y a continuación se ejecutaría lainstrucción que hubiéramos puesto. Pero todo esto se ve mejor con losejemplos que a continuación voy a indicar. Decir que la variable debede estar definida con PIC 9 COMP-1.

y  UPPER, LOWER, (ACCEPT) con éstas opciones obligamos a que elvalor del campo aceptado esté en Mayúsculas (UPPER ) o Minúsculas(LOWER).

y  COLOR, (ACCEPT  y DI S  PLAY) cláusula propia de Acucobol con laque conseguimos aceptar el campo con un determinado color dependiendo de una tabla para asignación de colores.

y  R EQUIR ED, (ACCEPT) con ésta opción obligamos al usuario a que nodeje el campo en blanco e introduzca cualquier dato.

y  FULL, (ACCEPT) obligamos a que una vez empecemos a introducir un

campo, este no se acepte hasta que esté completo, es decir si aceptamosuna variable con PIC X(30), mientras no introduzcamos los 30caracteres no nos dejará seguir.

Color  Letra Fondo  Observaciones 

  Negro 1 32 Para conseguir los colores,debemos de sumar las doscantidades correspondientes a

la letra y al fondo, por ejemplosi queremos el fondo blanco yla letra azul, el valor que se ledebería de asigna a la cláusulaCOLOR será de 258 (256 fondo

 blanco + 2 letra azul).

Azul 2 64

Verde 3 96

Celeste 4 128Rojo 5 160

Morado 6 192

Marrón 7 224

Blanco 8 256

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 53/86

 

 

TIPOS DE CONTROL. Voy a explicar algunos de los atributos que se pueden utilizar cuando la frase CONTROL se especifica en ACCEPT o

DISPLAY. El formato es el siguiente:

CONTROL "FCOLOR=color, .............".

y  FCOLOR , color de primer plano, utilizaremos los nombres de loscolores (white, black, red, blue, green, magenta, brown y cyan).

y  BCOLOR , color de fondo y la gama de colores igual que la anterior.

Formatos Windows (100&100) de ACCEPT en Acucobol: 

 

Con Acucobol (y hablo de él, por ser el que utilizo en la actualidad) se permiteaceptar cualquier control gráfico típico de windows, como un ENTRY-FIELD, directamente desde laPROCEDURE DIVISION y con elcomando ACCEPT propio de Cobol. Evidentemente cambia un poco sobretodo porque las cláusulas o propiedades son mucho mas amplias.

...WORKING-STORAGE SECTION.77 NOMBRE PIC X(30).77 CODIGO PIC 9(5).77 ESCA PIC 9 COMP-1.77 QW PIC 9....PROCEDURE DIVISION.INICIO.

ACCEPT NOMBRE LINE 10 COL 20 PROMPT LOWREVERSE ECHO CONTROL "FCOLOR=BLUE,

BCOLOR=WHITE" ON EXCEPTION ESCA MOVE 1 TO QW.ACCEPT CODIGO LINE 12 COL 20 CONVERT.

...

Nota: Con el primer ACCEPT conseguiriamos introducir un valor en

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 54/86

 

la variable NOMBRE, lo aceptaremos en brillo suave con videoreverso y una vez introducido el campo, este se volverá a mostrar tal ycomo va a quedar, gracias a ECHO. Además se aceptará en color azulcon fondo blanco y si pulsamos una de las teclas que causan excepcion

 

según los valores permitidos, esta se guardaría en la variable ESCA yluego podríamos preguntar por su valor. Por ejemplo si pulsamos F1,F2, F3 tomará el valor 1, 2, 3. Si pulsamos ENTER (13) ESCAPE (27),Tabular (9), etc ...La siguiente orden nos permitirá aceptar la variable CODIGO en lacual los carácteres no numéricos no se admitirán al llevar laclásusula CONVERT.

Os aconsejo que hagáis todo tipo de pruebas con las opcionesdisponibles hasta que el resultado sea el que deseáis.

Muchas veces cuando se muestra un mensaje, se acepta una variable acontinuación solo para dar tiempo al usuario. Algunos compiladorescomo Acucobol han implementado la siguiente opción:ACCEPT OMITTED, y así no tenemos que definir ninguna variable.

Teneis que tener en cuenta que algunas de las cláusulas que explico es posible que no funcionen en todos los compiladores, así como es posible que existan otras que yo desconozca debido a que son usadas

 

 por otros compiladores.

(1/3) |

 

Instr. de Pantalla 

 página(s) : 3/3

(5792 palabras totales en este texto)(68602 Lecturas)

DISPLAY, es la instrucción que usaremos como salida de datos en pantalla.Con ella mostraremos cualquier texto, cualquier variable, cualquier constante

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 55/86

 

o cualquier valor, en resumidas es la instrucción para que aparezca lo que seaen pantalla. Las cláusulas asociadas a esta instrucción son practicamente lasmismas que hemos visto para ACCEPT, con lo que solo las indicaré, suexplicación la obtendréis arriba. De todas maneras ésta instrucción está siendo

implementada en muchos mas campos, por determinados compiladores y nosería justo pensar que su única función es la que voy a explicar aquí, lo que sies cierto es que ésta es la común a todos los compiladores. Mas abajo hablaréun poco de todo esto que os digo y de su futuro.

DISPLAY variable, literal  CLAUSULAS ... 

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

TIPOS DE CONTROL. Además de los vistos en ACCEPT yDISPLAY podemos utilizar otros:

CONTROL "FCOLOR=color, .............".

y  FCOLOR , igual que en ACCEPT.y  BCOLOR , igual que en ACCEPT.y  GRAPHICS, según una tabla es posible utilizar caracteres semigráficos

en cualquier sistema. Cuando programamos en MS-DOS, estos

caracteres se pueden asignar muy facilmente pero al trabajar consistemas UNIX-LINUX, gracias a ésta cláusula podemos conseguir esoscarácteres. Existe una tabla para asignar los valores, por ejemplo la "q"nos da la linea horizontal (Alt+196 (-)) con la que se forman loscuadros, la "m" nos da la vertical (Alt+179 (¦)) Aqui no se ven bien.

y  WINDOW-CR EATE, WINDOW-R EMOVE, En RM/Cobol, tambiénse utiliza para crear y borrar las pantallas virtuales con las que Cobol

 puede trabajar, pero para ver su uso, os podeis ir a la sección que existeespecífica para ello en TEMATICOS.

...WORKING-STORAGE SECTION.77 NOMBRE PIC X(30)....PROCEDURE DIVISION.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 56/86

 

INICIO.DISPLAY " " LINE 1 ERASE CONTROL

"FCOLOR=BLUE, BCOLOR=WHITE".DISPLAY "INTRODUZCA EL NOMBRE" LINE 10

COL 10 REVERSE.ACCEPT NOMBRE LINE 10 COL 34 PROMPT LOWECHO.

...

Nota: Una cosa a tener en cuenta tanto con FCOLOR, comocon BCOLOR, es que los colores que tomen seguiránactivos hasta encontrar otra orden que los cambie, por eso al

comenzar con esa primera linea conseguimos que toda la pantalla se muestre blanca y el texto en azul para todo el

 

 programa, hasta que se encuentre el compilador con otralinea que lo cambie. O sea que no será necesario seguir incluyendo la cláusula CONTROL, en todos los ACCEPT yDISPLAYque vayamos a utilizar mientras queramosmantener éste formato.

Otros formatos de DISPLAY: 

DISPLAY nombre de pantalla CLAUSULAS ..., podemos mostrar una

 

 pantalla completa que previamente hayamos definido en la SCREENSECTION.

DISPLAY WINDOW CLAUSULAS ... , en Acucobol se utiliza para crear las ventanas virtuales con las que Cobol puede trabajar, pero para ver su uso,os podeis ir a la sección que existe específica para ello TEMATICOS.

DISPLAY LINE CLAUSULAS ..., conseguimos dibujar una línea vertical uhorizontal donde le indiquemos con las cláusulas correspondientes. (No todoslos compiladores), se incorporan además éstas cláusulas:

y  SIZE variable, con stante numérica, longitud de la línea (horizontal).y  LINES variable, con stante numérica, altura de la línea (vertical).

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 57/86

 

 DISPLAY BOX CLAUSULAS ..., igual a la anterior per conseguimosdibujar un cuadro, muy útil, pero no todos los compiladores lo tienenimplementado. Se incorporan además éstas cláusulas:

y  SIZE variable, con stante numérica, anchura del cuadro (horizontal).y  LINES variable, con stante numérica, altura del cuadro (vertical).y  TITLE variable, con stante alfanumérica, título del cuadro.

 

y  TOP, BUTTON, CENTER ED, RIGHT, LEFT  posición que ocuparáel título dentro del cuadro.

Formatos Windows (100&100) de DISPLAY en Acucobol: 

 

Acucobol en su afán por conseguir una programación totalmente integrada conlos sistemas gráficos, ha conseguido implementar a la orden DISPLAY la

 potencia necesaria para displayar ventanas Windows (100%100) así comocualquier tipo de control. Hoy podemos con una linea de código displayar unCOMBOBOX, LABEL, FRAME, BITMAP, STANDARD WINDOW,FLOATING WINDOW, PUSH-BUTTON, ENTRY-LABEL, etc... y asignarlecualquiera de sus propiedades. Pero es un tema demasiado amplio para tratarlodesde aquí. Necesitaría una sección unica y exclusivamente para la

 programación gráfica, pero todo se andará.

Os aseguro que es muy grato obtener resultados Windows, programandodirectamente con el editor de MS-DOS (ese azul con muy pocas opciones) sinnecesidad de ninguna herramienta externa, que también existe.

Instr. de Variables 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 58/86

 

  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 quehacen referencia a las variables y sus valores. Como todas, este grupo deinstrucciones tiene su vital importancia en la programación y son usadashabitualmente.

MOVE, es la instrucción que usaremos para enviar datos de una variable a

 

otra u otras.Lo que en realidad hace es que la una variable adquiera un valor determinado, ya sea procedente de otra variable o bien desde un valor fijo oconstante.

Estos son los dos formatos que posee:

Formato 1: 

MOVE variable, val or  TOvariable, variable, variable, ....

Con el primer formato las variables que siguen al TO tomarán el datode la variable o del valor que le preceden. De todo se verá al final unaserie de ejemplos bien detallados.Siempre tendremos una serie de normas o restricciones paraasegurarnos de que los valores han pasado correctamente.

y  Los campos numéricos siempre se van a alinear a la derecha,respetando la posición del punto decimal si lo hubiera. Si lavariable que recibe el campo es mas pequeña, evidentemente se

 perderán los que no quepan y si es mas grande el resto se pondrá a ceros.

Si además el campo al que se mueven los datos es de edición, al hacer el

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 59/86

 

 paso del valor, este a su vez se formateará con la edición declarada enlaWORKING.

Si son alfanuméricos la alineación se efectuará a la izquierda a menos quese haya especificado en la WORKING, al definirla, una justificación a la

derecha (JUST RIGHT). 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á rellenode espacios en blanco.

...WORKING-STORAGE SECTION.77 NUMERO1 PIC 9(6).77 NUMERO2 PIC 9(8)V99.77 NUMERO3 PIC ZZZ.ZZZ,ZZ.

77 TEXTO1 PIC X(15) VALUE "LENGUAJECOBOL".77 TEXTO2 PIC X(10).77 TEXTO3 PIC X(20) JUST RIGHT....PROCEDURE DIVISION.INICIO.

MOVE 1536 TO NUMERO1.MOVE NUMERO1 TO NUMERO2 NUMERO3.

MOVE TEXTO1 TO TEXTO2 TEXTO3....

Nota: Después de aplicar estas sentencias, éste sería elresultado:

 NUMERO1=001536 NUMERO2=0000153600 (La coma decimal es virtual)  NUMERO3= 1.536,00

TEXTO1=LENGUAJE COBOLTEXTO2=LENGUAJE CTEXTO3= LENGUAJE COBOL

Formato 2: 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 60/86

 

 MOVE CORR   Identificad or1 TO Identificad or2 

 

Agregando CORR a la instrucción conseguimos mover de una sola vez un

valor entre identificadores siempre que los campos que contengan tengan elmismo nombre. Estos identificadores no pueden ir en niveles 66, 77 ni 88. Elefecto es el mismo que si hicieramos tantos MOVE normales como camposiguales tuviera el identificador. No es muy usual, pero si hay casos en losque puede ser razonable su uso.

 No es necesario que tengan el mismo PIC, ni que estén en el mismo orden,solo que coincidan en su nombre.

...

WORKING-STORAGE SECTION.01 DATOS1.

02 NOMBRE PIC X(30).02 REGION PIC X(20).02 PAIS PIC X(15).

01 DATOS2.02 PAIS PIC X(10).02 REGION PIC X(10).02 NOMBRE PIC X(10).

...PROCEDURE DIVISION.INICIO.

MOVE "ANDRES MONTES" TO NOMBRE IN DATOS1.MOVE "ANDALUCIA" TO REGION IN DATOS1.MOVE "ESPAÑA" TO PAIS IN DATOS1.MOVE CORR DATOS1 TO DATOS2.

...

Nota: Para partir con unos valores, primero los he movido a lasvariables del primer grupo (DATOS1). Después de aplicar el MOVECORR, el valor de las variables de DATOS2 sería:

DATOS2:PAIS=ESPAÑAREGION=ANDALUCIA

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 61/86

 

NOMBRE=ANDRES MON

Fijaros que aunque el orden ni el tamaño era el mismo, el resultado esel que queríamos.

Instr. de Variables 

 página(s) : 2/5(5707 palabras totales en este texto)(74243 Lecturas)

INITIALIZE, se utiliza para inicializar variables según su descripción, esdecir pondrá a ceros todas las variables numéricas o de edición y a espacios en

 blanco las alfabéticas y alfanuméricas. No funciona con campos definidoscomo FILLER, (evidente). Y puede ser muy útil para inicializar tablascompletamente cuando nos referimos al nivel mas alto de la misma.

...WORKING-STORAGE SECTION.77 TEXTO PIC X(10) VALUE "HOLA MUNDO".77 NUMERO PIC 9(8) VALUE "12345678"....PROCEDURE DIVISION.INICIO.

INITIALIZE TEXTO NUMERO....

Nota: Después de hacer INITIALIZE el valor de TEXTOserá igual a espacios y el de NUMERO igual a ceros.

Es el mismo resultado que utilizar MOVE haciendo uso delas CONSTANTES FIGURATIVAS que vimos en laIntroducción de los manuales:

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 62/86

 

 MOVE SPACES TO TEXTO.MOVE ZEROS TO NUMERO.

El resultado es el mismo en ambos casos, pero en el segundoteníamos que saber de que tipo eran las variables paramoverles SPACES o ZEROS, mientras que en el primer caso, es el compilador quien se encarga se saber el tipo de lavariable.

INSPECT, esta sentencia se utiliza para contar, reemplazar o contar yreemplazar caracteres o grupos de caracteres dentro de un campo. Se puede

contar las veces que aparece un caracter, o cambiar todos esos caracteres por otros, etc ...

Esta instrucción tiene formatos diferentes según lo que se desee hacer, así quevamos a ver cada uno de ellos por separado.

Formato 1: 

INSPECT cam po1 TALLYING variable1 FOR ( CHARACTERS)

(( BEFOR E/AFTER ) INITIAL) Cadena1 (ALL)(LEADING) Cadena2 ...

( S e puede repetir de nuevo ) 

Este formato es el utilizado para contar el número de veces que apareceIdentificador1 en el campo1 y guardará el valor en la variable1 que

 previamente hayamos definido en la WORKING.

y  CHARACTERS, indica que cuente todos los caracteres delcampo incluso los espacios en blanco.

y  ALL, indica que tiene que buscar en todos los caracteres delcampo, la cadena especificada en Cadena2.

y  LEADING, indica que tiene que buscar la cadena especificada enCadena2, pero solo hasta que encontremos uno diferente, si nadamas empezar es diferente el resultado sera directamente 0.

y  BEFORE INITIAL, busca solo hasta que aparezca la cadenaespecificada como Cadena1.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 63/86

 

y  AFTER INITIAL, empieza a buscar justo después de la cadenaespecificada en Cadena1.

Veamos unos ejemplos para salir de dudas. Primero vamos a definir unaWORKING-STORAGE.

...WORKING-STORAGE SECTION.77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL".77 CONTA PIC 9(8)....PROCEDURE DIVISION.

INICIO.INSPECT TEXTO TALLYING CONTA FOR CHARACTERS....El valor de conta será de 15 que son los caracteres que tienela variable TEXTO.

INSPECT TEXTO TALLYING CONTA FOR ALL "A"....El valor de conta será de 2 que son las veces que aparece laletra A en la variable TEXTO.

INSPECT TEXTO TALLYING CONTA FOR LEADING "A"....El valor de conta será de 0 porque no aparece ninguna A enel primer carácter de la variable TEXTO.

INSPECT TEXTO TALLYING CONTA FOR ALL "A"

BEFORE INITIAL "N"....El valor de conta será de 1 que son las veces que aparece laletra A en la variable TEXTO hasta la aparición del caracter 

 N.

INSPECT TEXTO TALLYING CONTA FOR ALL "A"

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 64/86

 

AFTER INITIAL "G"....El valor de conta será de 1 que son las veces que aparece la

 

letra A en la variable TEXTO, empezando a contar desde el

caracter G.

Instr. de Variables 

 página(s) : 3/5(5707 palabras totales en este texto)(74243 Lecturas)

Formato 2: 

INSPECT cam po1 

 

R EPLACING variable1 CHARACTERS BY Cambio1 (( BEFOR E/AFTER ) INITIAL)Cadena1 

(ALL)(LEADING)( FIRST) Cadena2...( S e puede repetir de nuevo ) 

Con este formato podemos cambiar caracteres de Campo1, su funcionamientoes igual que el anterior formato solo que en vez de contar reemplaza. Se haincluido solo FIRST, que indicaría que solo se reemplazaría la primera vezque coincidieran las condiciones. El tamaño de la sustitución debe de ser igualal tamaño sustituido, ya que la variable campo1 no puede cambiar su tamaño.

...WORKING-STORAGE SECTION.

77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL".77 CONTA PIC 9(8)....PROCEDURE DIVISION.INICIO.

INSPECT TEXTO REPLACING CHARACTERS BY"H".

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 65/86

 

...El valor de TEXTO será "HHHHHHHHHHHHHHH", esdecir cambia todos los caracteres por el caracter H.

INSPECT TEXTO REPLACING ALL "A" BY "I"....El valor de TEXTO será "PIGINI DE COBOL", es decir hacambiado todas las A por I.

INSPECT TEXTO REPLACING FIRST "A" BY "O"....El valor de TEXTO será "POGINA DE COBOL", solocambia la primera A por una O.

MOVE "PAGIPATOPETOPA" TO TEXTO.INSPECT TEXTO REPLACING ALL "PA" BY "--"

AFTER INITIAL "G" BEFORE INITIAL "T"....Complicando un poco mas, el valor de TEXTO despueés dela sentencia INSPECT será PAGI--TOPETOPA, es decir secambia todas las PA por -- pero empezando a buscar a partir de la primera letra G y justo hasta la letra T.

MOVE "PAGIPATOPETOPA" TO TEXTO.INSPECT TEXTO TALLYING CONTA FOR ALL"PA"

REPLACING ALL "TO" BY "PO" AFTER INITIAL "OP"....Aquí hemos mezclado ambos formatos y el resultado es elsiguiente. El valor de CONTA es 3 que son las veces queaparece la cadena PA en TEXTO y después se ejecuta elREPLACING y el resultado da que TEXTO valePAGIPATOPEPOPA, ya que ha cambiado todos los TO por PO pero después de la cadena OP.

Formato 3: 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 66/86

 

 INSPECT cam po1 

 

CONVER TING  Identificad or1 TO Identificad or2 (

 

( BEFOR E/AFTER ) INITIAL) Cadena1 ... ( S e puede repetir 

de nuevo ) 

Con este formato convertimos los caracteres que se especifiquen en

 

identificador1 por los que pongamos en identificador2, respetando el orden.

Veamos algunos ejemplos, se suele utilizar mucho para que al aceptar uncampo nos de igual se ha sido introducido en mayúsculas o en minúsculas yaque lo convertiriamos a alguno de los formatos.

...

WORKING-STORAGE SECTION.77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL"....PROCEDURE DIVISION.INICIO.

INSPECT TEXTO CONVERTING "AO"TO "12"....El valor de TEXTO será "P1GIN1 DE C2B2L", convertirátodas las A por 1 y todas las O por 2.

INSPECT TEXTO CONVERTING "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" TO

"abcdefghijklmnñopqrstuvwxyz"....El valor de TEXTO será "pagina de cobol" ya que haconvertido todas las letras mayúsculas por minúsculas.

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

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 67/86

 

Instr. de Variables 

 página(s) : 4/5(5707 palabras totales en este texto)

(74243 Lecturas)

STRING, se utiliza para unir o concatenar campos o partes de estos y elresultado almacenarlo en otro campo. En la unión se pueden incluir tantovariables como literales o constantes de texto.

STRING cam po1, literal1 

 

DELIMITED BY (cam po2, literal2)(SIZE)

I

 

 NTO Cam po3 (

 

WITH POINTER  Identificad or1)(

 

 ON OVER FLOW S entencia1)( NOT ON OVER FLOW S entencia2)

y  DELIMITED BY, indica hasta donde vamos a "coger" del campo paraconcatenar sin contar ese caracter o cadena que se especifique encampo2 o literal2, es decir si tenemos un campo con un valor =

 

"HOLA" y especificamos DELIMITED BY "L" a la hora de laconcatenación nos hubiera cogido solo el HO, ya que al encontrarse la

 primera L hubiera parado.y  SIZE, indica que se pasará todo el contenido del campo1 o literal1 sin

limitaciones.y  INTO, con esto indicamos en que variable se guardará el resultado,

campo3.y  WITH POINTER, si incluimos esta cláusula el valor de identificador1

será en la posición en que empezará a contener datos la variable querecibe el STRING. Ese identificador1 debe estar definido como binario.Por defecto el valor es 1.

y  ON OVERFLOW, se ejecutaría Sentencia1 si hubiera habido un error alhacer la concatenación, por ejemplo si se especifica Identificador1 conun valor superior al tamaño del Campo3.

y   NOT ON OVERFLOW, se ejecutará Sentencia2 si no existe error en laoperación.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 68/86

 

Vamos a ver unos ejemplos y además vamos a comparar como se hubierahecho utilizando la Working si no existiera el STRING.

...

WORKING-STORAGE SECTION.01 LAFECHA.02 FILLER PIC X(7) VALUE "HOY ES ".02 LDIA PIC Z9.02 FILLER PIC X(4) VALUE " DE ".02 LMES PIC X(10).02 FILLER PIC X(4) VALUE "DE ".02 LANIO PIC 9999.

01 FECHA.02 DIA PIC 99 VALUE 22.

02 MES PIC 99 VALUE 06.02 ANIO PIC 9999 VALUE 2001.

01 CONSTRING PIC X(40).01 TABLAMES.

02 FILLER PIC X(30) VALUE "ENERO FEBREROMARZO ".

02 FILLER PIC X(30) VALUE "ABRIL MAYOJUNIO ".02 FILLER PIC X(30) VALUE "JULIO AGOSTO

SEPTIEMBRE".02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ".01 LATABLA REDEFINES TABLAMES.

02 TMES PIC X(10) OCCURS 12 TIMES.01 PUNTO PIC 9(4) BINARY....PROCEDURE DIVISION.INICIO.

MOVE DIA TO LDIA.

MOVE TMES (MES) TO LMES.MOVE ANIO TO LANIO.

STRING "HOY ES " DIA " DE " TMES (MES) " DE "ANIO

DELIMITED BY SIZE INTO CONSTRING.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 69/86

 

...

El valor de LAFECHA sería: HOY ES 22 DE JUNIO DE 2001.

El valor de CONSTRING sería: HOY ES 22 DE JUNIO DE 2001.

Fijaros que el resultado es el mismo pero en cambio graciasa STRING no hemos tenido que definir ninguna linea enla WORKING ni tampoco tener que mover campos de unas variables aotras.

La cláusula DELIMITED BY se ha puesto al final porque dichacláusula se aplica a todos los campos que la preceden, si hubieramos

querido coger otra limitación para un campo en concreto habría quehaberlo especificado, por ejemplo vamos a afinar mas el ejemplo yconseguir que entre el mes JUNIO y el DE no exista mas que unespacio. En el ejemplo anterior ha unido los 10 caracteres que tiene lavariable TMES.

STRING "HOY ES " DIA " DE " DELIMITED BYSIZE

TMES (MES) DELIMITED BY " "" DE " ANIO DELIMITED BY SIZE INTO

CONSTRING.El valor que tendrá ahora CONSTRING será el siguiente:HOY ES 22 DE JUNIO DE 2001.

Como veis la diferencia está en los espacios que le sobran al mes, que al poner DELIMITED BY " " los ha evitado porque solo ha concatenadohasta que ha encontrado el primer caracter en blanco.

MOVE 4 TO PUNTO.STRING "HOY ES " DIA " DE " DELIMITED BYSIZE

TMES (MES) DELIMITED BY " "" DE " ANIO DELIMITED BY SIZE INTO

CONSTRINGWITH POINTER PUNTO.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 70/86

 

El valor que tendrá ahora CONSTRING será el siguiente:HOY ES 22 DE JUNIO DE 2001.

Es decir habrá empezado a concatenar a partir de la posición 4 del

campo CONSTRING. Si el valor de CONSTRING previamente eraespacios habría dejado 3 espacios en blanco y si hubiera sido cualquier otro hubiera respetado los 3 primeros caracteres que tuviera.

 

Instr. de Variables 

 página(s) : 5/5(5707 palabras totales en este texto)(74243 Lecturas)

UNSTRING, hace exactamente lo contrario de que hemos visto que hacíaSTRING, es decir divide el contenido de un campo en otros.

UNSTRING cam po1, literal1 

 

DELIMITED BY (cam po2, literal2)(ALL)O

 

R (cam po2, literal2)(ALL)

 

( S e puede repetir de nuevo ) INTO Cam po3 , Cam po4, .... 

(

 

 DELIMITER  Identificad or1)(

 

 COUNT  Identificad or2)

 

( S e puede repetir de nuevo ) (WITH POINTER  Identificad or 3)(

 

TALLYING  Identificad or4)

(

 

ON OVER FLOW S entencia1)( NOT ON OVER FLOW S entencia2)

y  DELIMITED BY, indica el límite hasta donde vamos cogiendo elcampo1 para partirlo. Igual que en STRING, solo que con la función a

 

la inversa.y  OR, es igual que DELIMITED y se utiliza si hay varios delimitadores

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 71/86

 

sobre los que buscar.y  INTO, indica en que campo o campos se guardará la información que

vaya fragmentando.y  DELIMITER, va a contener en cada caso el elemento separador, si

hemos incluido enDELIMITED varios, Identificador1 guardará elcarácter que de los elegidos ha sido el causante de la fragmentación.y  COUNT, cuenta el número de caracteres incluidos en la fragmentación.y  DELIMITER y COUNT, se podrán usar si se ha

especificado DELIMITED. Podemos usar tantos DELIMITER yCOUNT como campos se vayan a crear en la fragmentación.

y  TALLYING, si especificamos esta opción la instrucción nos guardaráen Identificador4 el número de campos que se han utilizado en lafragmentación.

y  POINTER, indica desde que posición va a ser examinado el campo que

desea desfragmentar, por defecto su valor es 1, es decir desde el primer caracter.

y  ON OVERFLOW, se ejecutaría Sentencia1 si hubiera habido un error alhacer la operación.

y   NOT ON OVERFLOW, se ejecutará Sentencia2 si no existe error en laoperación.

Vamos a hacer lo contrario de antes y conseguir una fecha numérica de una

frase con la fecha:...WORKING-STORAGE SECTION.01 LAFECHA PIC X(30) VALUE "HOY ES 22 DEJUNIO DE 2001".01 FECHA.

02 DIA PIC 99.02 MES PIC 99.02 ANIO PIC 9999.

01 CONSTRING PIC X(40).01 TABLAMES.

02 FILLER PIC X(30) VALUE "ENERO FEBREROMARZO ".

02 FILLER PIC X(30) VALUE "ABRIL MAYOJUNIO ".

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 72/86

 

02 FILLER PIC X(30) VALUE "JULIO AGOSTOSEPTIEMBRE".

02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ".

01 LATABLA REDEFINES TABLAMES.02 TMES PIC X(10) OCCURS 12 TIMES.01 CONTA PIC 99.01 PALABRAS PIC 99.01 LETRAS PIC 99.01 TEXTOS.

02 TEXTO1 PIC X(20).02 TEXTO2 PIC X(20).02 TEXTO3 PIC X(20).02 TEXTO4 PIC X(20).02 ELMES PIC X(10).

...PROCEDURE DIVISION.INICIO.

UNSTRING LAFECHA DELIMITED BY " "INTO TEXTO1 TEXTO2 DIA TEXTO3

ELMES COUNT LETRAS TEXTO4 ANIO.

PERFORM VARYING CONTA FROM 1 BY 1

UNTIL ELMES = TMES (CONTA) OR CONTA = 12TALLYING PALABRASEND-PERFORM

...El valor de LAFECHA era: HOY ES 22 DE JUNIO DE 2001.

Después de aplicar las instrucciones siguientes el contenido de loscampos sería el siguiente:

  TEXTO1 = HOY  TEXTO2 = ES  TEXTO3 = DE  TEXTO4 = DE  ELMES = JUNIO  DIA = 22  ANIO = 2001

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 73/86

 

  FECHA = 22062001  LETRAS = 5  PALABRAS = 7

La variable PALABRAS nos ha guardado el número de variablesutilizadas en la fragmentación, en este caso 7. La variable LETRAS haguardado el número de caracteres que ha cogido en la separación que haguardado en ELMES, que han sido 5 (JUNIO). Podiamos haber puestoun COUNT para cada una.

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 lavariable FECHA completa en númerico.

Vamos a hacer un ejemplo de como podríamos separar un nombre completo, por ejemplo para el nuevo modelo de la Seguridad Social (en España) y elsistema R.E.D.:

...WORKING-STORAGE SECTION.01 TEXTO PIC X(30) VALUE "MONTES ROBLES,ANDRES".01 APELLI1 PIC X(20).01 APELLI2 PIC X(20).01 NOMBRE PIC X(20).01 SEPARA PIC X.01 SEGURIDAD.

02 AP1 PIC XX.02 AP2 PIC XX.02 NOM PIC X.

...PROCEDURE DIVISION.

INICIO.UNSTRING TEXTO DELIMITED BY " " OR ", "INTO APELLI1 APELLI2 NOMBRE.

Aquí conseguimos separar cada apellido y el nombre encampos diferentes. (APELLI1, APELLI2, NOMBRE)

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 74/86

 

MOVE APELLI1 TO AP1 MOVE APELLI2 TO AP2MOVE NOMBRE TO NOM.

...

Aquí la variable SEGURIDAD tendría el valor: MOROA.Válido para el sistema RED.

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 ellasola. 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 mismamientras se cumplan las condiciones que le hayamos indicado. Es lainstrucción mas importante tanto por su variedad de formatos, como por elnúmero de veces que se suele usar dentro de un programa, además nos puedehacer mucho mas sencillo el realizar una programación estructurada.

Cuando decimos que un programa está estructurado, no cabe duda que esdebido al uso de ésta instrucción. Pero creo que lo importante no es tantohablar de ella, sino comenzar a explicarla.

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 laexplicación, nunca los toméis como programas completos y con una lógicaaplastante.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 75/86

 

Formato 1: Con este formato transferimos el control del programa a un párrafo, cuando éste termine vuelve el control a la instrucción que sigueal PERFORM .

PER FORM nombre_parraf o 

 

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(30).01 OP PIC X.PROCEDURE DIVISION.INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1ERASE.

PERFORM PIDENOMBRE.DISPLAY 'HOLA ' LINE 10.DISPLAY NOMBRE LINE 10 COL 6.ACCEPT OP LINE 20.STOP RUN.

PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.ACCEPT NOMBRE LINE 20 COL 30 PROMPT.DISPLAY SPACES LINE 20 SIZE 70.

...

Nota: Simplemente hemos hecho que el programa salte a un párrafo que lo ejecute y que vuelva el control a la secuencia.

Formato 2: Una extensión del anterior es indicarle que ejecute mas de un párrafo, especificando el inicio y el fin.

PER FORM nombre_parraf o THRU nombre_parraf o 

 

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(12).01 APELLIDO PIC X(12).01 OP PIC X.PROCEDURE DIVISION.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 76/86

 

INICIO.DISPLAY 'PROGRAMA DE SALUDO' LINE 1

ERASE.PERFORM PIDENOMBRE THRU PIDEAPELLIDO.

DISPLAY 'HOLA ' LINE 10.DISPLAY NOMBRE LINE 10 COL 6.DISPLAY APELLIDO LINE 10 COL 20.ACCEPT OP LINE 20.STOP RUN.

PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.ACCEPT NOMBRE LINE 20 COL 30 PROMPT.

PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.ACCEPT APELLIDO LINE 21 COL 30 PROMPT.DISPLAY SPACES LINE 20 SIZE 70.DISPLAY SPACES LINE 21 SIZE 70.

...

Nota: En este caso PIDENOMBRE y PIDEAPELLIDO vanseguidos, pero al poner el THRU lo que conseguimos es queel control no se devuelva hasta llegar al párrafo indicadodespués del THRU. Es decir que entre PIDENOMBRE y

PIDEAPELLIDO podrá haber cinco párradosmas y todos

 

ellos se hubieran ejecutado.

Instrucción Perform 

 página(s) : 2/4(8338 palabras totales en este texto)(57303 Lecturas)

Formato 3: Seguimos ampliando las capacidades, ahora conseguimos que

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 77/86

 

el PERFORM se realice tantas veces como se indique en el número o variableque va delante de TIMES.

PER FORM nombre_parraf o THRU nombre_parraf o númer o-

 

variable TIMES 

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(12).01 APELLIDO PIC X(12).01 OP PIC X.01 LI PIC 99 VALUE 10.PROCEDURE DIVISION.INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1ERASE.PERFORM PIDENOMBRE THRU PIDEAPELLIDO.PERFORM SALUDAR 3 TIMES.STOP RUN.

PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.ACCEPT NOMBRE LINE 20 COL 30 PROMPT.

PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.ACCEPT APELLIDO LINE 21 COL 30 PROMPT.DISPLAY SPACES LINE 20 SIZE 70.DISPLAY SPACES LINE 21 SIZE 70.

SALUDAR.ADD 1 TO LI.DISPLAY 'HOLA ' LINE LI.DISPLAY NOMBRE LINE LI COL 6.DISPLAY APELLIDO LINE LI COL 20.ACCEPT OP LINE 20.

...

Nota: Ahora hemos conseguido que el saludo nos lo muestre3 veces. Por supuesto THRU y TIMES pueden ir 

 perfectamente juntos. Ya os he dicho al principio que losejemplos pueden no ser muy lógicos, pero si hacen la función

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 78/86

 

de explicación.

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.

PER FORM nombre_parraf o THRU nombre_parraf oUNTIL condición 

 

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(12).01 APELLIDO PIC X(12).01 OP PIC X.01 LI PIC 99 VALUE 10.

PROCEDURE DIVISION.INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1ERASE.

PERFORM PIDENOMBRE THRU PIDEAPELLIDO.PERFORM SALUDAR UNTIL LI = 15.STOP RUN.

PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.

ACCEPT NOMBRE LINE 20 COL 30 PROMPT.PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.ACCEPT APELLIDO LINE 21 COL 30 PROMPT.DISPLAY SPACES LINE 20 SIZE 70.DISPLAY SPACES LINE 21 SIZE 70.

SALUDAR.ADD 1 TO LI.DISPLAY 'HOLA ' LINE LI.DISPLAY NOMBRE LINE LI COL 6.

DISPLAY APELLIDO LINE LI COL 20.ACCEPT OP LINE 20.

...

Nota: En este caso el compilador comprueba antes de iniciar el PERFORMque la condición no se cumple para ejecutarla,

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 79/86

 

en el momento que se cumpla salta a la siguiente instrucción.En el ejemplo ejecutará elPERFORM hasta que la variable LIalcance el valor 15.

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 seaninstrucciones que se vayan a llamar desde nuestro programa en mas de unaocasión, éstas podían haber ido en el lugar del PERFORM, es decir lasinstrucciones una detrás de otra y evitar el PERFORM.

Hasta ahora se ha explicado una manera de utilizar la sentencia PERFORM enla que el control pasa a otro lugar del programa. Como véis el STOP RUN estáantes de los párrafos que han sido llamados con los PERFORM lo cual indicaque éstos no se ejecutarán sino es precisamente por los PERFORM.Si bien con esto conseguimos una estructuración para nuestro programa lainstrucciónPERFORM nos permite un mayor grado de estructura incluyendolas sentencias de los párrafos llamados dentro de la propiasentencia PERFORM.

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, por ello, para finalizar la instrucción nos basamos en END-PERFORM. Veamos unejemplo de ello con los dos últimos formatos explicados anteriormente.

PER FORM númer o-variable TIMES

 sentencias END-PER FORM 

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 80/86

 

 PER FORM UNTIL condición 

 sentencias END-PER FORM 

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(12).01 APELLIDO PIC X(12).01 OP PIC X.01 LI PIC 99 VALUE 10.PROCEDURE DIVISION.INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1

ERASE.PERFORM PIDENOMBRE THRU PIDEAPELLIDO.PERFORM 3 TIMES

ADD 1 TO LIDISPLAY 'HOLA ' LINE LIDISPLAY NOMBRE LINE LI COL 6DISPLAY APELLIDO LINE LI COL 20ACCEPT OP LINE 20

END-PERFORM

STOP RUN.PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.ACCEPT NOMBRE LINE 20 COL 30 PROMPT.

PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE

21.ACCEPT APELLIDO LINE 21 COL 30 PROMPT.DISPLAY SPACES LINE 20 SIZE 70.DISPLAY SPACES LINE 21 SIZE 70.

...

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(12).01 APELLIDO PIC X(12).01 OP PIC X.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 81/86

 

01 LI PIC 99 VALUE 10.PROCEDURE DIVISION.INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1

ERASE.PERFORM PIDENOMBRE THRU PIDEAPELLIDO.PERFORM UNTIL LI = 15

ADD 1 TO LIDISPLAY 'HOLA ' LINE LIDISPLAY NOMBRE LINE LI COL 6DISPLAY APELLIDO LINE LI COL 20ACCEPT OP LINE 20

END-PERFORMSTOP RUN.

PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.ACCEPT NOMBRE LINE 20 COL 30 PROMPT.

PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE

21.ACCEPT APELLIDO LINE 21 COL 30 PROMPT.DISPLAY SPACES LINE 20 SIZE 70.DISPLAY SPACES LINE 21 SIZE 70.

...

Nota: Esta es una manera mas lógica de utilizar el PERFORM en estos formatos, como veís se consigue unavisión muy clara de lo que estamos haciendo y no hay saltosde secuencia innecesarios. Por supuesto el COBOL permitecualquier modalidad de uso y siempre funcionaría igual.Como veis no puede haber puntos entre el PERFORM y elEND-PERFORM puesto que eso haría terminar con error la

sentencia.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 82/86

 

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 unvalor inicial el cual podremos y aumentar o disminuir y terminar cuando secumpla una condición. No se si me he liado un poco con la explicación pero loque conseguimos es ahorrarnos varias instrucciones y resumirlas en una sola,

 para que lo comprendáis veamos su formato y un ejemplo. Como he explicadoanteriormente podemos hacer que el PERFORM invoque a uno o varios

 párrafos o bien incluir el conjunto de sentencias entre PERFORM y END-PERFORM.En el ejemplo veremos este último caso, porque creo que es mas aconsejable.

PER FORM VARYING variable FROM númer o , variable BY númer o ,

val or   UNTIL condición 

 sentencias END-PER FORM 

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(12).01 APELLIDO PIC X(12).01 OP PIC X.01 LI PIC 99.PROCEDURE DIVISION.INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1ERASE.

PERFORM PIDENOMBRE THRU PIDEAPELLIDO.PERFORM VARYING LI FROM 10 BY 1 UNTIL LI =

15DISPLAY 'HOLA ' LINE LIDISPLAY NOMBRE LINE LI COL 6DISPLAY APELLIDO LINE LI COL 20ACCEPT OP LINE 20

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 83/86

 

END-PERFORMSTOP RUN.

PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.

ACCEPT NOMBRE LINE 20 COL 30 PROMPT.PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.ACCEPT APELLIDO LINE 21 COL 30 PROMPT.DISPLAY SPACES LINE 20 SIZE 70.DISPLAY SPACES LINE 21 SIZE 70.

...

La instrucción realiza los siguientes pasos:Inicializa la variable LI con el valor que sigue al FROM, es decir 10, acontinuación va incrementado el valor de LI en 1 que es lo que va despuésdel BY y ejecuta las sentencias que van a continuación hasta que se cumple lacondición de LI = 15.Es decir las sentencias se ejecutarían para el valor 10, 11, 12, 13 y 14.

La instrucción PERFORM se puede anidar tantas veces como se quiera,teniendo en cuenta que el PERFORM contenido debe de ejecutarsecompletamente interno o completamente externo al que lo contiene.

Si necesitamos que por alguna circunstancia finalice la ejecución deun PERFORM aún cuando la secuencia no corresponde, podemos utilizar lasentencia EXIT, que precisamente lo que propicia es eso, que se interrumpa lasentencia PERFORM.

Para finalizar vamos a ver un ejemplo con varios PERFORM anidados:

...WORKING-STORAGE SECTION.01 NOMBRE PIC X(12).01 APELLIDO PIC X(12).01 SALUDO PIC X(30).01 OP PIC X.01 LI PIC 99.01 CONTA1 PIC 99.

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 84/86

 

01 CONTA2 PIC 9(6).PROCEDURE DIVISION.INICIO.

DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE

PERFORM PIDENOMBRE THRU PIDEAPELLIDOSTRING 'HOLA ' DELIMITED BY SIZE NOMBREDELIMITED BY ' '

' ' DELIMITED BY SIZE APELLIDO DELIMITED BY ' 'INTO SALUDO

PERFORM VARYING LI FROM 10 BY 1 UNTIL LI = 15PERFORM VARYING CONTA1 FROM 1 BY 1 UNTIL

CONTA1 > 30DISPLAY SALUDO(CONTA1:1) LINE LI COL

CONTA1 LOWPERFORM VARYING CONTA2 FROM 1 BY 1 UNTIL

CONTA2 > 400000MOVE ' ' TO OP

END-PERFORMEND-PERFORM

END-PERFORMDISPLAY 'FINALIZADO' LINE 22ACCEPT OPSTOP RUN.

PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20ACCEPT NOMBRE LINE 20 COL 30 PROMPT.

PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21ACCEPT APELLIDO LINE 21 COL 30 PROMPTDISPLAY SPACES LINE 20 SIZE 70DISPLAY SPACES LINE 21 SIZE 70.

...

Nota: En el ejemplo como véis, después de aceptar el nombre y elapellido construimos una frase y la guardamos en la variablenSALUDO utilizando el comando STRING. A continuación y paramantener los mismos ejemplos de toda la sección hacemos queaparezca en pantalla el SALUDO 5 veces, (dependiendo del valor deLI, que como dijimos antes sería para 10, 11, 12, 13 y 14).

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 85/86

 

 Pero ahora hemos intercalado dos PERFORM dentro de éste, el

 primero para que nos muestre el mensaje letra a letra y el segundo para hacer de retardo y así conseguir un efecto como si escribiéramos

 

el SALUDO con una máquina de escribir.

Como pódeis observar el único punto de toda la secuencia se haya enel STOP RUN. El hecho de mantener los márgenes izquierdos, es

 para dar mas claridad a la programación y conseguir que ésta sea lomas estructurada posible.

AUN HAY MAS 

Pues sí, podemos desarrollar aún mas la instrucción incluyendo dos nuevoselementos.

EJECUTANDO ANTES O DESPUES 

En primer lugar, por defecto el contenido del PERFORM se ejecuta despuésde hacer la comprobación de la condición que precede a UNTIL , pero

 podemos hacer que ésta se realice antes.

PER FORM WITH TEST  [AFTER - BEFOR E ] 

VARYING variable FROM númer o , variableBY númer o ,val or UNTIL condición 

 sentencias END-PER FORM 

Con la opción TEST BEFORE, 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 posibleque las sentencias no se ejecuten ninguna vez, si al comenzar ya está rota lacondición.

Con la opción TEST AFTER, se ejecutan las sentencias antes de comprobar lacondición, con lo cual las sentencias se van a ejecutar al menos en unaocasión, incluso aunque entremos en el PERFORM con la condición rota.

AUMENTANDO LAS CONDICIONES 

Efectivamente además de la primera condición podemos incrementar el

5/7/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559aba54ebfd7 86/86

 

número de condiciones para que se cumplan los requisitos y así ejecutar lassentencias. Esto lo conseguimos incluyendo mas cláusulas precedidas deAFTER.

PER FORM WITH TEST [AFTER - BEFOR E ]VARYING variable FROM númer o , variable BY númer o ,

val or  UNTIL condición 

AFTER variable FROM númer o , variable BY númer o ,

val or  UNTIL condición 

 sentencias AFTER ...... END-PER FORM 

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 alsiguiente UNTIL según los valores especificados en la línea quecontiene AFTER. Además podemos ir incrementando el número decondiciones a nuestro antojo, consiguiendo de éste modo hacer unosanidamientos y un desarrollo mas completo de la sentencia, obteniendo por consiguiente unos niveles de perfeccionamiento muy altos.

R ESUMIENDO 

Una mayor utilización de PERFORM sin duda traerá un uso menor de ladeclaración GO y con ello conseguimos una programación estructurada. Lasventajas de la programación estructurada las quiero explicar en un apartadodentro de ésta misma sección de Manuales, una vez explique lassentenicas GO e IF, que serán la siguiente aportación al manual.

En esa nueva sección se verá un caso mas práctico y real de utilizaciónde PERFORM con uso de lecturas de ficheros y demás experiencias cotidianasen el mundo de la programación en el ámbito de la gestión.