Está en la página 1de 50

AMYC 2000

Lenguaje COBOL

Lenguaje COBOL

Pag. : 1
AMYC 2000
Lenguaje COBOL

INTRODUCCIÓN

 El programa cobol se escribe secuencialmente en lineas de 80 caracteres


o menos con la siguiente división:
- La parte (1) comprende las columnas de la 1 a la 6 ambas
inclusive y se pueden utilizar para numerar las líneas o poner
comentarios.
- La parte (2) comprende la columna 7 y en ella podemos
encontrar, un guión (-) que nos indica que esta linea es
continuación de la anterior pero que por su tamaño ocupa mas de
una linea, un asterisco (*) que nos indica que el texto que viene a
continuación es un comentario y por lo tanto que el compilador
lo ignore.
- La parte (3) se le llama Area A comprende las columnas 8 a 11
ambas inclusive y aquí es donde se escriben los nombre de las
divisiones, de las secciones, de los párrafos, los indicadores de
FD (File Description) y los niveles de variables 01 y 77.
- La parte (4) llamada Area B comprende desde la columna 12 a la 72
y en ellas se incluirán todas las instrucciones del programa, las
lineas de las secciones y los niveles de variables mayores a 01.
- La parte (5) de la columna 73 a la 80 no se utiliza y por lo tanto
es ignorada por el compilador.

 El punto es un signo de vital importancia en cobol ya que nos indica el


final de una linea, en el han de terminar todas las secciones, divisiones y
párrafos. Si al final de una linea el compilador no encuentra el punto,
interpretará que la instrucción continúa hasta que aparezca el punto de
fin de linea.

Pag. : 2
AMYC 2000
Lenguaje COBOL

 Al igual que en otros lenguajes, el cobol dispone de palabras reservadas


que no debemos de utilizar como nombres de variables o de párrafos,
además éstos no deben de exceder de 30 caracteres.

 Las variables y constantes que se pueden utilizar son numéricas,


alfabéticas o alfanuméricas. Las numéricas al contrario de la mayoría de
los lenguajes actuales o las bases de datos no miden su tamaño por
bytes sino por dígitos, es decir, que una variable de 6 dígitos podrá
contener números desde 0 hasta 999999 si es de valor absoluto o
incluyendo los negativos si lleva signo. Para las alfanuméricas en
cambio no hay cambio alguna y su tamaño viene indicado por el
número de caracteres que ocupa.

 Existen además en cobol unas variables que vienen con un valor propio
y que se pueden utilizar libremente, como ZERO, SPACE, LOW-
VALUES, HIGH-VALUES, etc...

 Convenio de presentación del manual: tipo de letra, LETRA para las


palabras reservadas cobol, subrayado para las obligatorias, en cursiva
los comentarios y en normal el resto.

Pag. : 3
AMYC 2000
Lenguaje COBOL

IDENTIFICATION DIVISION.

 IDENTIFICATION DIVISION. Esta es la primera linea de todo


programa Cobol e identifica a la primera división donde se especifica el
nombre del programa, el del autor y demás datos, su sintaxis sería la
siguiente:

IDENTIFICATION DIVISION.
PROGRAM-ID. Nombre del programa.
AUTHOR. Nombre del autor.
INSTALLATION. Lugar donde está instalado.
DATE-WRITTEN. Fecha de creación.
DATE-COMPILED. Fecha de compilación.
REMARKS. Comentarios.

 Vemos que el único párrafo obligatorio además del nombre de división


es el que hace referencia al nombre del programa, los demás nombre de
autor, lugar de instalación, fechas de creación y compilación y
comentarios son opcionales, eso si, si se incluyen se deben de poner
cumpliendo las normas.

 Podemos incluir además todos los comentarios o explicaciones que


creamos oportunas incluyendo en la columna 7 un asterisco (*) que nos
indica que el compilador hará caso omiso de lo que venga a
continuación, por ejemplo.
* /////// Este programa es para hacer algo ///////
* // atención a la sección de la fecha ////
Ejemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. MANCLI.
AUTHOR. JAVI.
INSTALLATION. WWW.

Pag. : 4
AMYC 2000
Lenguaje COBOL

REMARKS. Programa para mantenimiento de fichero de


clientes.

 Nota final:
Poco mas podemos decir de ésta division, obviamente las demás no son
tan pequeñas, sin embargo posee dos de las lineas mas importantes de
cualquier programa cobol.

Pag. : 5
AMYC 2000
Lenguaje COBOL

ENVIRONMENT DIVISION.

 Es la segunda division por orden de aparición, y en ella se especifican,


el ordenador donde se escribió y se ejecutará el programa, así como la
relación entre los ficheros a utilizar con sus correspondencias externas,
es decir con los dispositivos a los que hará referencia el programa
objeto cuando vaya a establecer comunicación con dicho fichero.

 Diremos antes de continuar que en los primeros cobol había muchas


partes que eran obligatorias en cada programa, pero hoy en día, por
ejemplo, ésta división ya no es obligatoria, así como ninguna de sus
partes. Su sintaxis sería la siguiente:

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. Ordenador donde se escribió el
fuente.
OBJECT-COMPUTER. Ordenador donde se ejecuta el
objeto.
SPECIAL-NAMES. Cambiar valores para constantes del
lenguaje, pueden variar en cada compilador.

 Como se aprecia en su sintaxis, ésta segunda división se divide a su vez


en dos secciones, que se describen a continuación:

CONFIGURATION SECTION:
 Donde describimos los tipos de ordenadores en que se escribió y se

ejecutará el programa, o bien el nombre del compilador y asignación de


valores a ciertas constantes utilizadas por el compilador, estos valores
se introducen en sus respectivas lineas como se ve arriba.

Pag. : 6
AMYC 2000
Lenguaje COBOL

 Para la linea de SPECIAL-NAMES el uso mas habitual es el de cambiar


el punto decimal usado en notación anglosajona por la coma y así poder
especificar los puntos para los miles, su formato sería el siguiente

SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.

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


CURRENCY SIGN IS literal , suele ser un solo carácter y no puede
coincidir con ninguno de los que usamos para definir las variables, es
decir ni A, ni Z, ni 9, ni -, ni +, ni X, etc...
O hacer que todas las letras introducidas sean mayúsculas o
minúsculas o que no haya diferencias entre ambas con la clausula
ALPHABET.

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, su modo


de acceso así 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.

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT Nombre-de-archivo ASSIGN TO Nombre-de-enlace
ORGANIZATION IS Tipo de organizacion
ACCESS MODE IS Mode de acceso al
fichero
RECORD KEY IS Clave del registro

Pag. : 7
AMYC 2000
Lenguaje COBOL

ALTERNATE RECORD KEY IS Claves alternativas


registro
WITH DUPLICATES
FILE STATUS IS Variable de estado del
fichero.

 Cláusula SELECT es aquí donde especificamos el nombre lógico que va


a tener el fichero dentro del programa, suele ser una palabra que
identifique lo mas claro posible el contenido del fichero, por ejemplo
ARTICULOS, PROVEEDORES, CLIENTES.

 Cláusula ASSIGN aquí especificamos el nombre de enlace, que


dependiendo del entorno en que trabajemos es directamente el nombre
del fichero con su path en entorno PC, o la Ddname del JCL que ejecuta
el programa en entorno MVS.
 Cláusula ORGANIZATION aquí indicamos la organización de los
registros de nuestro fichero, podrá ser SEQUENTIAL, RELATIVE o
INDEXED, si nuestro archivo fuera secuencial se podrían omitir ésta
cláusula así como las restantes.
 De ésta organización se deriva el formato del fichero, SEQUENTIAL si
los registros se graban secuencialmente conforme se dan entrada sin
importar si están o no repetidos, un ejemplo claro son los archivos de
impresora, todos los listados son secuenciales.
 RELATIVE, si cada registro es identificado por un valor entero con su
posición relativa. INDEXED identifica a ficheros que sus registros son
accesibles mediante una clave única e irrepetible o por varias que
pueden estar duplicadas, cualquier fichero de mantenimiento, por
ejemplo de ARTICULOS, podría ser INDEXED, y cada código será
único para cada artículo y con el nos iremos a su posición y podremos
ver todos los demás datos que hagan referencia al registro. Existe

Pag. : 8
AMYC 2000
Lenguaje COBOL

también para los archivos de texto, la posibilidad de asignarlos


directamente especificando LINE SEQUENTIAL en ésta cláusula.

 Cláusula ACCESS MODE indica el modo de acceso al fichero, puede


ser SEQUENTIAL, RANDOM o DYNAMIC, si no se especifica
ninguno o si el fichero es SEQUENTIAL entiende que el modo será
SEQUENTIAL. RANDOM indica que accederemos a el aleatoriamente
por su clave y DYNAMIC con la que podremos acceder al fichero en el
modo que queramos dentro del programa.
 Cláusula RECORD KEY se utiliza sólo si el fichero es indexado y en el
decimos cual es el nombre de la clave por la cual accederemos a los
registros. Esta deberá ser alfanúmerica y tendrá que estar especificada
en la FD del fichero. Si el archivo fuera RELATIVE, esta clausula se
sustituiría por RELATIVE KEY e indicará el número de registro del
fichero, deberá estar declarado en la Working-Storage Section como
una variable numérica sin signo.
 Cláusula ALTERNATE RECORD KEY solo para ficheros indexados e
identifican una o mas claves alternadas para nuestros registros, por
ejemplo en un fichero de clientes cuya clave principal 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én estar declarado en la FD. Si aparece
WITH DUPLICATES, indica que ésta clave alternativa pudiera estar
duplicada, por ejemplo si hubiéramos escogido como clave alternada
además del NIF, el Nombre del cliente, podría darse el caso de que dos
clientes tuvieran el mismo nombre.
 Cláusula FILE STATUS aquí damos un nombre de una variable que
especificaremos en la Working como un campo alfanumérico de dos
caracteres donde el programa depositará el código de error que ocurra
en el fichero, dependiendo del valor nosotros podremos operar o hacer
alguna acción en concreto.

Pag. : 9
AMYC 2000
Lenguaje COBOL

 El párrafo I-O CONTROL se utiliza para indicarle al programa cuantos


archivos van a utilizar el mismo área de memoria para trabajar.

Ejemplo:
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. RMCOBOL.
OBJECT-COMPUTER. RMCOBOL.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CLIENTES ASSIGN TO RANDOM
"C:\DATOS\CLIENTES.DAT"
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS KEY-CLIENTE
FILE STATUS IS FS-CLI.

 Hemos declarado el archivo CLIENTES como indexado con una clave


principal KEY-CLIENTE y hemos asignado una variable para guardar
los posibles códigos de error para cuando operemos con éste fichero FS-
CLI. Al indicarle el acceso dinámico le decimos que una vez dentro del
programa podremos acceder al fichero secuencialmente o bien
directamente al registro que queramos por la clave.

Pag. : 10
AMYC 2000
Lenguaje COBOL

DATA DIVISION.
 DATA DIVISION. Es la tercera división por orden de aparición, y es

donde se declaran absolutamente todos los nombres de campos,


registros, variables, es decir donde nombramos cada dato que vayamos
a utilizar en nuestro programa. Para almacenar todos estos nombres de
datos, ésta DIVISION se divide en varias secciones, cada una de ellas
orientada a un tipo de datos diferente.
 FILE SECTION. Aquí describiremos todos los campos que componen
los registros de todos los archivos que vayamos a utilizar, que
previamente habremos declarado en la INPUT-OUTPUT SECTION
dentro de la ENVIRONMENT DIVISION.
 WORKING-STORAGE SECTION. En ella declararemos todas las
variables no referentes a archivos, pero que durante la ejecución del
programa vayamos a utilizar.
 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.
 SCREEN 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 incluirla en la WORKING-STORAGE SECTION y
esto nos obligará también a definir la DATA DIVISION. Pasemos a
continuación a explicar mas a fondo cada una de ellas.
FILE SECTION.
 En esta sección describiremos los campos que van a componer el

registro de cada uno de los archivos con los que vamos a trabajar, ésta
sería su sintaxis:
 FD Nombre del fichero.
BLOCK CONTAINS Numero de registros por bloque RECORDS
Pag. : 11
AMYC 2000
Lenguaje COBOL

BRECORD CONTAINS Numero de caracteres por registro


CHARACTERS
LABEL RECORD Etiqueta de registro
DATA RECORD Nombre del registro.
 Vamos a explicar un poco mas detalladamente cada cláusula de la FILE
SECTION.
 Cláusula FD nombre del fichero que previamente habíamos descrito en
la cláusula SELECT de la INPUT-OUTPUT SECTION en la
ENVIRONMENT DIVISION.
 Cláusula BLOCK CONTAINS cuando queremos que por cada bloque
en disco se graben mas de un registro, aquí 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 RECORD CONTAINS el número de caracteres que tiene el
registro sumando todos sus campos, puede ser fija o variable. Si es fija
utilizamos un valor y si es variable un rango desde hasta, si no se
especifica será el propio compilador quien la determine.
 Cláusula LABEL RECORD puede tener dos valores STANDARD u
OMITTED, el primer caso indica que cada vez que se accede a un
registro el compilador hará las comprobaciones estandares descritas por
el propio compilador y en el segundo éstas 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 indica OMITTED.
 Cláusula DATA RECORD debido a que un mismo fichero puede tener
varias descripciones de registro, aquí 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.

Pag. : 12
AMYC 2000
Lenguaje COBOL

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


comprenden el registro, pero antes de ver esto es aconsejable tener claro
como se define una variable con todas sus opciones ya que a fin de
cuentas, los campos de un registro no son mas que eso, variables, con la
única 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).
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COMMUNICATION SECTION
SCREEN SECTION
 Para la WORKING y la LINKAGE las normas son las mismas, así que
las veremos conjuntamente. Las otras dos secciones,
COMMUNICATION y SCREEN no las veremos en el manual.
 Cada campo declarado debe de llevar un número de nivel que le
informe al compilador del tipo de campo que es:
 El nivel 01, identifica la primera entrada de un registro o la primera
entrada de un campo que se va a subdividir.
 El nivel 77, identifica a una variable que no se va a subdividir y que no
forma parte de 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án letras y números o guiones. Es posible que algún campo
que definamos nunca vaya a ser usado por el programa pero si en

Pag. : 13
AMYC 2000
Lenguaje COBOL

cambio es necesario que exista para que nos reserve el espacio, le


llamaremos FILLER.
 PICTURE / PIC esta palabra es la que utilizamos para identificar el tipo
de datos que va a contener la variable. Los posible valores son:
DE CAMPOS.
9 - Para campos numéricos.
A - Para campos alfabéticos.
X - Para campos alfanuméricos.
S - Indica variable con signo.
V - Indica punto decimal.

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 especificado en 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 más pero los mas utilizados son los que se han comentado.
 Para indicar la longitud del campo se puede repetir el símbolo tantas
veces como 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.

Pag. : 14
AMYC 2000
Lenguaje COBOL

 A continuación vamos a ver un ejemplo de todo lo que hemos explicado


para que se vaya quedando claro.

WORKING-STORAGE SECTION.
01 DOMICILIO.
02 TIPO PIC XX.
02 NOMBRE PIC X(20).
02 NUMERO PIC 9(4).

 Fijaros que hemos definido 4 variables, la primera no tiene PIC, por que
indica que está subdividida en las 3 restantes. La segunda "TIPO" nos
dice que es una variable alfanúmerica y que puede contener 2 caracteres
como máximo, la utilizaríamos para guardar el tipo de calle, avenida,
paseo, plaza, etc.. Para la tercera "NOMBRE" va a ser también
alfanumérica pero con una longitud máxima de 20 caracteres y nos
servirá para guardar el nombre de la calle, plaza, avenida, etc y la última
"NUMERO" indica una variable numérica de 4 dígitos, que quiere decir
que puede contener valores entre 0 y 9999.
 Observad que en Cobol no se guardan las variables numéricas por bytes
como ocurre con todos los lenguajes actuales sino por número de
dígitos, con ello quizás desaprovechamos mas la memoria pero en
cambio tenemos un control mejor del dato que puede contener nuestra
variable.
 Si TIPO fuera "AV", NOMBRE "DE LOS DESAMPARADOS " y
NUMERO "15", si nos refiriéramos a la variable DOMICILIO ésta
tendría el siguiente valor:"AVDE LOS DESAMPARADOS 0015".
 Vamos a ver algunos ejemplos mas de variables posibles:

Pag. : 15
AMYC 2000
Lenguaje COBOL

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 se representaría: 12.815,37-.
 VALUE esta palabra a continuación del PIC indica el valor inicial que
contendrá la variable hasta que éste sea modificado. Por ejemplo
podemos definir una variable:
WORKING-STORAGE SECTION.
01 RAYA PIC X(10) VALUE "----------".
01 MINOMBRE PIC X(30) VALUE "EUGENIO".
 Así tendremos una variable llamada RAYA que contiene 10 guiones y
otra llamada MINOMBRE que contiene eso, mi nombre, si os fijáis con
ésta cláusula convertimos cualquier variable en una constante. En
cualquier momento del programa podremos cambiar ese valor. Para las
variables numéricas es conveniente ponerlas siempre con VALUE 0
para que al empezar cada programa estemos seguros de que no nos
arrastra ningún valor. Normalmente al ejecutar un programa se ponen
todas las variables a 0, pero si ese programa ha sido llamado desde otro
no pasará eso, por eso no viene mal inicializarlas todas a 0.
 REDEFINES esta cláusula se utiliza para dar mas de un nombre y
formato a un 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

Pag. : 16
AMYC 2000
Lenguaje COBOL

estar en el mismo nivel y uno a continuación del otro en el orden de


declaraciones.

01 DIAS PIC X(21) VALUE


"LUNMARMIEJUEVIESABDOM".
01 TADIA REDEFINES DIAS.
02 DIA PIC XXX OCCURS 7
TIMES.

 Se ha incluido la cláusula OCCURS para que sea vea un ejemplo


práctico, aunque todavía no se ha explicado, pero como veis a partir de
éste momento DIAS y TADIA tendrán siempre el mismo valor pero con
diferente nombre y formato de datos.

 OCCURS esta cláusula es la que se utiliza para declarar tablas. Una


tabla es un conjunto de elementos con un mismo tipo y longitud que se
denominan con el mismo nombre y se diferencian por un subíndice. No
se puede especificar en niveles 01, 77 88. Puede tener varios formatos:

01 NUMERO-DIAS PIC 99.


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

 En la primera "DIA" indico que esa tabla va a tener 7 elementos que


llamaremos DIA (nn) y entre paréntesis el orden dentro de la tabla. Si
hubiéramos guardado en ésta tabla las 3 primeras letras de cada día de

Pag. : 17
AMYC 2000
Lenguaje COBOL

la semana, para obtener el valor del lunes pediríamos DIA (1), para el
del Jueves DIA (4) y para el del domingo DIA (7).
 En la segunda "MES" le indicamos que los elementos de la tabla pueden
variar dependiendo del valor de la variable "NUMERO-DIAS" que ha
de estar definida antes de la tabla y siempre dentro de los márgenes de
28 y 31.
 En la tercera le indicamos además que la variable IN-OTRA va a ser la
encargada de dirigirnos por los elementos de la tabla, ésta variable no
puede estar definida antes.
 JUST la justificación de los valores de los campos suele ser a la izda.
para los alfanuméricos y a la derecha para los numéricos, si en cambio
queremos cambiar este orden tendremos que incluir ésta cláusula.

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 el


contenido de las variables (numéricas, ya que las alfanuméricas siempre
ocuparán un byte por cada carácter). Con todos los campos se puede
operar (obviamente) pero solo los que se definan como DISPLAY serán
editables directamente. Tiene varias posibilidades:
 DISPLAY, es la forma por defecto e indica que cada dígito
ocupará un byte, es la que se toma por defecto y la que mas
memoria ocupa.

Pag. : 18
AMYC 2000
Lenguaje COBOL

 BINARY, COMP-1, COMP-3, COMP-6, son diferentes formas de


compactación de los datos. COMP-6 guarda dos dígitos en cada
byte, COMP-3 es igual pero admite signo el cual iría en los cuatro
últimos bits del último byte.

WORKING-STORAGE SECTION.
01 IMPORTE PIC 9(8). Ocupa 8 bytes uno por cada dígito.
01 FECHA PIC 9(8) COMP-6. Ocupa 4 bytes, uno cada 2 dígitos.
01 PRECIO PIC S9(8)V99 COMP-3. Ocupa 6 bytes.

El punto decimal tampoco ocupa espacio, ya que solo indica su


posición.

Pag. : 19
AMYC 2000
Lenguaje COBOL

LINKAGE SECTION.
 En ésta sección se declaran las variables de igual forma solo que las que
aquí declaremos nos van a servir de enlace para pasar información a
otro programa que será llamado por el principal.
DATA DIVISION.
FILE SECTION.
FD CLIENTES BLOCK CONTAINS 4 RECORDS
RECORD CONTAINS 128 CHARACTERS
LABEL RECORD STANDARD.
01 REG-CLIENTE.
02 KEY-CLIENTE.
03 CLICOD PIC 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.
Pag. : 20
AMYC 2000
Lenguaje COBOL

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

 Como veis se ha diseñado el fichero CLIENTES para que cada bloque


de 512 Kb, ocupe 4 registros, dejando 17 caracteres (FILLER).
 En la descripción del archivo IMPRESORA se declara una variable a
nivel 01 que hace referencia al total del registro para luego ir moviendo
a éste campo el valor de lo que queramos imprimir.
 En la WORKING se han declarado algunos campos con distintos
formatos, fijaros en la tabla que gracias al REDEFINES hemos llenado
con las tres primeras iniciales de cada día, así al referirnos a la variable
ELDIA (2) su contenido será "MAR".
 Nota final:
 La DATA DIVISION nos sirve para tener todas nuestras variables bien
definidas, ya sean independientes o que formen parte de algún fichero
para poder operar con ellas en la PROCEDURE DIVISION. Me
acuerdo de cuando empezamos a estudiar que para otros lenguajes no
era necesaria la declaración de variables previamente y en cambio ahora
en la mayoría de los lenguajes se exige que se declaren, eso significa
que el Cobol no iba mal encaminado.
 Tenemos que tener siempre muy claro que con cualquier campo
podemos hacer lo que queramos, por ejemplo si en un registro de 120
caracteres nosotros en un programa solo vamos a utilizar los 40
primeros podemos definir todo lo restante como un campo FILLER y
listo o viceversa si un campo de un registro lo tenemos definido como
alfanumérico de 30 en un programa necesitamos los 10 primeros
caracteres por un lado y los veinte restantes por otro, puese nada se
subdivide para ese programa y no pasa nada.
 Tenemos que tener en cuenta que como en todos los lenguajes, ya sean
de programación o de habla (español, inglés, francés) son muchas las

Pag. : 21
AMYC 2000
Lenguaje COBOL

opciones que nos ofrecen pero al final siempre utilizamos las que mas
nos gustan o las que consideramos mas útiles.
 Una cosa que considero importante es dar a las variables un nombre un
poco lógico que nos recuerde su contenido, por ejemplo si queremos
guardar la fecha, pues llamarla FECHA, si queremos guardar el N.I.F.
del gerente, NIFGEREN, etc. ...

Pag. : 22
AMYC 2000
Lenguaje COBOL

PROCEDURE DIVISION.

 Bien, hemos llegado a la última división que existe un los programas


Cobol, en ella encontramos todos los procesos necesarios para que el
programa funcione, que haga para la que fue concebido.
 Todo esto se realiza con instrucciones (ordenes, verbos, comandos,
etc..), como explicaremos a continuación. Cada uno de ellos con un
formato y una solución que resolver.
 Como son muchos los verbos de que se compone el lenguaje, vamos a
ver éstos divididos por grupos:
 A continuación vamos a explicar su formato y algunas consideraciones
generales aparte de las propias instrucciones:

PROCEDURE DIVISION (USING Variable Variable ...).


DECLARATIVES.
Nombre-seccion SECTION.
USE AFTER ERROR PROCEDURE ON tipo.
Nombre-parrafo.
Sentencias.
.....
END DECLARATIVES.
Nombre-seccion SECTION.
Nombre-parrafo.
Sentencias.
.....
 Este sería a grosso modo el formato general de una Procedure, pero
incluso se puede omitir si en un programa no vamos a realizar ningún
proceso (es obvio que siempre lo realizaremos, pero se podría omitir).
Vamos a explicar un poco su formato:
PROCEDURE DIVISION (USING Variable Variable ...).

Pag. : 23
AMYC 2000
Lenguaje COBOL

 Cuando especificamos USING en la línea de PROCEDURE


DIVISION, después deberemos de dar los nombres de variables que
hayamos definido en la LINKAGE SECTION, para compartir en el
programa, lo que nos indicará que éste ha sido llamado por otro
programa y que esas variables traerán un valor procedente del programa
llamador, que a su vez utilizó la instrucción CALL con las mismas
variables.
 DECLARATIVES, es una sección dentro de la PROCEDURE que
nos va a servir para controlar los posibles errores en cuanto al manejo
de ficheros se refiere. La línea de DECLARATIVES, (si se va a
utilizar) deberá de ir siempre a continuación de la línea de
PROCEDURE DIVISION. Después de subdiviría en tantas secciones
como opciones de error tengamos, éstas pueden ser definidas por
archivo o bien forma de apertura, es decir podremos controlar los
errores que nos lleguen de un fichero en concreto o de todos aquellos
que hayan sido abiertos de igual forma, esto se especifica en la línea
USER AFTER ERROR PROCEDURE ON tipo, pudiendo ser tipo, el
nombre del archivo o su modo de apertura (INPUT, OUTPUT, I-O,
EXTEND). A continuación irían los párrafos con sus respectivas
instrucciones a realizar en caso de error
 Se pondrían tantos párrafos y secciones como quisiéramos controlar,
siempre teniendo en cuenta que ésta se acaba cuando se indique END
DECLARATIVES.
 Si no quisiéramos utilizar ésta sección, podríamos de igual manera
controlar los errores en nuestro programa preguntando siempre por la
variable de error de cada fichero que se definió como FILE STATUS
en la FILE-CONTROL.
 Nombre-seccion SECTION, a partir de aquí incluiremos todas las
instrucciones necesarias para la correcta ejecución del programa.
 Ya sabemos que Cobol es un lenguaje estructurado, pues bien no
pensemos que la Procedure va a ser un caos de instrucciones escritas

Pag. : 24
AMYC 2000
Lenguaje COBOL

secuencialmente, no, en ella podremos definir tantas Secciones


(SECTION) y Párrafos como queramos para organizar mejor las
instrucciones y para delimitar acciones concretas, eso si siempre se
ejecutarán secuencialmente, excepto cuando encuentre algún verbo de
bifurcación como PERFORM que haciendo referencia a esos nombres
de párrafo harán que se rompa la secuencia lógica 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
Variable [ (NOT) = ] Variable
MAYOR O IGUAL QUE
[ GREATER OR EQUAL ]
[ >= ]
MENOR O IGUAL QUE
[ LESS OR EQUAL ]
[ <= ]
 Si se especifica (NOT) se da a entender lo contrario de la comparación,
con lo que no mayor que puede ser igual que menor o igual que.

 Tambien podemos utilizar para las condiciones complejas los operandos


lógicos, AND, OR y NOT según se requieran, todas las condiciones
que incluyan AND han de ser correctas para que pase la condición, si se
utiliza 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.

Pag. : 25
AMYC 2000
Lenguaje COBOL

INSTRUCCIONES DE CALCULO.

 Debido a que el lenguaje Cobol fue concebido para la gestión de


grandes cantidades de datos y a resolver problemas de tipo comercial y
de administración, no se incluyeron dentro de sus especificaciones
verbos que nos pudieran ayudar a resolver cálculos complejos como
integrales, trigonometría, raíces cuadradas, etc..., sino simplemente las
orientadas a los cálculos básicos, suma, resta, multiplicación y división
que son las que vamos a ver a continuación:

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


los siguientes formatos:

1.- ADD variable ó literal variable ó literal ... TO variable


(ROUNDED) (ON SIZE ERROR) instrucción

2.- ADD variable ó literal variable ó literal ... GIVING variable


(ROUNDED) (ON SIZE ERROR) instrucción

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


ERROR) instrucción

 Para ver las explicaciones de cada uno de los formatos partiremos de la


misma WORKING, y a continuación pondremos un ejemplo y su
explicación.

Pag. : 26
AMYC 2000
Lenguaje COBOL

...
WORKING-STORAGE SECTION.
01 VALORES.
02 UNO PIC 99 VALUE 10.
02 DOS PIC 9(6) VALUE 280.
02 TRES PIC 9(4) VALUE 540.
01 OTROS
02 OTRO1 PIC 9.
02 DOS PIC 9(6) VALUE 110.
01 RESULTADO PIC S9(8) VALUE 10.
01 RESTO PIC 99.
PROCEDURE DIVISION.
INICIO.

Formato 1:
 ADD UNO TRES 5 TO RESULTADO.
 Se sumarán todas las variables o literales numéricos (cifras) al valor de
la variable que se de a continuación del TO, guardándose el resultado
también en ésta última.
 Por tanto al realizar ésta operación el valor de la variable
RESULTADO, será de: 10 (de la variable UNO) + 540 (de la variable
TRES) + 5 + 10 (de Resultado) = 565.
 Como veis UNO + TRES + 5 suman 555 pero esto se suma al valor que
ya tenía la variable RESULTADO, con lo que la suma total es de 565.
 Este Formato se usa mucho para hacer de contador y hacer que una
variable aumente en uno su valor poniendo:
 ADD 1 TO RESULTADO.

Pag. : 27
AMYC 2000
Lenguaje COBOL

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

SUBTRACT,
 ésta es la instrucción que utilizaremos para realizar restas y tiene los

siguientes formatos:

1.- SUBTRACT variable ó literal variable ó literal ... FROM variable


(ROUNDED) (ON SIZE ERROR) instrucción

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


ó literal GIVING variable (ROUNDED) (ON SIZE ERROR)
instrucción

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


SIZE ERROR) instrucción

Pag. : 28
AMYC 2000
Lenguaje COBOL

 Para ver las explicaciones de cada uno de los formatos partiremos de la


misma WORKING que hemos utilizado con la instrucción ADD,
poniendo a continuación un ejemplo y su explicación.

Formato 1:
 SUBTRACT UNO TRES 5 FROM RESULTADO.
 Se restarán todas las variables o literales numéricos (cifras) del valor de
la variable que se de a continuación del FROM, guardándose el
resultado también en ésta última.
 Por tanto al realizar ésta operación el valor de la variable
RESULTADO, será de: -10 (de la variable UNO) - 540 (de la variable
TRES) - 5 + 10 (de Resultado) = -545.
 Como veis se le han restado los valores de UNO, TRES y 5 que suman
-555 pero como RESULTADO valía +10, éste se suma y da un valor de
-545.
 Este Formato lo podemos utilizar para hacer contadores en retroceso,
poniendo:
 SUBTRACT 1 FROM RESULTADO.

Formato 2:
 SUBTRACT UNO 5 FROM TRES GIVING RESULTADO.
 Aquí lo que conseguiremos será restar el valor de la variable UNO y 5
del valor de la variable TRES y el resultado guardarlo en la variable
RESULTADO, sin tener en cuenta su valor inicial, es decir, será de:
540 (de la variable TRES) - 10 (de la variable UNO) - 5 = 525.

Pag. : 29
AMYC 2000
Lenguaje COBOL

Formato 3:
 SUBTRACT CORR VALORES FROM OTROS.
 Al igual que con la instrucción ADD, con éste Formato conseguimos
que las variables del campo compuesto VALORES se resten al valor de
las variables con el mismo nombre del campo compuesto OTROS,
obteniendo como resultado: 280 (de la variable DOS del campo
VALORES) - 110 (de la variable DOS del campo OTROS) = 170.
 Si hubiera coincidido alguna variable mas con el mismo nombre en
ambos campos también se hubiese restado.
MULTIPLY,
 ésta es la instrucción que utilizaremos para realizar multiplicaciones y

tiene los siguientes formatos:

1.- MULTIPLY variable ó literal BY variable (ROUNDED) (ON


SIZE ERROR) instrucción

2.- MULTIPLY variable ó literal BY variable ó literal GIVING


variable (ROUNDED) (ON SIZE ERROR) instrucción

Utilizando la misma WORKING que hemos utilizado con las


instrucciones ADD y SUBTRACT, veremos a continuación unos
ejemplos y su explicación.

Formato 1:
 MULTIPLY 5 FROM RESULTADO.
 Multiplica el número 5 por el valor de la variable RESULTADO,
guardando en ésta misma el resultado de la operación que será: 5 x 10
(de la variable RESULTADO) = 50.

Pag. : 30
AMYC 2000
Lenguaje COBOL

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

DIVIDE,
 Esta es la instrucción que utilizaremos para realizar divisiones y tiene

los siguientes formatos:

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


ERROR) instrucción

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


variable (ROUNDED) (REMAINDER) variable (ON SIZE ERROR)
instrucción

 Utilizando la misma WORKING que hemos utilizado con las


instrucciones ADD y SUBTRACT, veremos a continuación unos
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 la variable TRES) / 10 = 54.

Formato 2:
DIVIDE 7 INTO TRES GIVING RESULTADO REMAINDER
RESTO.

Pag. : 31
AMYC 2000
Lenguaje COBOL

 Aquí dividiremos el valor del la variable TRES entre 7 guardando el


resultado en la variable RESULTADO, sin tener en cuenta su valor
inicial, y además el resto de la operación lo guardará en la variable
RESTO, quedando así: 540 / 7 = 77, pero como 7 x 77 son 539 el resto
es 1 que será el valor de RESTO.
 Si en vez de utilizar INTO utilizamos BY cambia el orden de los
operandos, es decir en vez de dividir TRES entre 7 dividiríamos 7 entre
TRES.
 La opción REMAINDER no es obligatoria, todo dependerá del uso que
queramos hacer de la instrucción.

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 aritmética (ON


SIZE ERROR) instrucción

Utilizando la misma WORKING que hemos utilizado anteriormente


vamos a ver un ejemplo:

Formato 1:
 COMPUTE RESULTADO = DOS OF VALORES * 16 / 100.
 El valor de la variable RESULTADO será de 44, obtenido después de
multiplicar 280 (de la variable DOS del grupo VALORES) x 16 y lo
que de dividido entre 100.

Pag. : 32
AMYC 2000
Lenguaje COBOL

 En realidad si hacemos el cálculo en una calculadora nos daremos


cuenta que el resultado exacto es 44,80 pero como la variable
RESULTADO no la hemos definido con decimales éstos son
depreciados por el compilador.
 Puesto que la variable DOS pertenece a dos grupos de variables
deberemos especificar a que grupo pertenece (OF VALORES).
 Debemos de tener en cuenta que siempre tienen preferencia los
operadores que vayan entre paréntesis, a continuación los de
multiplicación y división (*) y (/) y por último los de suma y resta (+) y
(-) y el orden en que va a ir realizando las operaciones será de izquierda
a derecha, 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 hayáis notado la diferencia y la podáis aplicar a vuestros
casos en concreto.
 Para todas éstas instrucciones de cálculo que hemos visto la opción
ROUNDED significa lo mismo y quiere decir que fuerza al redondeo
del resultado para cada operación y siempre teniendo en cuenta la
definición de la variable que va a guardar ese resultado, por ejemplo si
tras una operación resulta 18,76 éste podría quedar como sigue:

77 RESULTADO PIC 99V99. (valor = 18,76)


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

Pag. : 33
AMYC 2000
Lenguaje COBOL

 Igual ocurre con la frase ON SIZE ERROR instrucción, que propiciará


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

INSTRUCCIONES DE ARCHIVOS
 . Sin duda son las instrucciones mas importantes con las que cuenta el

lenguaje Cobol, con ellas tendremos la oportunidad de manipular toda


la información contenida en nuestros archivos, es decir, podremos abrir
archivos, cerrarlos, leerlos, guardar información nueva o modificar
datos existentes.
 Todo esto lo haremos con las instrucciones que voy a explicar a
continuación:

open, close, read, write, rewrite, delete, start.

 Antes de empezar a explicar éstas instrucciones me gustaría que


entendiéseis bien algunos conceptos como fichero, registro y campo,
para que podais comprender mas claramente, la explicación de todas las
instrucciones que se verán en ésta sección.
 ¿Que es un fichero? Podríamos definir un fichero como un conjunto de
registros, pero estaríamos mas o menos igual. Si comparásemos un
fichero de cobol con nuestra vieja agenda de teléfonos, para cada amigo
tendrí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
de todos esos campos para cada amigo sería un registro. Ahora podemos
comprender mejor que un fichero o archivo es un conjunto de registros,
como una agenda es un conjunto de datos de amigos.

Pag. : 34
AMYC 2000
Lenguaje COBOL

 ¿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ía
ser la lengüeta con la letra del abecedario correspondiente a los
apellidos del amigo. Informáticamente es mas completa y con ella
podremos identificar a cada uno de ellos, por ejemplo con su nombre o
su teléfono o un código que le asignemos nosotros personalmente.

OPEN,
 ésta es la instrucción que utilizaremos para abrir un archivo, o lo que es

lo mismo hacerlo disponible para operar sobre el, obviamente éste


archivo debe de haberse descrito en la Environment y la Data según se
explicó, su formato es el siguiente:

OPEN (EXCLUSIVE) modo nombre de archivo (WITH LOCK)


(WITH NO REWIND)
 Donde modo, indica como se abrirá el archivo y puede tener los
siguientes valores según su utilización:

 INPUT, el archivo se abrirá solo para lectura, es decir no podremos


grabar ni modificar datos del mismo.
 I-O, el archivo se abrirá como lectura y escritura, con lo cual tendremos
acceso a toda la información de dicho archivo para leerla, escirbirla,
reescribirla o borrarla.

 OUTPUT, el archivo se abre solo para escritura, es el formato que se


utiliza en los archivos de impresión y secuenciales. Tiene la
particularidad que crea el fichero nuevo cada vez que se utiliza, por lo
tanto hay que tener cuidado con archivos Indexados.

Pag. : 35
AMYC 2000
Lenguaje COBOL

 EXTEND, igual que el anterior pero no crea el archivo, sino que la


información se va añadiendo a la ya existente. Se utiliza para archivos
secuenciales.
 Las opciones EXCLUSIVE y WITH LOCK, nos indica cuando
trabajamos en multipuesto que éste archivo estará bloqueado, es decir
que no estará disponible para otros usuarios. El hecho de que existan
dos opciones para lo mismo es por compatibilidad con versiones
anteriores.
 La opción WITH NO REWIND, se utiliza cuando utilizamos archivos
de cinta, para que no la rebobine al abrirla.

...

PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
OPEN I-O CLIENTES
OPEN EXTEND IMPRE.
CREAR-ARCHIVO.
OPEN OUTPUT TRABAJO CLOSE TRABAJO.
...

 Nota: Con éstas tres instrucciones estamos abriendo tres archivos, cada
uno de una forma diferente. También podríamos haberlos puesto en una
sola linea de la siguiente forma:

OPEN INPUT ARTICULOS I-O CLIENTES EXTEND IMPRE.

 En el caso del archivo TRABAJO, se consigue crearlo como nuevo,


exista antes o no.
Pag. : 36
AMYC 2000
Lenguaje COBOL

 CLOSE, ésta es la instrucción contraria a OPEN, es decir termina la


conexión establecida con el archivo, a partir del momento que aparezca
ésta instrucción el 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 REWIND)
 El nombre de archivo corresponderá a algún archivo abierto
anteriormente.
 Las opciones WITH LOCK y WITH NO REWIND, tienen la misma
explicación que la vista en la orden OPEN.

...
PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
OPEN I-O CLIENTES
OPEN EXTEND IMPRE.
...
...
...
CERRAR.
CLOSE ARTICULOS CLIENTES IMPRE.
...

 Nota: Apuntaré que si finalizamos el programa con la sentencia STOP


RUN, que luego veremos, los archivos que estuvieran abiertos se
cierran automáticamente aunque no se haya especificado la orden
CLOSE. Aunque siempre es preferible utilizarla, ya que puede haber
algunos compiladores mas antiguos que no los cierren.

Pag. : 37
AMYC 2000
Lenguaje COBOL

 Me gustaría destacar de éstas dos instrucciones vistas que lo mas


normal es no utilizar ninguna de las opciones, es decir solo abrir de una
manera el archivo para su uso y una vez hayamos acabado con él,
cerrarlo.
 READ, es la instrucción que utilizamos para leer registros de un
archivo, debe de estar abierto. Con ella conseguimos que los datos
referentes al registro accedido queden en la descripción de dicho
fichero, es decir, conseguimos que los campos declarados en la FD,
tengan el valor correspondiente al registro leido.
 La sentencia READ, se utiliza para leer ficheros secuenciales o
indexados, o para leer indexados de manera secuencial, por lo que su
sintaxis tiene dos formatos principales.
 Formato para leer ficheros de manera secuencial. (Indexados o
secuenciales)
 READ nombre de archivo (NEXT/PREVIOUS RECORD) (INTO
descripción) (AT END / NO AT END sentencia)
 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 la que se toma por defecto, ya que, cuando estamos
leyendo un archivo de forma secuencial, éste leerá registros uno tras
otro, hasta llegar al final.
 La 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 que tener en cuenta que Cobol nos permite mantener
mas de una descripción de registro para un mismo archivo. Si

Pag. : 38
AMYC 2000
Lenguaje COBOL

tuviéramos mas 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á un error.

PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
LECTURA.
READ ARTICULOS NEXT RECORD AT END PERFORM
CERRAR.
PERFORM LECTURA.
CERRAR.
CLOSE ARTICULOS.
 Nota: Si bien este formato nos sirve para leer cualquier tipo de archivo
de manera secuencial, en el caso de que el archivo fuera secuencial, éste
solo se podría leer así.
 Existen muchas ocasiones en que un archivo indexado nos interesa
leerlo de manera secuencial. Si lo hiciéramos éste sería su formato,
además en éste caso podríamos leerlo tanto del 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.
 Formato para leer ficheros indexados con acceso aleatorio.
 READ nombre de archivo (INTO descripción) (KEY nombre de clave)
(INVALID KEY / NOT INVALID KEY sentencia)

Pag. : 39
AMYC 2000
Lenguaje COBOL

 Las opciones que se repiten con el formato anterior tienen el mismo


formato y producen el mismo resultado.
 La opción KEY, indica por que clave se va a leer el fichero, siempre
que éste tenga mas de una.
 La sentencia después de INVALID KEY se utiliza para ejecutar una
acción cuando se intenta acceder a un registro que no existe. En el caso
de utilizar NOT 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 PERFORM ERROR.
...
PERFORM LECTURA.
ERROR.
...
...
CERRAR.
CLOSE ARTICULOS.

 Nota: Sin duda la forma mas usual de acceder a un registro será por su
clave. Así por ejemplo para acceder a un fichero de poblaciones cuya
clave fuera su código postal, dando cualquier código accederíamos a ese
registro en concreto.
 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 ..

Pag. : 40
AMYC 2000
Lenguaje COBOL

 WRITE, con ésta instrucción se consigue grabar la información


contenida en ese momento en los campos del registro de un fichero. Es
decir, si introducimos una ficha nueva en la agenda con los datos de un
nuevo amigo, ésta 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 para leerla. Y por supuesto el fichero debe de
estar abierto como OUTPUT o I-O.
 WRITE nombre de registro (FROM descripción) (INVALID KEY /
NOT INVALID KEY sentencia)
 La opción FROM, indica con cual de las descripciones de registro que
hayamos 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 nos ahorra en realidad es mover los datos de esa descripción que
hemos usado como "temporal" a la auténtica descripción del registro.
 Las cláusulas de INVALID KEY y NOT INVALID KEY, tienen la
misma función dada en la instrucción READ. Solo que aquí, 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 PERFORM
ERROR.
...
...
PERFORM CERRAR.
ERROR.
...

Pag. : 41
AMYC 2000
Lenguaje COBOL

...
CERRAR.
CLOSE ARTICULOS.
...

 Nota: Aunque se puedan utilizar varias descripciones, lo mas ló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, falta de 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, para imprimir.
 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 la impresión. Quiero hacer un ejemplo mas extenso para
éste caso, que será muy utilizado y distinto en su filosofía al resto.
 WRITE nombre de registro (FROM descripción) (AFTER número de
lineas)(PAGE)
 Además para éste formato tendremos la cláusula AFTER, en la cual
indicamos el número de lineas que debe de avanzar la impresora antes
de escribir, o bien que 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.

Pag. : 42
AMYC 2000
Lenguaje COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. LISTADO.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IMPRESORA ASSIGN TO PRINT "LPT1".
DATA DIVISION.
FILE SECTION.
FD IMPRESORA LABEL RECORD OMITTED.
01 REG-IMPRE PIC X(80).
WORKING-STORAGE SECTION.
01 LINEA1.
02 FILLER PIC X(30) VALUE SPACES.
02 FILLER PIC X(20) VALUE "ESTA ES LA
LINEA 1".
01 LINEA2.
02 FILLER PIC X(30) VALUE SPACES.
02 FILLER PIC X(20) VALUE "ESTA ES LA
LINEA 2".
...
...
PROCEDURE DIVISION.
INICIO.
OPEN OUTPUT IMPRESORA
ESCRIBIR.
WRITE REG-IMPRE FROM LINEA1 AFTER PAGE.
WRITE REG-IMPRE FROM LINEA2 AFTER 2.
...
...
CERRAR.
CLOSE IMPRESORA.
...

Pag. : 43
AMYC 2000
Lenguaje COBOL

 Nota: Como podéis ver, hemos definido el registro como REG-


IMPRE, pero al escribir sobre el fichero impresora utilizamos las
descripciones de LINEA1 y LINEA2, de ésta manera conseguimos que
se impriman las dos lineas en una impresora conectado al puerto LPT1
y que antes de escribir la primera linea, salte a una página en blanco.
 REWRITE, ésta instrucción se utiliza para regrabar datos de un
registro ya existente. Toda la sintaxis es exactamente igual que la
explicada en WRITE.
 REWRITE nombre de registro (FROM descripción) (INVALID KEY
/ NOT INVALID KEY sentencia)
 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 PERFORM
ERROR.
MOVE "OTRO NOMBRE" TO NOMBRE.
REWRITE REGISTRO-ARTICULO INVALID KEY
PERFORM ERROR.
...
...
PERFORM CERRAR.
ERROR.
...
...

Pag. : 44
AMYC 2000
Lenguaje COBOL

CERRAR.
CLOSE ARTICULOS.
...

 Nota: Podemos decir que ésta sentencia es la que utilizaremos para


modificar el contenido de cualquier registro, pero eso si, nunca
podremos alterar la clave, solo los campos que no formen parte de la
clave principal.
 Si quisiéramos modificar cualquiera de los campos clave de un registro,
deberíamos crear uno nuevo con el mismo contenido 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 es corta, pero tiene pocos mas matices, lo que conseguimos
es borrar todos los datos de un registro. Su sintaxis es la siguiente:
 DELETE nombre de fichero (INVALID KEY / NOT INVALID KEY
sentencia)
 Las únicas cláusulas INVALID y NOT INVALID KEY, se usan
exactamente igual 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
instrucciones anteriores.

...
PROCEDURE DIVISION.
INICIO.
OPEN I-O ARTICULOS.
LECTURA.
MOVE 100 TO CLAVE-ARTICULO.

Pag. : 45
AMYC 2000
Lenguaje COBOL

READ ARTICULOS INVALID KEY PERFORM ERROR.


DELETE ARTICULOS INVALID KEY PERFORM ERROR.
...
...
PERFORM CERRAR.
ERROR.
...
...
CERRAR.
CLOSE ARTICULOS.
...
...

 Nota: Obviamente para borrar un registro, primero hemos de tenerlo en


memoria, por eso en el ejemplo lo he leído primero.
 START, ésta instrucción es de suma importancia en el tratamiento de
ficheros, y nos sirve para posicionarnos en cualquier parte del mismo,
para una 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 sitio correcto, en cambio con ésta orden, podremos colocarnos
en la posición del fichero que queramos dentro de unas normas, que
veremos a continuación.
 START nombre de fichero KEY (expresión) nombre de clave
(INVALID KEY / NOT INVALID KEY sentencia)
 Las únicas cláusulas INVALID y NOT INVALID KEY, se usan
exactamente igual 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
instrucciones anteriores.
Pag. : 46
AMYC 2000
Lenguaje COBOL

 La expresión a la que se hace referencia en la sintaxis, pueden ser las


siguientes:

LESS (<) menor que.


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

...
PROCEDURE DIVISION.
INICIO.
OPEN I-O ARTICULOS.
COLOCAR.
MOVE 100 TO CLAVE-ARTICULO.
START ARTICULOS KEY NOT LESS KEY CLAVE-
ARTICULOS
INVALID KEY PERFORM ERROR.
LECTURA.
READ ARTICULOS NEXT RECORD AT END PERFORM
CERRAR.
...
PERFORM LECTURA.
ERROR.
...
...
PERFORM CERRAR.
ERROR.
...
...

Pag. : 47
AMYC 2000
Lenguaje COBOL

CERRAR.
CLOSE ARTICULOS.
 Nota: Aquí empezaríamos a leer el fichero artículos desde la clave 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
estaríamos haciendo el START. Recordar que con ésta instrucción
SOLO nos situamos en un sitio determinado del fichero, a partir de ahí
podremos operar como queramos.

Pag. : 48
AMYC 2000
Lenguaje COBOL

 ESTADOS DE FICHEROS (FILE STATUS)


 Son muchos los códigos que se pueden producir en tiempo de ejecución
cuando trabajamos con archivos, a continuación mostraremos una lista
de los mas comunes. Todos éstos errores los podemos obtener si
definimos FILE STATUS en la FILE-CONTROL, y actuar
consecuentemente, es recomendable cada vez que se abren los ficheros
comprobar que el error sea 00, es decir que todo está bien para
continuar.
 Los errores se representan como 2 dígitos para el error y una
explicación del mismo.

CÓDI EXPLICACION
GO
00 Operación satisfactoria, todo bien.
10 Cuando se ha llegado al final del fichero
22 Se intenta copiar un registro con una clave ya existente.
23 Cuando se hace un acceso directo a un registro inexistente.
24 No hay espacio en disco para realizar la operación.
30 Es un error grave de entrada/salida, suele ser ajeno a Cobol y
mas en concreto a configuración del sistema operativo sobre el
que se está ejecutando, para solucionarlo deberemos prestar
atención a los dos dígitos siguientes al error.
35 El archivo al que hace referencia no existe.
39 La organización del fichero que se quiere abrir no coincide con
su organización real interna. Suele pasar cuando se modifica una
FD y el fichero continua siendo el mismo.
41 Cuando intentamos abrir un archivo que ya está abierto.
42 Si intentamos cerrar un archivo que no esta abierto.
43 Cuando se quiere borrar o reescribir un registro en un fichero
abierto con acceso secuencial.
47 Se quiere realizar alguna operación que no corresponde con el

Pag. : 49
AMYC 2000
Lenguaje COBOL

modo de acceder al fichero. Si queremos hacer un READ o un


START en un archivo que no ha sido abierto como INPUT o
como I-O.
48 Igual que el anterior, pero para el caso de querer escribir en un
fichero que no esta abierto o no está abierto como I-O,
OUTPUT o EXTEND.
49 Cuando queremos borrar o reescribir en un fichero que no ha
sido abierto como I-O o el fichero no está abierto.
90 Cuando COBOL recibe un mensaje irreconocible, suele estar
ocasionado por incompatibilidad entre los accesos a los ficheros,
su forma de apertura y su modo de acceso.
91 Igual que el 42.
92 Cuando intentamos leer, escribir, borrar, reescribir sobre un
archivo no abierto.
93 El archivo está en conflicto con otro usuario.
94 Igual que el 39, tiene varias vertientes dependiendo de los dos
dígitos siguientes que acompañan al error.
98 Grave error interno en la estructura del fichero, generalmente se
suelen provocar cuando hay un corte eléctrico o una salida
brusca del programa y algún fichero indexado se ha quedado
abierto, lo que suele ocurrir es problema de correspondencia
entre claves y datos.
99 Al borrar, leer o reescribir un registro que está siendo bloqueado
por otro usuario.

Pag. : 50

También podría gustarte