Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lenguaje COBOL
Lenguaje COBOL
Pag. : 1
AMYC 2000
Lenguaje COBOL
INTRODUCCIÓN
Pag. : 2
AMYC 2000
Lenguaje COBOL
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...
Pag. : 3
AMYC 2000
Lenguaje COBOL
IDENTIFICATION DIVISION.
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.
IDENTIFICATION DIVISION.
PROGRAM-ID. MANCLI.
AUTHOR. JAVI.
INSTALLATION. WWW.
Pag. : 4
AMYC 2000
Lenguaje COBOL
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.
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.
CONFIGURATION SECTION:
Donde describimos los tipos de ordenadores en que se escribió y se
Pag. : 6
AMYC 2000
Lenguaje COBOL
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECION:
Es la siguiente sección dentro de la Environment, donde se
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
Pag. : 8
AMYC 2000
Lenguaje COBOL
Pag. : 9
AMYC 2000
Lenguaje COBOL
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.
Pag. : 10
AMYC 2000
Lenguaje COBOL
DATA DIVISION.
DATA DIVISION. Es la tercera división por orden de aparición, y es
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
Pag. : 12
AMYC 2000
Lenguaje COBOL
Pag. : 13
AMYC 2000
Lenguaje COBOL
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
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
Pag. : 16
AMYC 2000
Lenguaje COBOL
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.
Pag. : 18
AMYC 2000
Lenguaje COBOL
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.
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
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.
Pag. : 23
AMYC 2000
Lenguaje COBOL
Pag. : 24
AMYC 2000
Lenguaje COBOL
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.
Pag. : 25
AMYC 2000
Lenguaje COBOL
INSTRUCCIONES DE CALCULO.
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:
Pag. : 28
AMYC 2000
Lenguaje COBOL
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
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
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
COMPUTE,
Con ésta orden podemos realizar todos los cálculos aritméticos posibles
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
Pag. : 33
AMYC 2000
Lenguaje COBOL
INSTRUCCIONES DE ARCHIVOS
. Sin duda son las instrucciones mas importantes con las que cuenta el
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
Pag. : 35
AMYC 2000
Lenguaje COBOL
...
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:
...
PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
OPEN I-O CLIENTES
OPEN EXTEND IMPRE.
...
...
...
CERRAR.
CLOSE ARTICULOS CLIENTES IMPRE.
...
Pag. : 37
AMYC 2000
Lenguaje COBOL
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
...
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
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.
...
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
...
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.
...
...
PROCEDURE DIVISION.
INICIO.
OPEN I-O ARTICULOS.
LECTURA.
MOVE 100 TO CLAVE-ARTICULO.
Pag. : 45
AMYC 2000
Lenguaje 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
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
Pag. : 50