Anda di halaman 1dari 32

Programación II

Introducción al cobol.

Universidad de Valladolid
Departamento de Informática

Versión 1.5.FÉLiX
//
i Índice General

Índice General
1 Un poco de historia 1

2 Utilización de nuestro laboratorio 1

3 Primeros elementos sintácticos 3


3.1 El primer programa . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Declarando variables . . . . . . . . . . . . . . . . . . . . . . . 5
3.3 Datos editados . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.4 Entrada y salida . . . . . . . . . . . . . . . . . . . . . . . . . 7

4 Sentencias 7

5 Estructuras de control 12

6 Otros tipos de datos 12


6.1 Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.2 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

7 Programas distribuidos en varios ficheros 14

8 Procesamiento de ficheros 16
8.1 Ficheros secuenciales . . . . . . . . . . . . . . . . . . . . . . . 16
8.2 Apertura y cierre de ficheros . . . . . . . . . . . . . . . . . . . 19
8.3 Comandos para el proceso de ficheros . . . . . . . . . . . . . . 19

9 Ficheros indexados 23
9.1 Declaración de ficheros indexados . . . . . . . . . . . . . . . . 23

10 Comandos para el proceso de ficheros indexados 23


iii Índice General

Índice de listados
1 El tı́pico hola mundo en cobol. . . . . . . . . . . . . . . . . . 4
2 Definición de variables no editadas. . . . . . . . . . . . . . . . 6
3 Completando el programa anterior . . . . . . . . . . . . . . . 8
4 Un ejemplo de entrada y salida. . . . . . . . . . . . . . . . . . 10
5 Ejemplo de uso de algunas estructuras de control. . . . . . . . 13
6 Lectura de datos sobre un registro. . . . . . . . . . . . . . . . 15
7 Definición de vectores. . . . . . . . . . . . . . . . . . . . . . . 16
8 Programa que llama a otro. . . . . . . . . . . . . . . . . . . . 17
9 Programa llamado por otro. . . . . . . . . . . . . . . . . . . . 17
10 Lectura de un fichero . . . . . . . . . . . . . . . . . . . . . . . 20
11 Escritura de un fichero . . . . . . . . . . . . . . . . . . . . . . 21
12 Modificación de un fichero . . . . . . . . . . . . . . . . . . . . 22
13 Ejemplo de creación de un fichero indexado. . . . . . . . . . . 25
14 Ejemplo de búsqueda sobre un fichero indexado. . . . . . . . . 26

Índice de figuras
1 Esquema de los sistemas utilizados para las prácticas . . . . . 2
2 Plantilla de programación en cobol . . . . . . . . . . . . . . 3
3 Sı́mbolos utilizados en la plantilla de definición de variables . . 5
4 Nombres simbólicos utilizables para dar valor a las variables. . 6
5 Más sı́mbolos utilizados en las plantillas. . . . . . . . . . . . . 7
6 Diferentes salidas para variables editadas y no editadas . . . . 9
7 Opciones para entrada y salida. . . . . . . . . . . . . . . . . . 9
8 Algunas sentencias básicas en cobol . . . . . . . . . . . . . . 11
9 Estructuras de control. . . . . . . . . . . . . . . . . . . . . . . 14
1 Un poco de historia 1

Este documento es una introducción al cobol pensada para ayudar a los alum-
nos de Ingeniería Técnica en Informática de Gestión matriculados en Programa-
ción a iniciar el estudio de éste lenguaje. Su uso, por lo tanto, no excluye la
utilización de manuales completos como el referenciado en la página de la asigna-
tura.

1 Un poco de historia
cobol nace en 1951, alentado por el Pentágono de los ee.uu. para
facilitar la administración de aplicaciones programadas hasta entonces en
lenguajes distintos sobre hardware diverso. Sus siglas, Common Bussiness
Oriented Language, nos dan una idea clara de los objetivos básicos de sus
diseñadores, y de hecho desde entonces el cobol se ha transformado en un
estandar de hecho en la industria.
Aunque en ocasiones resulte difı́cil de creer, el parque de aplicaciones
cobol instalado en estos momentos es muy elevado; para convencerse de
ello basta con consultar las ofertas de empleo de los suplementos económicos
de algunos diarios.
Algunos de los inconvenientes del cobol vienen precisamente de su longe-
vidad. Aunque el estándar ansi va cambiando con el tiempo e incorporando
capacidades nuevas, no hay que perder de vista que los compiladores deberán
ser compatibles con los diversos estándares del mercado, por ejemplo:

cobol 61 Primera versión estable.

cobol 69 Primera versión estandar.

cobol 74 Añadido PERFORM.

cobol 85 Añadidos los bloques estructurados.

cobol 97 Añadidas capacidades OO y de manejo de ventanas.

2 Utilización de nuestro laboratorio


Para las prácticas de la asignatura se utilizan duero y las estaciones de
trabajo sun localizadas en el laboratorio 1l104.
La configuración utilizada es la recogida en la figura 1 de la que cabe
resaltar que, gracias a la utilización de nis+ y nfs, no son necesarias cuentas
adicionales ni entrar siempre en la misma estación de trabajo para conservar
los ficheros fabricados.

Universidad de Valladolid Dpto. de Informática


2 Introducción al cobol.

Sun Enterprise 450 (4 procesadores Ultra Spark 250Mh)

nfs: Sistemas de ficheros


nis+: Sistema de en red (/home /usr/local)
autorización de
acceso

1L104. 24 Sun Ultra 1

    

Figura 1: Esquema de los sistemas utilizados para las prácticas

El compilador utilizado es Object cobol for unix de MicroFocus Versión


4.1. Una sesión tı́pica de edición compilación y ejecución puede ser algo como
lo siguiente:

vi Hola.cbl # edición. Fabricamos Hola.cbl


cob Hola.cbl # compilación. Fabricamos Hola.int y Hola.lst
cobrun Hola # ejecución
rm *.int *.lst # Sólo es preciso guardar el código fuente.

El compilador puede también fabricar ficheros directamente ejecutables,


sin embargo no es recomendable abusar de ellos por su tamaño. También por
las limitaciones de espacio en disco, y puesto que no es necesario almacenar en
el sistema más que el código fuente de los programas, es interesante utilizar
órdenes como la siguiente al final de cada sesión de trabajo para eliminar
ficheros innecesarios.

find $HOME -name "*.int" -print -exec rm \{\} \;

En la página de consejos para el uso del laboratorio presentamos un ejem-


plo de alias que simplifica este proceso.
También es posible utilizar editores de texto distintos a la versión estandar
como pueden ser vim, versión mejorada de vi que permite el coloreado de la
sintáxis de cobol, la utilización de ventanas gráficas con el parámetro -g,
o la informacion sobre número de lı́nea y columna del cursor con la opción
set ru, o dtpad (editor al estilo del notepad de windows).

Universidad de Valladolid Dpto. de Informática


3 Primeros elementos sintácticos 3

Figura 2: Plantilla de programación en cobol

3 Primeros elementos sintácticos


Los programas cobol están estructurados según el siguiente esquema:

• El programa se compone de divisiones.

• cada división se compone de secciones.

• cada sección se compone de párrafos

• cada párrafo se compone de sentencias.

Una de las caracterı́sticas más sorprendentes del cobol es el significado


distinto de los caracteres en función de su situación en la lı́nea, herencia
directa de un tiempo en que los ordenadores leı́an los programas de tarjetas
perforadas, y los programadores utilizaban hojas de codificación como la
recogida en la Figura 2. El significado posicional es el siguiente:

• Primeros 6 caracteres.- Identificación de página y lı́nea.

Universidad de Valladolid Dpto. de Informática


4 Introducción al cobol.

• Carácter 7.- Indicador de lı́nea de comentario o continuación de la an-


terior (* o -).

• Caracteres de 8 a 11.- Comienzo de división, sección, identificación de


módulo, identificación de nivel y número de nivel (77 y 01).

• Caracteres 12 a 72.- Código de la lı́nea.

3.1 El primer programa


El programa cobol se fracciona en cuatro divisiones:

IDENTIFICATION DIVISION. Identificación del programa, autor,. . .

ENVIRONMENT DIVISION. Identificación de conceptos que dependen de


un ordenador en concreto.

DATA DIVISION. Definición de los datos del programa.

PROCEDURE DIVISION. Parte ejecutable del programa.

Aunque no todas estas secciones son obligatorias, lo normal es que cual-


quier programa tipo contenga las cuatro.
El tı́pico“hola mundo”en cobol tendrá el aspecto recogido en el listado 1.

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ E l t í p i c o " Hola mundo " ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . Hola−mundo .
AUTHOR . P r o f e s o r e s de Programación I I .

DATA DIVISION .

PROCEDURE DIVISION .
principal .
DISPLAY QUOTES " Hola mundo ! " QUOTES
STOP RUN .

Listado 1: El tı́pico hola mundo en cobol.

Universidad de Valladolid Dpto. de Informática


3.2 Declarando variables 5

9 Dı́gito decimal.
V Punto decimal.
P Dı́gito siempre cero.
S Signo del número, si existe.
X Cualquier carácter.
A Carácter alfabético.

Figura 3: Sı́mbolos utilizados en la plantilla de definición de variables

Ahora el programa se compila con el comando cobol y, si no contiene


errores, se puede ejecutar con cobrun. La compilación genera un listado con
los posibles errores (extensión lst) y un “preejecutable” con extensión int.

3.2 Declarando variables


En cobol hay que declarar las variables que van a ser utilizadas. Para
ello disponemos de la WORKING-STORAGE SECTION dentro de la DATA
DIVISION.
Una declaración de variable simple tiene la forma:
77 <id.> PIC <plant> [VALUE <v.ini>] [ <op>]
En cobol no disponemos de tipos de datos en un sentido moderno, a
cambio se declara la “plantilla” que seguirán los datos. Ası́ en lugar de un
tipo entero deberemos formar una plantilla con varias cifras decimales.
Para definir las plantillas podemos utilizar los sı́mbolos recogidos en la
figura 3.
Además los caracteres repetidos pueden abreviarse añadiendo tras el ca-
racter un número de repeticiones entre paréntesis. Algunos ejemplos de de-
claraciones pueden verse en el fragmento de programa 2.
Para dar valores a las variables disponemos de algunos nombres simbólicos
como los recogidos en la figura 4.

3.3 Datos editados


En cobol además de las variables normales disponemos de variables edi-
tadas. La diferencia está en que, en el caso de las variables editadas, utiliza-
mos en su plantilla algunos caracteres especiales que serán interpretados de
forma especial en entrada y salida de datos.
La técnica habitual es la definición de un par de variables para cada dato
que entra o sale del sistema. Una de las variables no es editada y se utiliza

Universidad de Valladolid Dpto. de Informática


6 Introducción al cobol.

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Ejemplos de a s i g n a c i o n e s con move y p l a n t i l l a s ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . mascaras .
AUTHOR . P r o f e s o r e s de Programación I I .

DATA DIVISION .
WORKING−STORAGE SECTION .
∗ V a r i a b l e s no e d i t a d a s .
7 7 a1 PIC 9 9 9 9 VALUE IS 2 5 .
7 7 b1 PIC S99V99 VALUE IS 3 . 1 4 .
7 7 c1 PIC 9 ( 6 ) VALUE IS 1 0 0 1 97 .
7 7 d1 PIC 9 ( 9 ) V99 VALUE IS 1 2 3 4 5 6 7 . 8 9 .
7 7 e1 PIC AA9 ( 4 )AA VALUE IS " VA0001A " .
7 7 f 1 PIC 9 9PPP VALUE IS 9 0 0 0 .
7 7 g1 PIC VPPP99 VALUE IS 0 . 0 0 0 1 1 .

Listado 2: Definición de variables no editadas.

ZERO Valor cero.


ZEROES Rellenar con ceros.
SPACE Espacio en blanco.
SPACES Rellenar con blancos.
QUOTE Comillas.
QUOTES Comillas.

Figura 4: Nombres simbólicos utilizables para dar valor a las variables.

Universidad de Valladolid Dpto. de Informática


3.4 Entrada y salida 7

B Inserta un blanco en la salida.


0 Inserta un cero en la salida.
/ Inserta una barra en la salida.
. Inserta un punto en la salida alineando las cifras.
, Inserta una coma en la salida alineando las cifras.
Z Si el dı́gito es un cero a la izquierda, un blanco.
- Como Z, pero además el signo menos si es necesario.
+ Como -, pero siempre escribe el signo.

Figura 5: Más sı́mbolos utilizados en las plantillas.

en las operaciones internas, la otra es editada y sólo se usa para entradas y


salidas.
La tabla de la figura 3 se completa con la figura 5 mientras que el frag-
mento de programa 2 continúa en 3.

3.4 Entrada y salida


Los comandos utilizados para la entrada y salida son respectivamente
ACCEPT y DISPLAY.
Para ambos comandos existen múltiples opciones, muchas de las cuales
son especı́ficas de cada versión del compilador. Algunas opciones muy habi-
tuales están recogidas en la figura 7, donde algunas de las funciones especiales
pueden ser DATE para la fecha DAY para el número de dı́as desde el 1 de ene-
ro de 1990 o TIME la hora en formato hh mm ss cc. Además, las opciones
marcadas deben ir precedidas de WITH.
En el listado 4 presentamos un ejemplo de la utilización de éstas sen-
tencias con varias opciones, sin embargo para comprenderlo completamente
necesitamos explicar el funcionamiento de algunas sentencias cobol y la
forma en que se definen registros en este lenguaje.

4 Sentencias
El resumen de las sentencias utilizadas en cobol aparece en la figura 8.
Sobre ellas deberemos hacer algunos comentarios:

• En cobol no tenemos restricciones de tipo como en Pascal o C, de


modo que toda asignación tiene sentido, sin embargo en algunas de
ellas perderemos información. En general la norma es que las variables

Universidad de Valladolid Dpto. de Informática


8 Introducción al cobol.

77 a2 PIC Z , ZZ9 .
77 b2 PIC −−−.−−.
77 c2 PIC ZZ / ZZ / ZZ .
77 d2 PIC ZZZ , ZZZ , ZZZ . Z .
77 e2 PIC AAB9 ( 4 )BAA .
77 f2 PIC ZZZZ9 .
77 g2 PIC Z . ZZZZZ .


PROCEDURE DIVISION .
principal .
∗ A s i g n a c i ó n e n t r e v a r i a b l e s e d i t a d a s y no e d i t a d a s
MOVE a1 to a2
MOVE b1 to b2
MOVE c1 to c2
MOVE d1 to d2
MOVE e1 to e2
MOVE f 1 to f 2
MOVE g1 to g2
∗ Mostramos todas l a s v a r i a b l e s .
DISPLAY a1
DISPLAY a2
DISPLAY b1
DISPLAY b2
DISPLAY c1
DISPLAY c2
DISPLAY d1
DISPLAY d2
DISPLAY e1
DISPLAY e2
DISPLAY f 1
DISPLAY f 2
DISPLAY g1

Listado 3: Completando el programa anterior

Universidad de Valladolid Dpto. de Informática


4 Sentencias 9

0025
25
0314+
3.14
100197
10/01/97
00123456789
1,234,567.8
VA0001A
VA 0001 A
09
9000
11
.00011

Figura 6: Diferentes salidas para variables editadas y no editadas

AT LINE num[POSITION num] localización de la salida.


WITH SIZE IS num Tamaño máximo de la salida.
WITH ERASE EOL | EOS Borra hasta final de lı́nea o pantalla.
WITH HIGHLIGHT | LOWLIGHT Negrita o normal.
WITH REVERSE-VIDEO Video inverso.
WITH PROMPT [CHARACTER IS CAR] Rellena el campo con caracter
FROM función o dispositivo Entrada de dispositivo o de
funciones del sistema.
Figura 7: Opciones para entrada y salida.

Universidad de Valladolid Dpto. de Informática


10 Introducción al cobol.

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Un ejemplo de e n t r a d a y s a l i d a ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . alumno .
AUTHOR . P r o f e s o r e s de Programación I I .

DATA DIVISION .
WORKING−STORAGE SECTION .
7 7 a p e l l i d o 1 PIC X ( 3 0 ) .
7 7 a p e l l i d o 2 PIC X ( 3 0 ) .
7 7 nombre PIC X ( 3 0 ) .

PROCEDURE DIVISION .
principal .
PERFORM cabecera
PERFORM leer−alumno
DISPLAY " L e c t u r a f i n a l i z a d a " LINE 1 0 POSITION 1 0
STOP RUN .
cabecera .
DISPLAY " U n i v e r s i d a d de V a l l a d o l i d " LINE 1 POSITION 2 7
DISPLAY "−−−−−−−−−−−−−−−−−−−−−−−−−" LINE 2 POSITION 2 7
DISPLAY " " LINE 3 POSITION 1 ERASE EOS.
leer−alumno .
DISPLAY " I n t r o d u c e l o s datos d e l alumno " AT LINE 3 COLUMN 1
DISPLAY " A p e l l i d o 1 . " LINE 4 POSITION 2 WITH REVERSE−VIDEO
DISPLAY " A p e l l i d o 2 . " LINE 5 POSITION 2 WITH REVERSE−VIDEO
DISPLAY " Nombre . . . . " LINE 6 POSITION 2 WITH REVERSE−VIDEO
ACCEPT a p e l l i d o 1 AT LINE 4 POSITION 1 2
ACCEPT a p e l l i d o 2 LINE 5 POSITION 1 2
ACCEPT nombre LINE 6 POSITION 1 2
WITH PROMPT CHARACTER IS ’ ∗ ’
END−ACCEPT.

Listado 4: Un ejemplo de entrada y salida.

Universidad de Valladolid Dpto. de Informática


4 Sentencias 11

• Sentencia de asignación.

 MOVE VALOR TO VARIABLE

• Sentencia de cálculo

 COMPUTE VAR [ROUNDED] = EXPRESIÓN [ON SIZE


ERROR SENTENCIA] END-COMPUTE

• Sentencias aritméticas

 ADD VALOR TO VARIABLE


 SUBTRACT VALOR FROM VARIABLE
 MULTIPLY VALOR BY VARIABLE
 DIVIDE VALOR INTO VARIABLE
 DIVIDE VALOR1 BY VALOR2 GIVING VARIABLE1[ RE-
MAINDER VARIABLE2]

• Sentencia PERFORM.

 PERFORM párrafo

Figura 8: Algunas sentencias básicas en cobol

Universidad de Valladolid Dpto. de Informática


12 Introducción al cobol.

de caracteres se ajustan a la derecha, mientras que las numéricas lo


hacen en torno al punto decimal.
• La sentencia COMPUTE suele utilizarse en caso de expresiones com-
plejas, puesto que en estos casos las sentencias aritméticas resultan
demasiado tediosas. En la expresión de COMPUTE podemos utilizar
los sı́mbolos aritméticos habituales (** para la potencia); la clausula
ON SIZE ERROR permite ejecutar cierta sentencia cuando se produce
un error aritmético. Esta clausula también es opcional en todas las
sentencias aritméticas.
• La sentencia PERFORM permite ejecutar un párrafo de este mismo pro-
grama. Además disponen de una sentencia CALL que les permite llamar
a otro programa (ver sección 7).

5 Estructuras de control
Para la utilización de estructuras de control en cobol podemos utilizar
condicionales de dos tipos:
• Operadores relacionales.

valor1 [NOT] [IS] >|=|< valor2

• Comprobación de “tipo”.

valor1 IS [NOT] NUMERIC|ALPHABETIC

Utilizando estas condiciones podemos emplear las estructuras de control


recogidas en la figura 9, como se hace en el listado 5 cuya salida serı́a intere-
sante determinar.

6 Otros tipos de datos


Evidentemente en cobol además de los datos simples podemos utilizar
otros tipos de datos.
Para empezar en cobol podemos utilizar constantes simbólicas, pero a
diferencia de Pascal su significado se restringe al valor de una variable. Ası́
en el programa 4 definimos dos constantes simbólicas para denotar el sexo.
En cobol a estas constantes se les denomina nombres de condición.
Además de VALUE IS podemos utilizar VALUES ARE seguido de varios
valores.

Universidad de Valladolid Dpto. de Informática


6 Otros tipos de datos 13

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Ejemplo de uso de l a s e s t r u c t u r a s de c o n t r o l . ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . e c o n t r o l .
AUTHOR . P r o f e s o r e s de Programación I I .

DATA DIVISION .
WORKING−STORAGE SECTION .
7 7 l i n e a PIC 9 9 VALUE IS 5 .
PROCEDURE DIVISION .
principal .
PERFORM comprobacion1
PERFORM comprobacion2
PERFORM bucle1
PERFORM bucle2
PERFORM bucle3
STOP RUN .
comprobacion1 .
IF l i n e a > = 5
DISPLAY " ∗∗∗ Comprobación 1 ∗∗∗"
END−IF .

comprobacion2 .
EVALUATE l i n e a
WHEN 5 DISPLAY " ∗∗∗ Comprobación 2 ∗∗∗"
WHEN OTHER DISPLAY "NO FUNCIONA"
END−EVALUATE .
bucle1 .
DISPLAY " ∗∗∗ Primer b u c l e ∗∗∗"
MOVE 1 0 TO l i n e a
PERFORM UNTIL l i n e a = 1 0
DISPLAY l i n e a
ADD 1 TO l i n e a
END−PERFORM
DISPLAY " ∗∗∗ F i n a l Primer b u c l e ∗∗∗" .
bucle2 .
MOVE 5 TO l i n e a
DISPLAY " ∗∗∗ Segundo b u c l e ∗∗∗"
PERFORM WITH TEST AFTER UNTIL l i n e a = 1 0
DISPLAY l i n e a
ADD 1 TO l i n e a
ON SIZE ERROR MOVE 1 0 TO LINEA
END−PERFORM
DISPLAY " ∗∗∗ F i n a l Segundo b u c l e ∗∗∗" .
bucle3 .
DISPLAY " ∗∗∗ T e r c e r b u c l e ∗∗∗"
PERFORM VARYING l i n e a FROM 1 BY 1 UNTIL l i n e a = 1 0
DISPLAY l i n e a
END−PERFORM
DISPLAY " ∗∗∗ F i n a l T e r c e r b u c l e ∗∗∗" .

Listado 5: Ejemplo de uso de algunas estructuras de control.

Universidad de Valladolid Dpto. de Informática


14 Introducción al cobol.

• IF condicion [THEN] {sentencia} [ELSE {sentencia}] END-IF

• EVALUATE var {WHEN caso {sentencia}}[WHEN OTHER {sentencia}]


END-EVALUATE

• PERFORM UNTIL condicion {sentencia} END-PERFORM

• PERFORM WITH TEST AFTER UNTIL condicion {sentencia} END-


PERFORM

• PERFORM VAYRING var FROM valor1 by paso UNTIL condicion {sen-


tencia} END-PERFORM

Figura 9: Estructuras de control.

6.1 Registros
En cobol podemos declarar variables estructuradas. Utilizamos para ello
un número de nivel 01 en la zona b de la lı́nea y números de nivel más altos
para los niveles más internos de la estructura. Por ejemplo en el programa 6
leemos de forma elemental los datos de una persona y los almacenamos en
un registro.
Como se ve en el ejemplo, en el programa podemos utilizar directamente el
nombre del campo del registro, lo cual nos da una pista de que no debemos
utilizar el mismo nombre de campo en varios registros; sin embargo, si lo
hacemos, podemos distinguirlos mediante el cualificador OF.

6.2 Vectores
Los vectores son un tipo especial de registros en que los campos se repi-
ten. Ası́ podemos realizar varios tipos de declaración de vectores como los
recogidos en el programa de la figura 7.

7 Programas distribuidos en varios ficheros


Para la utilización de subprogramas con parámetros, cobol dispone de
la posibilidad de compilar los subprogramas en ficheros diferentes y llamarlos
mediante el comando CALL. En este caso el subprograma contiene la defi-
nición de los parámetros formales en la LINKAGE SECTION que aparece
en la DATA DIVISION después de la WORKING STORAGE SECTION. Un

Universidad de Valladolid Dpto. de Informática


7 Programas distribuidos en varios ficheros 15

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Un ejemplo más complicado de e n t r a d a y s a l i d a , ∗
∗ con u t i l i z a c i ó n de un r e g i s t r o . ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . r e g i s t r o .
AUTHOR . P r o f e s o r e s de Programación I I .

DATA DIVISION .
WORKING−STORAGE SECTION .
0 1 dato .
0 2 a p e l l i d o 1 PIC X ( 3 0 ) .
0 2 a p e l l i d o 2 PIC X ( 3 0 ) .
0 2 nombre PIC X ( 3 0 ) .
0 2 sexo PIC X .
8 8 hombre VALUE IS "H" .
8 8 mujer VALUE IS "M" .

PROCEDURE DIVISION .
principal .
PERFORM cabecera
PERFORM leer−alumno
DISPLAY " L e c t u r a f i n a l i z a d a " LINE 1 0 POSITION 1 0
STOP RUN .
cabecera .
DISPLAY " U n i v e r s i d a d de V a l l a d o l i d " LINE 1 POSITION 2 7
DISPLAY "−−−−−−−−−−−−−−−−−−−−−−−−−" LINE 2 POSITION 2 7
DISPLAY " " LINE 3 POSITION 1 ERASE EOS.
leer−alumno .
DISPLAY " I n t r o d u c e l o s datos d e l alumno " LINE 3 POSITION 1
DISPLAY " A p e l l i d o 1 . " LINE 4 POSITION 2
DISPLAY " A p e l l i d o 2 . " LINE 5 POSITION 2
DISPLAY " Nombre . . . . " LINE 6 POSITION 2
DISPLAY " Sexo (H/M) " LINE 7 POSITION 2
ACCEPT a p e l l i d o 1 LINE 4 POSITION 1 2 WITH PROMPT " _ "
ACCEPT a p e l l i d o 2 LINE 5 POSITION 1 2 WITH PROMPT " _ "
ACCEPT nombre LINE 6 POSITION 1 2 WITH PROMPT " _ "
PERFORM leer−sexo .
leer−sexo .
ACCEPT sexo LINE 7 POSITION 1 2 WITH PROMPT " _ "
PERFORM UNTIL hombre OR mujer
DISPLAY "ERROR. Dato i n c o r r e c t o "
LINE 7 POSITION 1 5 WITH REVERSE−VIDEO
END−DISPLAY
ACCEPT sexo LINE 7 POSITION 1 2 WITH PROMPT " _ "
DISPLAY " " LINE 7 POSITION 1 5 ERASE EOL
END−PERFORM .

Listado 6: Lectura de datos sobre un registro.

Universidad de Valladolid Dpto. de Informática


16 Introducción al cobol.

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ D e f i n i c i ó n de v e c t o r e s . ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . Vectores .
AUTHOR . P r o f e s o r e s de Programación I I .

DATA DIVISION .
WORKING−STORAGE SECTION .
01 vector .
0 2 elemento PIC 9 9 OCCURS 1 0 TIMES .
01 matriz .
0 2 f i l a OCCURS 1 0 TIMES .
0 3 columna OCCURS 1 0 TIMES PIC X .
01 votacion .
0 2 v o t o PIC A OCCURS 5 TO 9 0 TIMES DEPENDING ON v o t o s .
7 7 v o t o s PIC 9 9 .
PROCEDURE DIVISION .
principal .
MOVE 1 0 TO v o t o s
MOVE 1 0 TO elemento ( 5 )
MOVE "X" TO columna ( 2 , 3 )
MOVE "X" TO v o t o ( 6 )
STOP RUN .

Listado 7: Definición de vectores.

ejemplo elemental de esta forma de trabajo es el recogido en los listados 8 y


9.
Por defecto el paso de parámetros se realiza por variable, de modo que si
se desea el paso de parámetros por valor hay que añadir el modificador BY
CONTENT a la llamada al subprograma.

8 Procesamiento de ficheros
En cobol vamos a poder utilizar tres tipos de ficheros: Ficheros de acceso
secuencial, ficheros secuenciales indexados y ficheros de acceso directo (fiche-
ros de acceso relativo). En las siguientes secciones veremos las declaraciones
y comandos necesarios para utilizarlos.

8.1 Ficheros secuenciales


Se trata del esquema de acceso más sencillo, heredado directamente de los
tiempos de las lectoras de tarjetas, y con el que debemos estar familiarizados,
pues suele ser utilizado en la asignatura Programación I.
Los ficheros secuenciales deberán ser declarados como el resto de los datos.

Universidad de Valladolid Dpto. de Informática


8.1 Ficheros secuenciales 17

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Programa que l l a m a a un subprograma e x t e r n o ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . l l a m a .
AUTHOR . P r o f e s o r e s de Programación I I .

DATA DIVISION .
WORKING−STORAGE SECTION .
∗ no e d i t a d a s .
7 7 a PIC 9 ( 4 ) .
7 7 b PIC 9 ( 4 ) .
7 7 c PIC 9 ( 5 ) VALUE IS 0 .
∗ editadas .
7 7 r e s u l t a d o PIC ZZZZ9 .

PROCEDURE DIVISION .
principal .
DISPLAY " Primer sumando=" WITH NO ADVANCING
ACCEPT a
DISPLAY " Segundo sumando=" WITH NO ADVANCING
ACCEPT b
CALL " llamado " USING a , b , c
MOVE c TO r e s u l t a d o
DISPLAY " La suma es " r e s u l t a d o
STOP RUN .

Listado 8: Programa que llama a otro.

IDENTIFICATION DIVISION.
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de óprogramacin en COBOL para la ∗
∗ asignatura óProgramacin II (óGestin) ∗
∗ óMdulo llamado por otro programa. ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID. llamado.
AUTHOR. Profesores de óProgramacin II.

DATA DIVISION.
LINKAGE SECTION.
∗ no editadas.
77 x PIC 9(4).
77 y PIC 9(4).
77 z PIC 9(5).
PROCEDURE DIVISION USING x,y,z.
principal .
add x to y giving z
exit program.

Listado 9: Programa llamado por otro.

Universidad de Valladolid Dpto. de Informática


18 Introducción al cobol.

Una parte de la declaración deberá realizarse en la ENVIRONMENT DIVI-


SION., dedicada a los detalles de la interfaz del fichero como nombre fı́sico,
tipo de organización y acceso. La otra parte de la declaración se almacena en
la DATA DIVISION. y se dedica a los detalles lógicos como la descripción
de los registros del fichero.

Declaraciones de la ENVIRONMENT DIVISION El esquema de esta di-


visión será:

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT [OPTIONAL] nombre ASSIGN TO literal
[ORGANIZATION SEQUENTIAL]
[ACCESS SEQUENTIAL]
[FILE STATUS IS nombre de dato].

La principal función de esta declaración es asignar un nombre lógico a


un nombre fı́sico. Además podemos indicar el tipo de organización, por
defecto secuencial, y el tipo de acceso, también secuencial por defecto. La
clausula OPTIONAL se utiliza para ficheros de escritura que pueden no existir
inicialmente (serán creados en lugar de provocar un error), y la clausula FILE
STATUS nos permite seleccionar el dato que nos informará sobre el estado
del fichero tras cada lectura utilizando una clave de dos dı́gitos.

Declaraciones de la DATA DIVISION En esta división la declaración de


los ficheros responde al siguiente esquema:

DATA DIVISION.
FILE SECTION.
FD nombre del archivo
DATA RECORD IS nombre.
01 nombre.
y la declaración de registro al uso

Hay que señalar que nombre es el nombre del registro de datos del fichero,
y lógicamente debe ser el mismo en los dos puntos en que aparece. Además
en la definición del registro puede aparecer como nombre de campo FILLER
que indica que este campo no se utilizará en la PROCEDURE DIVISION
o lo que es lo mismo, que este campo no será utilizado en el proceso del
fichero; simplemente se trata de una forma de protegernos de la utilización o
modificación de estos campos.

Universidad de Valladolid Dpto. de Informática


8.2 Apertura y cierre de ficheros 19

8.2 Apertura y cierre de ficheros


Antes de utilizar el fichero deberemos de abrirlo con el comando OPEN
mientras que tras su uso hay que cerrarlo con CLOSE. Para OPEN disponemos
de algunos parámetros opcionales que determinan el tipo de acceso con el que
se abre el fichero:
OPEN OPCION FICHERO Abre el fichero
CLOSE FICHERO Cierra el fichero
Opciones de open
INPUT Fichero de entrada.
OUTPUT Fichero de salida.
I-O Fichero de entrada/salida.
EXTEND Fichero de salida,
añadiendo registros.
Lectura y escritura
READ fichero [AT END sentencia]
WRITE registro

8.3 Comandos para el proceso de ficheros


Para leer de un fichero abierto con parámetro INPUT o I-O utilizamos:
READ nombre de archivo RECORD [INTO nombre de dato]
[AT END sentencia]
Si no se indica el registro opcional el dato leı́do se almacenará bajo el
nombre de registro que da forma a los registros del archivo. Además la
clausula opcional AT END nos permite prever alguna acción a realizar cuando
se termine el fichero (tı́picamente poner a cierto una marca de final de fichero).
Hay que resaltar que en cobol la marca de fin de fichero se obtiene tras haber
intentado leer de un fichero vacı́o, al contrario de lo que ocurre en Pascal.
Para escribir sobre un archivo secuencial abierto con el parámetro OU-
PUT, I-O o EXTEND utilizaremos el comando:
WRITE nombre de registro [FROM nombre de dato]
El dato se almacena en el fichero en cuya definición se utilizó el nombre
de registro y, opcionalmente, se saca del registro que sigue a FROM.
Por último podemos modificar el último registro leı́do de un fichero, para
ello utilizaremos:
REWRITE nombre de registro [FROM nombre de dato]
Con estos elementos podemos realizar programas sencillos como los reco-
gidos en los listados 10, 11 o 12 que utilizan ficheros secuenciales:

Universidad de Valladolid Dpto. de Informática


20 Introducción al cobol.

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ L e c t u r a de un f i c h e r o s e c u e n c i a l . ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . l e c t u r a .
AUTHOR . P r o f e s o r e s de Programación I I .

ENVIRONMENT DIVISION .
INPUT−OUTPUT SECTION .
FILE−CONTROL .
SELECT e n t r a d a ASSIGN TO " alumnos . d a t "
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL .

DATA DIVISION .
FILE SECTION .
FD e n t r a d a
DATA RECORD IS alumno .
0 1 alumno .
0 2 a p e l l i d o 1 PIC X ( 1 0 ) .
0 2 a p e l l i d o 2 PIC X ( 1 0 ) .
0 2 nombre PIC X ( 1 0 ) .
0 2 sexo PIC X .
8 8 hombre VALUE IS "H" .
8 8 mujer VALUE IS "M" .
WORKING−STORAGE SECTION .
7 7 f i n PIC X VALUE "N" .
8 8 f i n − d e − f i c h e r o VALUE IS "S" .
7 7 l i n e a PIC 9 9 VALUE IS 5 .
PROCEDURE DIVISION .
principal .
OPEN INPUT e n t r a d a
PERFORM cabecera
PERFORM leer−alumno
PERFORM UNTIL f i n − d e − f i c h e r o
PERFORM e s c r i b i r − a l u m n o
PERFORM leer−alumno
ADD 1 TO l i n e a
END−PERFORM
CLOSE e n t r a d a
STOP RUN .
cabecera .
DISPLAY " " LINE 1 POSITION 1 ERASE EOS
DISPLAY " U n i v e r s i d a d de V a l l a d o l i d " LINE 1 POSITION 2 7
DISPLAY "−−−−−−−−−−−−−−−−−−−−−−−−−" LINE 2 POSITION 2 7
DISPLAY " A p e l l i d o 1 . " LINE 4 POSITION 2
DISPLAY " A p e l l i d o 2 . " LINE 4 POSITION 1 3
DISPLAY " Nombre . . . . " LINE 4 POSITION 2 4
DISPLAY " Sexo (H/M) " LINE 4 POSITION 3 5 .
leer−alumno .
READ e n t r a d a
AT END MOVE "S" TO f i n .
escribir−alumno .
DISPLAY a p e l l i d o 1 LINE l i n e a POSITION 2
DISPLAY a p e l l i d o 2 LINE l i n e a POSITION 1 3
DISPLAY nombre LINE l i n e a POSITION 2 4
DISPLAY sexo LINE l i n e a POSITION 3 5 .

Listado 10: Lectura de un fichero

Universidad de Valladolid Dpto. de Informática


8.3 Comandos para el proceso de ficheros 21

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Escribimos e l primer f i c h e r o secuencial . ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . m o d i f i c a c i o n .
AUTHOR . P r o f e s o r e s de Programación I I .

ENVIRONMENT DIVISION .
INPUT−OUTPUT SECTION .
FILE−CONTROL .
SELECT s a l i d a ASSIGN TO " alumnos . d a t "
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL .

DATA DIVISION .
FILE SECTION .
FD s a l i d a
DATA RECORD IS alumno .
0 1 alumno .
0 2 a p e l l i d o 1 PIC X ( 1 0 ) .
0 2 a p e l l i d o 2 PIC X ( 1 0 ) .
0 2 nombre PIC X ( 1 0 ) .
0 2 sexo PIC X .
8 8 hombre VALUE IS "H" .
8 8 mujer VALUE IS "M" .
WORKING−STORAGE SECTION .
7 7 r e s p u es t a PIC X VALUE IS "S" .
8 8 no−mas−registros VALUES ARE "N" , " n " .

PROCEDURE DIVISION .
principal .
OPEN OUTPUT s a l i d a
PERFORM WITH TEST AFTER UNTIL no−mas−registros
PERFORM cabecera
PERFORM leer−alumno
WRITE alumno
DISPLAY " ¿Más r e g i s t r o s ?" LINE 1 0 POSITION 1 0
ACCEPT r e s pu e s t a LINE 1 0 POSITION 2 6 WITH PROMPT " _ "
END−PERFORM
CLOSE s a l i d a
STOP RUN .
cabecera .
DISPLAY " U n i v e r s i d a d de V a l l a d o l i d " LINE 1 POSITION 2 7
DISPLAY "−−−−−−−−−−−−−−−−−−−−−−−−−" LINE 2 POSITION 2 7
DISPLAY " " LINE 3 POSITION 1 ERASE EOS.
leer−alumno .
PERFORM l i m p i a r − r e g i s t r o
DISPLAY " I n t r o d u c e l o s datos d e l alumno " LINE 3 POSITION 1
DISPLAY " A p e l l i d o 1 . " LINE 4 POSITION 2
DISPLAY " A p e l l i d o 2 . " LINE 5 POSITION 2
DISPLAY " Nombre . . . . " LINE 6 POSITION 2
DISPLAY " Sexo (H /M) " LINE 7 POSITION 2
ACCEPT a p e l l i d o 1 LINE 4 POSITION 1 2 WITH PROMPT " _ "
ACCEPT a p e l l i d o 2 LINE 5 POSITION 1 2 WITH PROMPT " _ "
ACCEPT nombre LINE 6 POSITION 1 2 WITH PROMPT " _ "
PERFORM leer−sexo .

leer−sexo .
PERFORM WITH TEST AFTER UNTIL hombre OR mujer
ACCEPT sexo LINE 7 POSITION 1 2 WITH PROMPT " _ "
IF NOT hombre AND NOT mujer
DISPLAY " E r r o r : Entrada i n c o r r e c t a "
LINE 1 0 POSITION 1 5 WITH REVERSE−VIDEO
END−DISPLAY
END−IF

END−PERFORM
DISPLAY " " LINE 1 0 POSITION 1 0 ERASE EOL .
limpiar−registro .
MOVE SPACE TO a p e l l i d o 1
MOVE SPACE TO a p e l l i d o 2
MOVE SPACE TO nombre
MOVE SPACE TO sexo .

Listado 11: Escritura de un fichero

Universidad de Valladolid Dpto. de Informática


22 Introducción al cobol.

IDENTIFICATION DIVISION .
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ M o d i f i c a c i o n de un f i c h e r o s e c u e n c i a l . ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . l e c t u r a .
AUTHOR . P r o f e s o r e s de Programación I I .

ENVIRONMENT DIVISION .
INPUT−OUTPUT SECTION .
FILE−CONTROL .
SELECT f i c h e r o ASSIGN TO " alumnos . d a t "
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL .

DATA DIVISION .
FILE SECTION .
FD f i c h e r o
DATA RECORD IS alumno .
0 1 alumno .
0 2 a p e l l i d o 1 PIC X ( 1 0 ) .
0 2 a p e l l i d o 2 PIC X ( 1 0 ) .
0 2 nombre PIC X ( 1 0 ) .
0 2 sexo PIC X .
8 8 hombre VALUE IS "H" .
8 8 mujer VALUE IS "M" .
WORKING−STORAGE SECTION .
7 7 f i n PIC X VALUE "N" .
8 8 fin−de−fichero VALUE IS "S" .
PROCEDURE DIVISION .
principal .
OPEN I−O f i c h e r o
PERFORM cabecera
PERFORM leer−alumno
PERFORM UNTIL fin−de−fichero
PERFORM cambiar−sexo−alumno
PERFORM r e e s c r i b i r − a l u m n o
PERFORM leer−alumno
END−PERFORM
CLOSE f i c h e r o
STOP RUN .
cabecera .
DISPLAY " " LINE 1 POSITION 1 ERASE EOS
DISPLAY " U n i v e r s i d a d de V a l l a d o l i d " LINE 1 POSITION 2 7
DISPLAY "−−−−−−−−−−−−−−−−−−−−−−−−−" LINE 2 POSITION 2 7
DISPLAY " Procedo a l cambio de sexo de l o s alumnos . . . "
− LINE 5 POSITION 1 0

DISPLAY " Cambio de sexo e f e c t u a d o . " LINE 6 POSITION 1 0 .


leer−alumno .
READ f i c h e r o
AT END MOVE "S" TO f i n .
cambiar−sexo−alumno .
IF hombre
THEN
MOVE "M" TO sexo
ELSE
MOVE "H" TO sexo
END−IF .
reescribir−alumno .
REWRITE alumno .

Listado 12: Modificación de un fichero

Universidad de Valladolid Dpto. de Informática


9 Ficheros indexados 23

9 Ficheros indexados
Los ficheros indexados están formados por uno o más ficheros de ı́ndice
y un fichero de datos1 . El acceso a estos ficheros puede realizarse de forma
secuencial o bien a través del ı́ndice.

9.1 Declaración de ficheros indexados


La declaración de ficheros indexados solo varı́a con respecto de la de-
claración de ficheros secuenciales en la parte situada en la ENVIRONMENT
DIVISION. Su nuevo aspecto es el siguiente:

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT nombre ASSIGN TO literal
ORGANIZATION INDEXED
[ACCESS SEQUENTIAL | RANDOM | DYNAMIC]
RECORD KEY IS nombre de dato 1
[ALTERNATE RECORD KEY IS nombre de dato 2[WITH DUPLICATES]]

La declaración en la DATA DIVISION es la misma que para un fichero se-


cuencial.
El tipo de acceso declarado indicará si en ejecución se puede acceder de
forma secuencial, mediante ı́ndice o si se puede variar dinámicamente entre
ambos tipos de acceso. Pueden aparecer varias claves alternativas, y en su
declaración aparecerá indicado si pueden existir varios registros con la misma
clave o no. En todo caso la clave principal no admite registros duplicados.

10 Comandos para el proceso de ficheros in-


dexados
La lectura mediante ı́ndice se realiza mediante la orden:

• READ FICHERO RECORD [KEY IS CAMPO] [INVALID KEY SEN-


TENCIA] Busca en el fichero el registro que tiene por clave el valor
1
Aunque en función de la implementación concreta que se haga del compilador, estos
ficheros pueden constituı́r un único fichero fı́sico

Universidad de Valladolid Dpto. de Informática


24 Introducción al cobol.

almacenado en el campo correspondiente del registro asociado al fiche-


ro. Si no existe ejecuta la sentencia opcional. Si no se indica clave, se
utiliza la principal.

• WRITE REGISTRO

• DELETE FICHERO RECORD [INVALID KEY SENTENCIA]

• REWRITE FICHERO RECORD [INVALID KEY SENTENCIA]

• START FICHERO KEY IS EXPRESIÓN [INVALID KEY SENTEN-


CIA] Posiciona el puntero de lectura.

• READ FICHERO NEXT [AT END SENTENCIA]

• DELETE FICHERO RECORD [INVALID KEY SENTENCIA]

• REWRITE FICHERO RECORD [INVALID KEY SENTENCIA]

Universidad de Valladolid Dpto. de Informática


10 Comandos para el proceso de ficheros indexados 25

∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Creación de un f i c h e r o indexado ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . crea−indexado .
AUTHOR . P r o f e s o r e s de Programación I I .

ENVIRONMENT DIVISION .
INPUT−OUTPUT SECTION .
FILE−CONTROL .
SELECT s a l i d a ASSIGN TO " A s i g n a t u r a s . d a t "
ORGANIZATION IS INDEXED
RECORD KEY IS numero
ALTERNATE RECORD IS nombre WITH DUPLICATES
ACCESS IS SEQUENTIAL .

DATA DIVISION .
FILE SECTION .
FD s a l i d a
DATA RECORD IS a s i g n a t u r a .
01 asignatura .
0 2 numero PIC 9 9 9 .
0 2 nombre PIC X ( 2 0 ) .
0 2 alumnos PIC 9 ( 4 ) .
0 2 p r o f e s o r PIC X ( 4 0 ) .
WORKING−STORAGE SECTION .
7 7 s e g u i r PIC X VALUE "S" .
8 8 no−mas−datos VALUE IS "N" .
7 7 alumnos−editado PIC ZZZ9 .

PROCEDURE DIVISION .
principal .
PERFORM cabecera
OPEN OUTPUT s a l i d a
MOVE 1 TO numero
PERFORM WITH TEST AFTER UNTIL no−mas−datos
PERFORM l e e r − r e g i s t r o
WRITE a s i g n a t u r a
DISPLAY " Más r e g i s t r o s ? (S / N ) " LINE 9 POSITION 3
ACCEPT s e g u i r LINE 9 POSITION 2 7 WITH REVERSE−VIDEO
ADD 1 TO numero
END−PERFORM
CLOSE s a l i d a
STOP RUN .

cabecera .
DISPLAY " " LINE 1 POSITION 1 ERASE EOS
DISPLAY " U n i v e r s i d a d de V a l l a d o l i d " LINE 2 POSITION 2 7
DISPLAY "−−−−−−−−−−−−−−−−−−−−−−−−−" LINE 3 POSITION 2 7
DISPLAY " Datos de l a a s i g n a t u r a : " LINE 5 POSITION 3
DISPLAY " Número . . . . . . . . . . . . . . . . . " LINE 5 POSITION 3
DISPLAY " Nombre . . . . . . . . . . . . . . . . . " LINE 6 POSITION 3
DISPLAY " No de alumnos . . . . . . . . . . " LINE 7 POSITION 3
DISPLAY " P r o f e s o r . . . . . . . . . . . . . . . " LINE 8 POSITION 3 .
leer−registro .
∗ Limpiamos l o s campos antes de l a l e c t u r a .
MOVE " " TO nombre
MOVE 0 TO alumnos−editado
MOVE " " TO p r o f e s o r
∗ Limpiamos l a zona de p a n t a l l a en que se l e e
DISPLAY " " LINE 6 POSITION 2 7 WITH ERASE EOL
DISPLAY " " LINE 7 POSITION 2 7 WITH ERASE EOL
DISPLAY " " LINE 8 POSITION 2 7 WITH ERASE EOL
DISPLAY " " LINE 9 POSITION 3 WITH ERASE EOL
∗ Mostramos l a c l a v e p r i n c i p a l , que es c a l c u l a d a .
DISPLAY numero LINE 5 POSITION 2 7
∗ La l e c t u r a d e l r e g i s t r o .
ACCEPT nombre LINE 6 POSITION 2 7 WITH REVERSE−VIDEO
DISPLAY nombre LINE 6 POSITION 2 7
∗ Leemos e l número en un campo e d i t a d o para e v i t a r
∗ e l comportamiento “ e x t r a ñ o ” en o t r o caso .
ACCEPT alumnos−editado LINE 7 POSITION 2 7 WITH REVERSE−VIDEO
MOVE alumnos−editado TO alumnos
DISPLAY alumnos−editado LINE 7 POSITION 2 7
ACCEPT p r o f e s o r LINE 8 POSITION 2 7 WITH REVERSE−VIDEO
DISPLAY p r o f e s o r LINE 8 POSITION 2 7 .

Listado 13: Ejemplo de creación de un fichero indexado.

Universidad de Valladolid Dpto. de Informática


26 Introducción al cobol.

∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ Ejemplos de programación en COBOL para l a ∗
∗ a s i g n a t u r a Programación I I ( Gestión ) ∗
∗ Búsqueda en f i c h e r o indexado ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
PROGRAM−ID . busca−indexado .
AUTHOR . P r o f e s o r e s de Programación I I .

ENVIRONMENT DIVISION .
INPUT−OUTPUT SECTION .
FILE−CONTROL .
SELECT e n t r a d a ASSIGN TO " A s i g n a t u r a s . d a t "
ORGANIZATION IS INDEXED
RECORD KEY IS numero
ALTERNATE RECORD IS nombre WITH DUPLICATES
ACCESS IS RANDOM .

DATA DIVISION .
FILE SECTION .
FD e n t r a d a
DATA RECORD IS a s i g n a t u r a .
01 asignatura .
0 2 numero PIC 9 9 9 .
0 2 nombre PIC X ( 2 0 ) .
0 2 alumnos PIC 9 ( 4 ) .
0 2 p r o f e s o r PIC X ( 4 0 ) .
WORKING−STORAGE SECTION .
7 7 alumnos−editado PIC ZZZ9 .
7 7 buscado−editado PIC ZZ9 .
7 7 encontrado PIC X VALUE IS "S" .

PROCEDURE DIVISION .
principal .
PERFORM cabecera
OPEN INPUT e n t r a d a
DISPLAY " No A s i g n a t u r a ?" LINE 1 0 POSITION 4
ACCEPT buscado−editado LINE 1 0 POSITION 1 9
MOVE buscado−editado TO numero
READ e n t r a d a INVALID KEY
MOVE "N" TO encontrado
IF encontrado = "S"
THEN
PERFORM mostrar−encontrado
ELSE
DISPLAY " A s i g n a t u r a no encontrada " LINE 1 0 POSITION 2 0
END−IF
CLOSE e n t r a d a
STOP RUN .

cabecera .
DISPLAY " " LINE 1 POSITION 1 ERASE EOS
DISPLAY " U n i v e r s i d a d de V a l l a d o l i d " LINE 2 POSITION 2 7
DISPLAY "−−−−−−−−−−−−−−−−−−−−−−−−−" LINE 3 POSITION 2 7
DISPLAY " Datos de l a a s i g n a t u r a : " LINE 5 POSITION 3
DISPLAY " Número . . . . . . . . . . . . . . . . . " LINE 5 POSITION 3
DISPLAY " Nombre . . . . . . . . . . . . . . . . . " LINE 6 POSITION 3
DISPLAY " No de alumnos . . . . . . . . . . " LINE 7 POSITION 3
DISPLAY " P r o f e s o r . . . . . . . . . . . . . . . " LINE 8 POSITION 3 .
mostrar−encontrado .
MOVE alumnos TO alumnos−editado
DISPLAY numero LINE 5 POSITION 2 7
DISPLAY nombre LINE 6 POSITION 2 7
DISPLAY alumnos−editado LINE 7 POSITION 2 7
DISPLAY p r o f e s o r LINE 8 POSITION 2 7 .

Listado 14: Ejemplo de búsqueda sobre un fichero indexado.

Universidad de Valladolid Dpto. de Informática