Está en la página 1de 68

Programación COBOL

¿Qué es COBOL?
Es un lenguaje de programación de alto nivel desarrollado por
primera vez por el Comité CODASYL (Conference
on Data Systems Languages) en 1960. Desde entonces, la
responsabilidad por el desarrollo de nuevas normas COBOL ha
sido asumida por el American National Standards Institute
(ANSI).

Ha habido 3 modificaciones de normas ANSI para este


lenguaje: en 1968, 1974 y 1985.

COBOL es un acrónimo que


significa COmmon Business Oriented Language (Lenguaje
orientado a los negocios comunes). Está diseñado para el
desarrollo de negocios, por lo general orientada a archivos y
aplicaciones. No está diseñado para escribir programas de
sistemas, como por ejemplo un sistema operativo o un
compilador.

Durante más de cuatro décadas COBOL ha sido el lenguaje de


programación dominante en la informática empresarial,
gracias a la capacidad de manejar ficheros grandes. En ese
tiempo se ha encontrado desafíos de un gran número lenguajes
de programación como PL1, Algol68, Pascal, Modula, Ada, C, C
+ +. Todas estos lenguajes han encontrado su sitio en le
mercado, pero ninguno ha desplazado a COBOL. Actualmente
hay desafíos recientes como Java y Visual Basic y Python, que
están demostrando ser serios competidores.

Introducción a la Programación. Un programa es un


conjunto de instrucciones escritas en un lenguaje que el
ordenador pueda entender.
El ordenador ejecuta instrucciones del programa, uno tras
otro en secuencia hasta que alcanza el final del programa, a
menos que alguna instrucción en el programa altere el orden
de ejecución.

Veamos un ejemplo práctico muy simple para hacernos una


pequeña idea de lo que es un programa.

Queremos escribir un programa que acepte dos números desde


el teclado, multiplicarlos y mostrar el resultado en la pantalla
del ordenador.

Cuando se nos plantea un problema debemos estudiar un poco


e identificar los datos que necesitamos y que queremos que
haga el programa con esos datos:

 ¿Que Necesitamos? Dos números, que le vamos a llamar


Num1 y Num2.
 ¿Cual es el proceso? Multiplicar Num1 por Num2.
 ¿Que hacemos con la información que obtenemos? Vamos
amostrarlo en pantalla.

Los datos conocidos que necesitamos en un proceso, se


almacenan en un pequeño trozo en la memoria. Esta trozo de
memoria es lo que se llama variable. Se le asigna un nombre
para identificarlo y tener acceso a él en cualquier momento del
programa.

Normas de Codificación. Un programa en Cobol se escribe


secuencialmente en líneas de 80 columnas o menos con la
siguiente división:
La parte (1) comprende las columnas de la 1 a la 6 ambas
inclusive y se utiliza para numerar las líneas. Prácticamente
esto ya no se utiliza.

La parte (2) comprende la columna 7 y en ella podemos


encontrar, un guión (-) que nos indica que esta línea es
continuación de la anterior pero que por su tamaño ocupa mas
de una línea, un asterisco (*) que nos indica que es un
comentario y por lo tanto el compilador lo ignora.

La parte (3) se le llama Área 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 Área 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.

En conclusión, sólo tenemos disponibles para escribir el código


desde la columna 8 hasta la 72, todo aquello que escribamos a
partir de ésta última el compilador lo ignora y no lo compila y
dará muchos errores de compilación.

El punto es algo muy a tener en cuenta en COBOL ya que nos


indica el final de una linea y determinan todas las secciones,
divisiones y párrafos. Un simple punto que se nos olvide, daría
muchos errores al compilar y tendríamos muchos dolores de
cabeza hasta dar con el problema.
Todos los nombres definidos por el usuario, como variables,
nombres de párrafo…, deben cumplir con las siguientes reglas:

 Deben contener al menos un carácter, pero no más de 30


caracteres.
 Deben contener al menos un carácter alfabético.
 No debe comenzar ni terminar con un guión.
 Deben construirse a partir de los caracteres de la A a la Z,
números del 0 al 9 y el guión.
 No deben contener espacios y no se distinguen entre
mayúsculas y minúsculas, es decir, que es lo mismo NUM1,
nUm1, num1.

Estructura de un programa

La jerarquía de un programa en COBOL se compone de cuatro


divisiones principales:

 IDENTIFICATION DIVISION. Consta de la información


del programa.
 ENVIRONMENT DIVISION. Consta de la información del
entorno.
 DATA DIVISION. Consta de las descripciones de los datos.
 PROCEDURE DIVISION. Consta de todo el algoritmo del
programa.

IDENTIFICATION DIVISION. Esto es un ejemplo de la típica


información que se suele añadir en esta sección:
IDENTIFICATION DIVISION.
PROGRAM-ID Nombre del programa.
AUTHOR Nombre del autor.
INSTALLATION Lugar donde está instalado.
DATE-WRITTENFecha de creación.
DATE-COMPILEDFecha de compilación.
REMARKS Comentarios.

Ejemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. Programa1.
AUTHOR. Ismael.
INSTALLATION. WWW.
REMARKS. Programa de prueba.

ENVIRONMENT DIVISION.

Se utiliza para describir el ambiente en el que se ejecutará el


programa, detalles como el orden de clasificación, el símbolo
de la moneda y el símbolo de punto decimal.

DATA DIVISION.

Es donde definiremos los datos que vayamos a utilizar en


nuestro programa. Existen Otras secciones dentro de la DATA
DIVISION que las veremos más adelante.

PROCEDURE DIVISION.

Es aquí donde el programador escribe el código o algoritmo del


programa para su correcto funcionamiento.

Algunos compiladores COBOL requiere que todas las


divisiones deben estar presente en un programa, mientras que
otros sólo requieren mínimo de la IDENTIFICATION
DIVISION y la PROCEDURE DIVISION. Yo estoy haciendo
estos pequeños apuntes con el compilador OpenCobol bajo
linux.

Este ejemplo del programa “hola mundo” que encontraremos


en casi todos los manuales y tutoriales que existen, es
perfectamente válido cuando se compila con el compilador
OpenCobol:

IDENTIFICATION DIVISION.
PROGRAM-ID. Prueba.
PROCEDURE DIVISION.
Inicio.
DISPLAY "Hello world"
STOP RUN.

En cualquier lenguaje de programación se necesita trabajar


con datos. En Cobol existen tres categorías donde almacenar
datos: Las variables, los literales y constantes figurativas:

Variables. Una variable es un nombre que le asignamos a


trozo de memoria, en la cual un programa puede acceder a éste
y trabajar.

Cada variable utilizada en un programa COBOL deben ser


descritos en la DATA DIVISION, en la sección WORKING-
STORAGE SECTION.

Tipos de Variables. En COBOL, en realidad sólo hay tres tipos


de datos; numérico, alfanumérico (número y letras) y
alfabético (de la A a la Z).
Literales o constantes. Son datos cuyo valor suelen ser
constantes y no cambian. Existen dos tipos de literales:

 Literales alfanuméricas. Se encierran entre comillas y se


componen de números y letras, como por ejemplo
“ismael”, “-125.25”, “ismael-15”.
 Literales numéricas. Se componen fundamentalmente de
números, ya sean positivos o negativos, incluyendo punto
decimales. Un ejemplo sería -125.25, 25.48, 6.

Constantes Figurativas. Son valores que se le dan por


defecto a las variables cuando se definen en la WORKING-
STORAGE SECTION. Las constante figurativas son las
siguientes;

 SPACE ó SPACES. Actúa como uno o más espacios.


 ZERO ó ZEROS ó ZEROES. Actúa como uno o más ceros.
 QUOTE ó QUOTES. Se utiliza en lugar de las comillas, no
hay valor.
 HIGH-VALUE ó HIGH-VALUES. Utiliza el valor máximo
posible.
 LOW-VALUE ó LOW-VALUES. Utiliza el valor menor
posible.

Declarando Variables o Identificadores. Cuando se


define una variable en cobol debemos especificar
detalladamente 3 elementos fundamentales:

 El número de nivel. Que indica el tipo de datos que


almacenaremos, por ejemplo, numérico, alfanumérico ó
alfabético.
 El nombre de la variable. Este variable no podrá contener
caracteres raros, ni nada fuera de lo normal. Se suelen
utilizar letras y números, guiones, pero nunca deben
comenzar ni terminar por guion. Los nombres no podrán
superar los 30 caracteres.
 Cláusula de imagen. (PICTURE ó PIC).

1. 9. Campos numéricos.
2. A. Campos alfabéticos.
3. X. Campos alfanuméricos.
4. S. Variable con signo.
5. V. Variable con punto decimal.

Podemos utilizar otros elementos para completar los campos:

 . El punto la separación de miles.


 , La coma indica la separación de decimales.
 Z. Representa espacios para los ceros de la izquierda, de
esta manera no se visualizan.

El número de nivel. 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 que puede
almacenar una variable.
 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
Área A (Col 8) el resto es independiente.

Veamos un ejemplo para ver como se van declarando las


variables:

WORKING-STORAGE SECTION.
77 FECHA PIC 9(8).
77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ.
77 IMPORTE PIC S9(8)V99.
77 IMPORTE-EDIT PIC ZZ.ZZZ.ZZZ,ZZ-.
01 ESTADO PIC 9.
88 SOLTERO VALUE 1.
88 CASADO VALUE 2.
88 DIVORCIADO VALUE 3.
01 DOMICILIO.
02 TIPO PIC XX.
02 NOMBRE PIC X(20).
02 NUMERO PIC 9(4).

Como hemos visto anteriormente, la PROCEDURE DIVISION


es donde reflejamos todo el código de un programa. En esta
parte vamos aprender como se asignan valores a variables,
mostrar en pantalla sus valores, obtener la fecha y hora del
sistema y operaciones aritméticas básicas.

Display. Esta instrucción la usaremos para visualizar datos en


pantalla, ya sean variables, constantes o texto. Si sintaxis es la
siguiente:

Algunos ejemplos:

DISPLAY "Mi nombre es: "Nombre.


Notas. Por norma general cuando termina una instrucción,
automáticamente mueve el cursor a la linea siguiente, excepto
cuando ponemos la cláusula WITH NO ADVANCING. La
claúsula UPON se usa para que el programador utilice un
nombre para identificar algún periférico del ordenador, como
por el ejemplo, el puerto de la impresora. Por defecto se usa la
pantalla como periférico del ordenador.

Accept. Esta instrucción se utiliza para obtener datos desde


un teclado, un periférico del ordenador o incluso de variables
definidas por el sistema, como por ejemplo la fecha y hora del
sistema. Su sintaxis es la siguiente:

El primer formato se utiliza para aceptar variables desde


teclado o cualquier otro periférico del ordenador.

El segundo formato se utiliza para aceptar variables del


sistema.

Nota. Por defecto el periférico del ordenador que se suele


utilizar con esta instrucción es el teclado.

Veamos un ejemplo de como se definen las variables del


sistema:

IDENTIFICATION DIVISION.
PROGRAM-ID. PruebaFechas.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
* Formato YYMMDD
01 CurrentDate.
02 CurrentYear PIC 9(4).
02 CurrentMonth PIC 99.
02 CurrentDay PIC 99.
* Formato YYDDD
01 DayOfYear.
02 YearDay PIC 9(3).
* El Tiempo en formato HHMMSSss s = S/100
01 CurrentTime.
02 CurrentHour PIC 99.
02 CurrentMinute PIC 99.
PROCEDURE DIVISION.
Inicio.
ACCEPT CurrentDate FROM DATE YYYYMMDD
ACCEPT DayOfYear FROM DAY YYYYDDD
ACCEPT CurrentTime FROM TIME
DISPLAY "La fecha es: " CurrentDay SPACE CurrentMonth
SPACE CurrentYear
DISPLAY "Día nº. " YearDay " Del año " CurrentYear
DISPLAY "Son las " CurrentHour ":" CurrentMinute
STOP RUN.

En la cláusula ACCEPT debemos indicarle el formato del año


que queremos introducir, en este caso es con 4 dígitos (YYYY).

Asignación de Datos.

En cobol básicamente existe solo tres tipos de datos; los


alfabéticos, numéricos y alfanuméricos. A la hora de asignar
datos o darle valor a una variable se utiliza la instrucción
MOVE. Su sintaxis es la siguiente:

MOVE origen TO destino…

Esta instrucción lo que hace es mover los valores as una o


varias variables, teniendo en cuenta lo siguiente:

 Si el origen es mas pequeño que el destino, se rellenarán


los espacios sobrantes con ceros o espacios.
 Si el origen es mas grande que el destino, obviamente se
perderán los datos que no encajen.
 Si existiera punto decimal, el campo se le dará formato de
nuevo, según lo que tengamos declarado en la WORKING-
STORAGE SECTION.

Hay que tener en cuenta que los datos de origen y destino


deben ser del mismo tipo y tamaño, no podemos almacenar
textos cuando la variable de destino son de números y
viceversa.

Algunos ejemplos pueden ser:

MOVE 135 TO num1.


MOVE 25 TO num1 num2 num3.
MOVE "juan" TO nombre.

Cálculos Aritméticos.

Sumando.

Veamos unos ejemplos:

 Vamos a imaginar que tenemos creadas 3 variables,


num1, num2 y resultado y tiene un valor cada una de ellas.
En este ejemplo suma el valor de num1 + num2 + 5 + el
valor que tenga la variable resultado y lo vuelve a
guardar en la variable resultado.

ADD num1 num2 5 TO resultado

 En este ejemplo no tiene en cuenta el valor inicial que


tenga la variable resultado, es decir, que suma borrará el
valor de resultado y guardará sólo la suma de num1 +
num2 + 5.
ADD num1 num2 5 GIVING resultado

Restando.

Veamos unos ejemplos:

 En este ejemplo lo que hace es restar todas las valores


numéricos al valor que hay a continuación de FROM,
incluida éste y lo guarda en resultado, es decir, resta a
resultado el valor de la variable num1 5 num2 y después
resta el valor que tenga resultado y lo guarda en
resultado.

SUBTRACT num1 5 num2 FROM resultado

 En este ejemplo lo que hace es restar num1 y 5 al valor de


num2 y lo almacena en resultado, sin tener en cuenta el
valor que tenga resultado, ya que no cuenta en la resta.

SUBTRACT num1 5 FROM num2 GIVING resultado

Multiplicando.

Veamos unos ejemplos:

 Multiplica el 5 por el valor de resultado y lo guarda en


resultado.

MULTIPLY 5 BY resultado

 Multiplica el 5 por el valor de num1 y lo guarda en


resultado, sin tener en cuenta el valor que ésta pueda
tener, ya que no participa en la multiplicación.
MULTIPLY 5 BY num1 GIVING resultado

Dividiendo.

Veamos unos ejemplos:

 Divide el valor de la variable resultado entre 10 y lo


guarda en resultado.

DIVIDE 10 INTO resultado

 Divide el valor de num1 entre 7 y lo guarda en la variable


resultado, sin tener en cuenta el valor de resultado, ya que
no interviene en la división.

DIVIDE 7 INTO num1 GIVING resultado

Múltiples Cálculos. Existe una instrucción que no puede


facilitar mucho las cosas, ya que su objetivo es evaluar una
expresión aritmética y realizar varios cálculos al mismo
tiempo. Esta instrucción se llama COMPUTE. Su sintáxis es la
siguiente:

Veamos unos ejemplos:

 Este ejempo da como resultado 17, es decir 3x5=15+2=17.

COMPUTE resultado = 2 + 3 * 5

 En cambio en este ejemplo lo que hace primero es 2 + 3 y el


resultado lo multiplica por 5, cuyo resultado es 25.

COMPUTE resultado = (2 + 3) * 5
Debemos tener en cuenta que cuando hacemos varios cálculos
simultáneos hay un orden de preferencia. Primero se hacen los
operadores que hayan entre paréntesis después las
multiplicaciones y divisiones y por último las sumas y las
restas. Por ese motivo estas dos instrucciones dan un resultado
diferente.

Operadores:

 **. Calcula la potencia.


 *. Calcula la multiplicación.
 /. Calcula la división.
 +. Calcula la suma.
 -. Calcula la resta.

Si nos fijamos bien, todas las operaciones de aritmética que


hemos visto hasta ahora tienen la opción ROUNDED. Esta
opción sirve para redondear resultados, veamos un ejemplo
para ver que ocurre cuando la utilizamos:

Declaración. Resultado. Truncado. Redondeado.

PIC 9(3)V9 123.25 123.2 123.3


PIC 9(3)V9 123.247 123.2 123.2
PIC 9(3) 123.25 123 123

Un valor se trunca cuando un resultado es mas grande que la


variable donde queremos almacenarlo, entonces el sistema
intenta truncarlo de manera que entre en su destino.

El cláusula ROUNDED (redondeado) lo que hace es ajustar la


parte decimal, de forma, que si el segundo decimal es 5 o
mayor de 5 se le suma uno al primer dígito decimal y si es
menor de 5 se queda con el primer número decimal.

Vamos a hacer un ejemplo, en el que nos pida desde teclado


dos números, y hacemos una suma, resta, multiplicación,
división y potencia de esos dos números, para ver como se van
haciendo un programa:

IDENTIFICATION DIVISION.
PROGRAM-ID. Calcular.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 Num1 PIC 9 VALUE ZEROS.
77 Num2 PIC 9 VALUE ZEROS.
77 Result1 PIC 9(2)V9(2) VALUE ZEROS.
77 Result2 PIC 9(2)V9(2) VALUE ZEROS.
77 Result3 PIC 9(2)V9(2) VALUE ZEROS.
77 Result4 PIC S9(2)V9(2) VALUE ZEROS.
77 Result5 PIC 9(2)V9(2) VALUE ZEROS.
PROCEDURE DIVISION.
Inicio.
DISPLAY "Dame el primer numero: "WITH NO ADVANCING
ACCEPT Num1
DISPLAY "Dame el segundo numero: "WITH NO ADVANCING
ACCEPT Num2
ADD Num1 Num2 GIVING Result3
SUBTRACT Num1 FROM Num2 GIVING Result4
MULTIPLY Num1 BY Num2 GIVING Result1
DIVIDE Num1 INTO Num2 GIVING Result2
COMPUTE Result5 = Num1 /2 * (Num2–7)
DISPLAY "Resultado de la multiplicacion es: ", Result1
DISPLAY "Resultado de la division es: ", Result2
DISPLAY "Resultado de la suma es: ", Result3
DISPLAY "Resultado de la resta es: ", Result4
DISPLAY "Resultado de la expresion es: ", Result5
STOP RUN.

Si nos fijamos bien en la WORKING , hemos usado en los PIC


una V y un S, voy a explicarlo un poco:
 Definimos un valor numérico entero de dos caracteres
“9(2)” y otros dos de punto decimal “V9(2)”. Cuando
usamos una S delante significa que nos mostrará si es o no
negativo el valor.

77 Result1 PIC 9(2)V9(2) VALUE ZEROS

 También podemos usar la “Z” para que no muestre los


ceros de la izquierda. Si observamos con detenimiento, se
usan tantas Z como dígitos se componga la variable,
indicando el signo delante y el punto que separa los
decimales.

77 Result1 PIC -ZZ.ZZ VALUE ZEROS

Nota: A la hora de realizar cálculos aritméticos con


COMPUTE, debemos fijarnos bien y utilizar los espacios, es
decir, separar siempre la variable del signo aritmético, ya que
hay algunos compiladores que lo pueden mal interpretar y dar
un error de compilación.

Condiciones

Por norma general, un programa escrito en COBOL se ejecuta


forma secuencial, es decir, una sentencia tras otra de forma
que llegue hasta la instrucción de final de programa. Existen
instrucciones en las que pueden variar este orden de ejecución,
como son las condiciones.

En este apartado vamos a aprender como se utilizan sentencias


como IF, EVALUATE y crear y utilizar nombres de
condiciones.
Utilizando IF.

Cuando un programa se encuentra una instrucción IF, lo que


hace es evaluar la condición. Si es verdadera realiza las
instrucciones que se encuentre en en THEN. Si es falsa
ejecutará las instrucciones que se encuentre en el ELSE. Una
vez que termine la sentencia del IF se debe especificar su fin
con END-IF.

Veamos como se debería hacer la estructura de un IF:

Bloque1
Bloque2
IF variable1 < Variable2 THEN
Bloque3
Bloque4
ELSE
Bloque5
END-IF

Operadores Relacionales.

 > Mayor que.


 < Menor que.
 >= Mayor o igual que.
 <= Menor o igual que.
 <> Distinto que.

Existen dos tipos de condiciones, las simples y las compuestas.

Las condiciones simples son aquellas que preguntamos por


solo una condición, como por ejemplo “Si Variable1 es menor
que Variable2 Entonces…”.
Las condiciones compuestas son aquellas que usamos dos o
más condiciones simples a la vez, como por ejemplo “Si
Variable1 es menor que Variable2, que Variable3 sea igual a
Variable4 Entonces..”

En las condiciones compuestas existen unos operadores que


sirven para juntar varias condiciones simples; OR y AND.

Las condiciones siempre se leen de izquierda a derecha y sólo


evalúan si la condición es verdadera o falsa. Vamos a ver unos
ejemplos y voy explicando sus diferencias.

IF Variable1>10 AND Variable<26 THEN


Setencia1…
END-IF
IF NOT Variable1<10 OR Variable2=50 AND Variable3>150 THEN
Sentencia1…
END-IF

AND. Usando esta cláusula evalúa las dos condiciones a la vez,


es decir, en este ejemplo será verdadero, sólo y exclusivamente
cuando se cumplan las dos condiciones a la vez. Si alguna de la
variables no cumpliera la condición, el resultado sería falso y
no haría la sentencias que hay en el THEN.

OR. A diferencia de la cláusula anterior, ésta evalúa las


condiciones una a una y cuando sea verdadera una de ellas o
las dos a la vez, realiza las instrucciones que encuentra en el
THEN.

Hay que tener en cuenta que COBOL mantiene un orden


prioridad al evaluar las condiciones.

1. Paréntesis.
2. NOT.
3. AND.
4. OR.

En el segundo ejemplo se interpretaría de la siguiente forma:

 Lo primero que evalúa es el “NOT (Variable1<10)”.


 Lo siguiente sería “(Variable2=50) AND (Variable3>150)”.
 Por último sería la claúsula OR “(NOT (Variable1<10)) OR
((Variable2=50) AND (Variable3>150))”.

Nombres de Condiciones. Los nombre de condiciones son


variables que se definen como nivel 88, en los que se definen
los valores posibles que puede contener la variable o el
identificador. Su sintaxis es la siguiente:

Cuando usamos los nombres de condiciones, la cláusula


VALUE no asigna valores a una variable, lo que hace es dar los
posibles valores que puede contener esa condición para que
sea verdadera.

Lista de Valores.

02 Departamento PIC X.
88 Desarrollo VALUE I,L,T.

Rango de Valores. También podemos asociar varios


nombres de condiciones a un misma variable, como en este
caso.
02 Edad PIC 9(3).
88 Niño VALUE 0 THRU 12.
88 Adolescente VALUE 13 THRU 19.
88 Adulto VALUE 20 THRU 999.

Utilizando nombres de condiciones. Veamos un ejemplo:

WORKING-STORAGE SECTION.
01 Caracter PIC X.
88 Vocales VALUE "a", "e", "i", "o", "u".
88 Consonantes VALUE "b", "c", "d", "f", "g", "h".
88 Numeros VALUE "0" THRU "9".
…etc.
ACCEPT Caracter.
IF Vocales THEN
DISPLAY "El digito "Caracter "es una vocal"
ELSE
IF Consonantes THEN
DISPLAY "El digito " Caracter " es una consonante"
ELSE
IF Numeros THEN
DISPLAY "El digito " Caracter " es un numero"
ELSE
DISPLAY "El digito introducido es incorrecto"
END-IF
END-IF
END-IF

Utilizando EVALUATE. Esta cláusula es otra forma de evaluar


condiciones, pero de forma estructurada, como tipo “Casos”.
Veamos su sintaxis:

Podemos utilizar como ejemplo el ejercicio anterior de las


vocales, pero veremos lo que cambia usando EVALUATE:

ACCEPT Caracter.
EVALUATE TRUE
WHEN Vocales DISPLAY "Es una vocal"
WHEN Consonantes DISPLAY "Es una consonante"
WHEN Numeros DISPLAY "Es un número"
WHEN OTHER DISPLAY "Digito incorrecto"
END-EVALUATE

Si nos fijamos hemos usado la cláusula TRUE para evaluar que


nombres de condiciones (nivel 88) son verdaderas, también
podemos utilizar condiciones, rangos de números o incluso
variables. Veamos otro ejemplo:

EVALUATE Caracter
WHEN "0" Sentencias…
WHEN "1" THRU “9” Sentencias…
WHEN "a" Sentencias…
WHEN "x" Sentencias…
END-EVALUATE

Párrafos y bucles
En casi todos los programa que se pueden crear, existen tareas
que pueden o no ser objeto de repetición. A estos procesos se
les llama bucles o estructuras repetitivas.

Por ejemplo, podemos tener un proceso que nos pida dos


números unas 10 veces y realizar cálculos matemáticos. Como
es lógico, no vamos a escribir 10 veces el proceso, lo que
hacemos es hacer un bucle y que lo haga 10 veces, pero en
realidad a nivel de programación el proceso lo hemos definido
una sola vez.

En esta parte vamos a aprender como se crean bucles o


instrucciones repetitivas y párrafos o rutinas para controlar el
orden de ejecución del programa.

Párrafos o Rutinas. Siempre que se ejecuta un programa en


COBOL, se hace de forma secuencial, empezando desde arriba
hasta que encuentre la instrucción de finalizar el programa.
Las rutinas es una forma de alterar ese orden, es decir, le
damos el control a un párrafo y ejecuta todas las instrucciones
que haya en éste. Veamos un ejemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. Parrafos.
AUTHOR. Ismael.
* Esto es un ejemplo usando rutinas o párrafos.
PROCEDURE DIVISION.
Inicio.
DISPLAY "Este es el principio del programa"
PERFORM Rutina2
DISPLAY "Ahora voy a terminar el programa"
STOP RUN.
Rutina1.
DISPLAY "Estoy en la rutina1"
PERFORM Rutina3.
Rutina2.
DISPLAY "Ahora estoy en la rutina2"
PERFORM Rutina1.
Rutina3.
DISPLAY "Ahora estoy en la rutina3".

Si observamos detenidamente este ejemplo, lo que hacemos es


el párrafo Inicio, dentro de este llamamos a la Rutina 2, dentro
de éste llamamos a la Rutina 1 y por último desde la rutina1
llamamos al párrafo rutina3. Una vez terminado estas rutinas,
el programa vuelve a su orden normal, es decir, realiza las
sentencias que le faltaban del párrafo Inicio, terminando así
con la ejecución del programa. También hay que decir, que
hacer párrafos estructura un poco mejor el programa y puede
resultar un poco mas legible y comprensible.

PERFORM…THRU. Esto es otra forma de usar los párrafos


como rutinas, es ejecutando más de un párrafo a la vez.
Veamos un ejemplo:
IDENTIFICATION DIVISION.
PROGRAM-ID. Programa.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
PROCEDURE DIVISION.
INICIO.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO
STOP RUN.
PIDENOMBRE.
DISPLAY "DAME TU NOMBRE:"
ACCEPT NOMBRE.
PIDEAPELLIDO.
DISPLAY "DAME TUS APELLIDOS:"
ACCEPT APELLIDO.

PERFORM…TIMES. Vamos a ampliar un poco el número de


veces que queremos que repita un proceso. Esta sentencia
sirve para repetir un párrafo un número de veces determinado,
su sintáxis es la siguiente:

Vamos a hacer un ejemplo, para aclarar un poco como


funciona:

IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
PROCEDURE DIVISION.
INICIO.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO 3 TIMES
STOP RUN.
PIDENOMBRE.
DISPLAY "DAME TU NOMBRE:"
ACCEPT NOMBRE.
PIDEAPELLIDO.
DISPLAY "DAME TUS APELLIDOS:"
ACCEPT APELLIDO.

PERFORM…UNTIL. Este tipo de sentencia sirve para


realizar un párrafo hasta que se cumpla la condición. Veamos
un ejemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 LI PIC 99 VALUE 0.
PROCEDURE DIVISION.
INICIO.
DISPLAY "PROGRAMA DE SALUDO"
PERFORM SALUDAR UNTIL LI =5
STOP RUN.
SALUDAR.
ADD 1 TO LI
DISPLAY "SALUDO Nº.: ", LI.

También podemos hacer el bucle de otra forma:

IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 LI PIC 99 VALUE 0.
PROCEDURE DIVISION.
INICIO.
DISPLAY "PROGRAMA DE SALUDO"
PERFORM UNTIL LI =5
ADD 1 TO LI
DISPLAY "SALUDO Nº.: ", LI
END-PERFORM
STOP RUN.
Si observamos un poco, la diferencias radican en que ahora
tiene un “fin del bucle”.

Este proceso lo que haces es mostrar un saludo 5 veces. Para


eso lo que hemos utilizado es una variable (LI) para contar el
número de veces que saludamos. A continuación repetimos el
párrafo SALUDAR hasta que se cumpla la condición es decir,
sea igual a 5.

Si nos fijamos bien en el código del programa, hemos iniciado


la variable LI a 0, ¿Porque hacemos esto? Este tipo de procesos
repetitivos lo que primero que hace es comprobar la condición,
y si no se cumple continúa con el proceso repetitivo. En este
caso le he dado el valor 0, si la diéramos un valor superior o
igual 5 no entraría jamás en el proceso repetitivo y terminaría
el programa.

PERFORM…VARYING. Este tipo de bucles se le da valor a


una variable y se aumenta o disminuye dicho valor y el proceso
lo hace tantas veces hasta que se cumpla la condición. Con este
tipo de bucle nos ahorraríamos algunas instrucciones, ya que
hace varias instrucciones en una sola. Veamos un ejemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 LI PIC 99 VALUE 0.
PROCEDURE DIVISION.
INICIO.
PERFORM VARYING LI FROM 1 BY 1 UNTIL LI >5
DISPLAY "Saludo Nº.: ", LI
END-PERFORM
STOP RUN.
¿Como trabaja el VARYING?. Lo primero que hace es iniciar la
variable LI al valor que indica el FROM, pregunta por la
condición y si no se cumple realiza la sentencias que hay
dentro. A continuación aumenta el valor de LI según lo que
tenga en el BY y vuelve a preguntar por la condición…y así
sucesivamente hasta que se cumpla la condición. En este caso
realizará las sentencias con los valores 1, 2, 3, 4 y 5.

Ficheros.
Los ficheros son archivos de datos donde se almacenan los
valores que necesitemos de un programa a nivel de registro,
algo parecido como ocurre con los registros de las bases de
datos. Aunque COBOL se puede utilizar para procesar otros
tipos de archivo de datos, se utiliza generalmente sólo para
procesar registros.

Hay esencialmente dos tipos de organización de registros:

 Archivos Secuenciales. Los registros se organizan y se


accede en serie, es decir, de forma secuencial pasando por
los registros anteriores para ir a uno especifico.
 Archivos de acceso directo o Indexados. En un archivo de
acceso directo, los registros se organizan de una manera
que permite el acceso directo a un registro determinado
sin tener que pasar por cualquiera de los registros
anteriores.

Algunas organizaciones son más versátiles que otras, por


ejemplo, un archivo con una organización indexada puede
tener acceso a sus registros de forma secuencial o de forma
directa, pero los registros en un archivo con una organización
secuencial sólo se puede acceder de forma secuencial.
En la actualidad se suelen usar ficheros indexados, ya que los
secuenciales sólo se pueden agregar y leer y son un poco más
engorrosos para poder actualizar, modificar o borrar un
registro.

Veamos algunos conceptos básicos para orientarnos y saber de


lo que hablamos:

 Se usa el término archivo o fichero para almacenar todos


aquellos valores que necesitemos en un programa.
 El término registro se usa para describir un conjunto de
campos que registran información acerca de un sólo
objeto.
 Usamos el término campo para describir cada
información registrada sobre un solo objeto, por ejemplo
teléfono, dirección.

Vamos a imaginar una agenda de teléfono:

 El fichero sería toda la agenda. Un fichero con el nombre


agenda.
 El registro sería el conjunto de información de cada
persona, es decir; nombre, teléfono, dirección, código
postal…etc.
 El campo sería cada información independiente que tiene
una persona de la agenda, por ejemplo, el nombre es un
campo, teléfono sería otro campo, la dirección otro campo
más y así sucesivamente.
 Todos los campos juntos es lo que forma registro, es decir,
la fila entera, que resulta que es toda la información que
tenemos de una sola persona u objeto.
Vamos a usar de ejemplo la agenda e iremos definiendo un
fichero de organización secuencial en cobol:

Agenda.dat (así lo llamaremos).

Cada registro tendra esta estructura:

Orden Nombre Dirección Codigo Postal


Teléfono
1 Ismael Calle Perú, 5 06010
999255124
2 Javier Calle Faisan, 16 06025
989525289
3 Lourdes Calle Perdiz, 21 06259
929444548

Ahora para definir este estructura de fichero en cobol:


ENVIRONMNET DIVISION.
INPUT-OUTPUT SECTION.
* Esta claúsula nos permite dar el nombre real del fichero en
el disco.
* También podemos indicar el camino, por ejemplo
“c:\ficheros\agenda.dat”
* El nombre que le asignemos en la SELECT debe coincidir con
el de la FD.
SELECT AGENDA ASSIGN TO “AGENDA.DAT”.
DATA DIVISION.
FILE SECTION.
* El nombre interno que le asignamos se llamara agenda.
FD AGENDA.
* A continuación definimos como se llama el registro y como
se estructura.
01 AGENDA-REG.
02 ORDEN PIC 9(2) VALUE ZEROS.
02 NOMBRE PIC X(15) VALUE SPACES.
02 DIRECCION PIC X(30) VALUE SPACES.
02 CODIGO-POSTAL PIC 9(4) VALUES ZEROS.
02 TELEFONO PIC 9(9) VALUES ZEROS.
Vemos como es la sintaxis de la instrucción SELECT:

SELECT NombreFichero ASSIGN TO NombreFicheroExterno

En estos tipos de archivos debemos tener en cuenta 4


instrucciones fundamentales. OPEN, CLOSE, READ, WRITE .
Vamos a ir viéndolos poco a poco y como funcionan.

OPEN. Veamos su sintaxis: OPEN modo


nombreinternodelfichero

Antes de trabajar con un fichero, hay que asegurarse de abrirlo


correctamente para acceder a los datos que pueda contener
para trabajar con ellos. Existen 3 formas de abrir un fichero:

INPUT. Se abre un fichero en modo lectura. Usando este


cláusula se coloca el puntero en el primer registro. Si el fichero
no existiera daría un error, ya que el primer requisito es que el
fichero exista.

OUTPUT. Se abre un fichero en modo escritura. Usando esta


cláusula tiene la peculiaridad de que si no existe lo crea y si
existe, lo elimina y vuelve a crearlo. Hay que tener cuidado con
esto, ya que crea un nuevo fichero cada vez que lo utilizamos,
borrando los datos que pudiéramos tener almacenados.

EXTEND. Como su nombre indica, se abre un fichero para


extenderlo, es decir, para agregar más registros a los ya
existentes. Cuando se abre de esta forma, el puntero se coloca
en el último registro para continuar almacenando datos.
Obviamente el requisito fundamental es que el fichero exista,
si no fuera asi la instrucción OPEN nos mostraría un error.
CLOSE. Su sintaxis es la siguiente: CLOSE
nombreficherointerno…

Se debe siempre asegurase, antes de terminar con un


programa, que se cierran debidamente todos los ficheros que
hayamos utilizado, ya que puede grabarse los datos de mala
manera y perder el acceso a estos ficheros en el futuro.

READ. Su sintaxis es la siguiente:

READ nombreinternodelfichero NEXT/PREVIOUS RECORD INTO


descripción
AT END / NO AT END instrucciones
END-READ

Una vez que tengamos un fichero abierto, toca usar una


instrucción para leer cada registro, veamos como funciona:

 Cuando utilizamos esta instrucción, lo que hace es


almacenar en un la memoria una copia del registro que esta
leyendo para trabajar con él.
 INTO. Esto se utiliza para usar una variable en donde
almacenar el registro. Al hace esto, tendremos el registro en
dos lugares, en la memoria y en la variable para su
posterior utilización.
 AT END. Este instrucción es la que nos indica cuando ha
llegado al final del fichero, es decir, cuando haya terminado
de leer todos los registros que haya en el fichero.
 NOT AT END. Es posible que queramos hacer algún tipo de
procedimiento cuando no ha llegado al final del fichero.

WRITE. Veamos su sintaxis; WRITE registro FROM variable.


 Esta instrucción sirve para grabar los datos en el fichero
que usamos como almacenamiento de datos.
 FROM. Esto sirve para realizar una copia en una variable
del registro que vayamos almacenar en el fichero.

Vamos a coger el ejemplo de la agenda de teléfono.


Agregaremos un par de registros y luego los leeremos y
visualizaremos sus datos para ir viendo como funciona:

identification division.
program-id. Ficheros.
author. Ismael.
environment division.
input-output section.
file-control.
select agenda assign to "agenda.dat"
organization is line sequential.
data division.
file section.
fd agenda.
01 agenda-reg.
02 orden pic 9(2).
02 nombre pic X(15).
02 direccion pic X(30).
02 codigo-postal pic 9(5).
02 telefono pic 9(9).
working-storage section.
77 fin-fichero pic 9 value 0.
procedure division.
Inicio.
open output agenda
perform 3 times
perform agregar
perform limpiar-pantalla
end-perform
perform leer-agenda
close agenda
stop run.
agregar.
display "programa de la agenda"
display "dame el orden: "with no advancing
accept orden
display "dame el nombre: "with no advancing
accept nombre
display "dame la direccion: "with no advancing
accept direccion
display "dame el codigo postal: "with no advancing
accept codigo-postal
display "dame el telefono: "with no advancing
accept telefono
write agenda-reg.
limpiar-pantalla.
* usando esta instrucción, puedo llamar a cualquier comando
del S.O.
CALL "SYSTEM" USING "clear".
leer-agenda.
move 0 to fin-fichero
close agenda
open input agenda
perform until fin-fichero=1
read agenda
at end move 1 to fin-fichero
not at end perform leer-registro
end-read
end-perform.
leer-registro.
display "orden: "orden
display "nombre: "nombre
display "direccion: “ direccion
display "codigo postal: "codigo-postal
display "telefono: "telefono.

Organización y Acceso.

Cuando hablamos de Organización de los datos, se refiere a la


forma en la que se organizan los registros en un dispositivo de
almacenamiento. Existen en COBOL 3 tipos de organizaciones;

Secuencial. Registros organizan en serie.


Relativa. Organización basada en el número relativo de
registro.
Indexado. Organización basada en uno o varios índices, es
decir, por una o varias claves como pasa con los las bases de
datos.
Si hablamos de Método de acceso, se refiere a la forma en que
se accede a los registros. Dependiendo del tipo de organización
hay varias formas de hacerlo:

Organización Secuencial. El modo de acceso sólo puede ser


secuencial.
Organización Indexada. Este tipo de archivos o ficheros son los
más utilizados en cobol, ya que permiten en acceso de varias
formas:

 Dynamic. Permite el acceso de forma secuencial o directa


según nos interese a lo largo del procedimiento.
 Random. Permite el acceso de forma directa, sin necesidad
de pasar por los registros anteriores.

Cuando utilizamos los ficheros indexados, existen varios


parámetros extras que debemos indicarle al a hora de definir el
archivo en la SELECT, vamos a verlo:

SELECT nombrefichero ASSIGN TO nombreficherofisico


ORGANIZATION IS SEQUENTIAL
INDEXED
ACCESS MODE IS SEQUENTIAL
RANDOM
DYNAMIC
RECORD KEY IS claveprincipal
ALTERNATE RECORD KEY IS clavealternativa (WITH DUPLICATES)
FILE STATUS IS variable

 ACCESS MODE SEQUENTIAL. Modo de acceso es


secuencial o de serie, es decir, pasará por todos los registros
anteriores para consultar uno específico.
 ACCESS MODE RANDOM. Modo de acceso directo, es
decir, se desplazará directamente al registro que vayamos a
consultar sin necesidad de pasar por los anteriores.
 ACCESS MODE DYNAMIC. Es el modo de acceso mas
utilizado, podemos acceder de forma secuencial o directa
cuando mas nos interese dentro de un programa.
 RECORD KEY. Clave principal se refiere a un campo
numérico que debe ser único para cada registro para poder
identificarlo inequívocamente.
 ALTERNATE RECORD KEY. Clave alternativa se
refiere a otro campo numérico o alfanumérico para poder
darle otro orden al fichero a la hora de consultar. Se pueden
hacer hasta 254 claves de este tipo en un sólo archivo. Este
tipo de claves se suele utilizar para realizar consultas por
otro campo que no sea la clave principal, por ejemplo, por
fechas o por nombre…etc. Por defecto si no se dice nada,
son claves que no pueden duplicarse y son únicas por
registro. Si queremos una clave alternativa que se pudiera
repetir hay que indicarle la cláusula “WITH DUPLICATES”.
 FILE STATUS. Aquí se usa un campo alfanumérico de
dos caracteres para guardar el estado del fichero. Por
ejemplo si abriéramos un archivo y este no existiera por
algún motivo, o no lo abra correctamente, almacenaría un
código de error en esa variable.

El código de error con el que trabajaremos será el “35”. Este


número se guarda en la variable que indiquemos en el FILE
STATUS, cuando al abrir un fichero éste no exista.

¿Que cosas podemos hacer con los archivos indexados? Pues


básicamente podemos hacer OPEN, READ, WRITE y con estos
tipos de archivos podemos hacer REWRITE, DELETE y
START gracias a los índices para identificar a cada registro.

OPEN. Veamos su sintaxis:


OPEN modo nombreinternodelfichero

Antes de trabajar con un fichero, hay que asegurarse de abrirlo


correctamente para acceder a los datos que pueda contener
para trabajar con ellos. Existen 4 formas de abrir un fichero:

 INPUT. Se abre un fichero en modo lectura. Si el fichero


no existiera daría un error, ya que el primer requisito es
que el fichero exista.
 OUTPUT. Se abre un fichero en modo escritura. Usando
esta cláusula tiene la peculiaridad de que si no existe lo
crea y si existe, lo elimina y vuelve a crearlo. Hay que
tener cuidado con esto, ya que crea un nuevo fichero cada
vez que lo utilizamos, borrando los datos que pudiéramos
tener almacenados.
 I-O. El archivo se abre en modo lectura/escritura de
forma que podemos agregar, leer, escribir, rescribir o
modificar y borrar la información de los registros.

CLOSE. Su sintaxis es la siguiente:

CLOSE nombredelficherointerno…

Se debe siempre asegurase, antes de terminar con un


programa, que se cierran debidamente todos los ficheros que
hayamos utilizado, ya que puede grabarse los datos de mala
manera y perder el acceso a estos ficheros en el futuro.

READ.

Hay que tener en cuenta que la lectura en este tipo de archivos


se debe hacer en función del tipo de acceso, es decir, si el
acceso es secuencial se lee exactamente igual que los ficheros
de organización secuencial. Veamos que cambiaría si la
organización es indexada pero el acceso secuencial:

as

file-control.
select agenda assign to "agenda.dat"
organization is indexed
access mode is sequential
record key is orden
alternate record key is nombre
alternate record key is codigo-postal
file status is estado.

Agregar.

accept telefono
write agenda-reg
invalid key display "error al guardar"
end-write.

Si nos fijamos bien hay que darle un par de datos más, propio
de los ficheros indexados, como son por ejemplo las claves
principales o alternativas, en el caso de que las hubiere. La
variable con la que trabajamos en la “file status” debemos
declararla en la “Working” como es lógico. También existiría
un pequeño cambio a la hora de escribir los registros, ya que
dependemos de una clave principal para guardar los cambios.

Ahora bien, si el acceso lo hemos definido como


“Dynamic/Random”, dependerá del valor de la clave que
vayamos a utilizar para la consulta.

READ nombreinternodelfichero INTO descripción


KEY IS clave
INVALID KEY instrucciones
END-READ
Ahora dependemos del valor de uno o varios índices para
poder leer un registro.

 KEY IS. Se debe indicar el campo que utilizamos como


índice para la consulta.
 INVALID KEY. Ejecuta las instrucciones expuestas aquí
cuando la clave no es válida.

WRITE.

WRITE registro FROM variable


INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-WRITE

 FROM. Esto sirve para realizar una copia en una


variable del registro que vayamos almacenar en el fichero.
 INVALID KEY. Ocurre cuando se produce un error al
grabar el registro en el fichero.
 NOT INVALID KEY. Realiza las instrucciones que aquí
se exponen cuando no ocurre error alguno al grabar los
datos en el archivo.

REWRITE.

REWRITE registro FROM variable


INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-REWRITE

 FROM. Esto sirve para realizar una copia en una


variable del registro que vayamos almacenar en el fichero.
 INVALID KEY. Ocurre cuando se produce un error al
grabar el registro en el fichero.
 NOT INVALID KEY. Realiza las instrucciones que aquí
se exponen cuando no ocurre error alguno al grabar los
datos en el archivo.

DELETE.

DELETE nombreinternodelfichero
INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-DELETE

 INVALID KEY. Ocurre cuando se produce un error al


grabar el registro en el fichero.
 NOT INVALID KEY. Realiza las instrucciones que aquí
se exponen cuando no ocurre error alguno al grabar los
datos en el archivo. Hay que tener en cuenta que para
usar esta instrucción hay que hacer un READ antes, como
ocurre con la START.

START.

Esta instrucción es esencial en el uso de ficheros indexados con


acceso dinámico cuando queremos hacer lecturas secuenciales.
Vamos a imaginar un archivo con 20.000 registros y sólo
queremos visualizar a partir del registro 8000. Si lo
hiciéramos de la forma que sabemos hasta ahora, pasaríamos
por los 7999 registros que se encuentran antes y sería un poco
engorroso y lento. Para esto sirve la START, se posiciona en el
registro que queramos sin pasar por los anteriores para hacer
una lectura más rápida. Vamos a ver como funciona:

START nombreinternodelfichero KEY (expresión) nombredelaclave


INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-START
Expresión. Esto se refiere a las comparaciones lógicas de
campos claves que vayamos a usar en la consulta:

 IS EQUAL TO. Igual a…


 IS =. Igual a..
 IS GREATER THAN. Mayor que.
 IS > Mayor que.
 IS NOT LESS THAN. No es menor que.
 IS NOT < No es menor que.

Cuando utilizamos esta sentencia, éste no lee, sólo coloca el


“cursor” en el registro que le indicamos. Después toca leer el
fichero con la instrucción READ.

Screen section.
La Screen Section es una parte de la estructura de Cobol,
encargado de realizar las ventanas o el interfaz del programa
en cuestión. Vamos a ver como funciona y a ver sus sintaxis.

Nivel
identificador
[ JUSTIFIED RIGHT ]
[ BLANK WHEN ZERO ]
[ OCCURS integer-1 TIMES ]
[ BELL | BEEP ]
[ AUTO | AUTO-SKIP | AUTOTERMINATE ]
[ UNDERLINE ]
[ OVERLINE ]
[ SECURE ]
[ REQUIRED ]
[ FULL ]
[ PROMPT ]
[ REVERSE-VIDEO ]
[ BLANK LINE | SCREEN ]
[ ERASE EOL | EOS ]
SIGN IS
TRAILING
LEADING
[ SEPARATE CHARACTER ]
LINE NUMBER IS [ PLUS ]
integer-2
identifier-2
COLUMN NUMBER IS [ PLUS ]
integer-3
identifier-3
FOREGROUND-COLOR IS
integer-4
identifier-4
[HIGHLIGHT]
[LOWLIGHT]
BACKGROUND-COLOR IS
integer-5
identifier-5
[ BLINK ]
PICTURE IS picture-string
USING identifier-6
FROM
identifier-7
literal-2
TO identifier-8
VALUE IS literal-1

 Nivel. Los niveles números funcionan igual que las


definiciones de las variables en la WORKING.
 Bell|beep. Realiza un tono audible cuando es mostrado
en pantalla.
 Auto|Auto-skip|Autoterminate. Este cláusula lo que
hará es que pasará automáticamente al siguiente campo
una vez que esté llena la variable, sin presionar enter.
 Anderline|Overline. Subrayar.
 Secure. Que al introducir un dato salgan asteriscos.
 Required|Full. Obliga a que el campo no esté en blanco y
deba introducir siempre datos.
 Prompt. Esta cláusula se utiliza para especificar que los
campos que estén vacíos, se guarden un valor que no sea
en blanco para que sea visible.
 Blank Line|Screen. Borra una línea o pantalla. Si
usamos esta cláusula en un elemento principal, afectará a
todos sus niveles.

Posibles valores del Background/Foreground Color.

Background= Color del fondo.


Foreground= Color de la letra.

Valor. Color.

0 negro
1 azul
2 gris
3 cían
4 rojo
5 naranja
6 amarillo
7 blanco

Posibles Valores del Foreground Color.

valor. LOWLIGHT HIGHLIGHT


0 Negro Gris oscuro
1 Azul oscuro / Indigo Azul brillante
2 Gris oscuro Gris brillante
3 Cían oscuro Cían brillante
4 Rojo oscuro Rojo brillante
5 Naranja oscuro Naranja brillante
6 Oro / Marrón Amarillo
7 Verde claro Blanco
 La cláusula Value se utiliza para definir un texto fijo que no
cambiará.
 From. Se utiliza para definir un campo cuyo contenido
proviene de una variable.
 To. Se utiliza para definir un campo de entrada de datos sin
valor inicial, cuyo valor se almacenará en una variable.
 Using. Es la combinación de la cláusula From y To.

Vamos a ver un ejemplo:

identification division.
program-id. Ventanas.
author. Ismael.
environment division.
data division.
working-storage section.
77 opcion pic x value spaces.
77 pausar pic x value spaces.
screen section.
* Pantalla inicial
01 principal.
03 line 05 col 10 VALUE "Prueba de Screen Section".
03 line 07 col 10 VALUE "Dame a una tecla y te la
muestro: ".
03 line 17 col 10 VALUE "> ".
03 pic x using opcion.
* Borra la pantalla.
01 Limpiar-pantalla.
03 blank screen.
procedure division.
Inicio.
* Mostramos la pantalla inicial y aceptamos la variable.
display principal
accept principal
* Limpiamos la pantalla
display limpiar-pantalla
display "Has pulsado la tecla "opcion
display "Pulsa cualquier letra para salir"
accept pausar with auto
stop run.
Ahora la cláusula ACCEPT podemos añadirle más opciones:

ACCEPT variable AT LINE COLUMN/COL


entero entero
variable variable
ACCEPT variable AT entero/variable

Veamos unos ejemplos de como quedaría:

display "mensaje de prueba" at line 05 column 20


display "mensaje de prueba" at line 05 col 20
display "mensaje de prueba" at 0520

Veamos otras opciones:

AUTO | AUTO-SKIP | AUTOTERMINATE


BELL | BEEP
REVERSE-VIDEO
UNDERLINE
OVERLINE
REQUIRED
WITH FULL
PROMPT
SECURE
UPDATE
HIGHLIGHT
LOWLIGHT
BLINK
FOREGROUND-COLOR IS
integer-4
identifier-4
BACKGROUND-COLOR IS
integer-5
identifier-5
SCROLL BY LINE/LINES
UP entero
DOWN variable
 Update. Usando este complemento muestra el contenido
antiguo antes de actualizar la variable. Si introducimos
datos sin esta cláusula, automáticamente se borra de la
pantalla el contenido antiguo.
 Blink. Parpadea.
 Scroll. Esto hace que el contenido de la pantalla pueda
desplazarse hacia arriba y hacia abajo cuando usamos la
rueda del ratón. Si no se especifica nada en LINE, se
asumirá que empezará por la línea 1.

Veamos unos ejemplos:

accept opcion at 1005 with underline


accept opcion at line 10 col 05 with blink

Con el DISPLAY ocurre lo mismo que con el ACCEPT, tiene


exactamente las mismas propiedades y cláusulas.

Tablas.
Una tabla es un conjunto campos contiguos, cuya longitud y
tamaño deben ser iguales, unidos todos bajo un mismo
nombre, de manera que accedemos a ellos de forma individual
a través de uno o varios índices. Vamos a hacer un ejemplo
para verlo mas claro:

Vamos a imaginar un cine, en las que pueden entrar un


máximo de 1000 personas por día. Lo que queremos es que no
cuente el número de personas que han ido al cine cada día de
la semana.
Con lo que sabemos hasta ahora debemos crear 7 variables,
una para cada día de la semana:


77 lunes pic 9(04).
77 martes pic 9(04).
77 miercoles pic 9(04).
77 jueves pic 9(04).
77 viernes pic 9(04).
77 sabado pic 9(04).
77 domingo pic 9(04).

Ahora bastaría con ir almacenando las visitas en cada día de la


semana. Ahora bien, con las tablas nos ahorraríamos estas 7
definiciones y lo almacenaríamos en una sola variable, de
forma que quedaría así:


01 cine.
02 visitas pic 9(04) occurs 7 times.

Ahora sólo nos ha hecho falta declarar una sola variable. Si


quisiéramos cargar o mover datos a la tabla deberíamos
indicar un índice:


move 121 to visitas(1)
move 82 to visitas(2)
move 42 to visitas(3)
move 61 to visitas(4)
move 425 to visitas(5)
move 247 to visitas(6)
move 879 to visitas(7)

Si nos fijamos bien, todas las variables, son de la misma


longitud y del mismo tipo de datos, no puede ser de otra forma
si queremos usar una tabla. Es un pequeño requisito a tener en
cuenta.

Redefines. Este cláusula se utiliza para rellenar la tabla antes


de empezar el programa, es decir, desde la Working. Vamos a
ver un ejemplo:

01 semanas-textos.
02 texto pic x(21) value "lunmarmiejueviesabdom".
01 semanas redefines semanas-textos.
02 dias pic x(03) occurs 7 times.

De esta forma lo que hacemos con la cláusula Redefines, es


cargar la tabla “semanas” con los valores de la variable
“semanas-textos” desde el principio del programa.

En la memoria del ordenador este tipo de tablas quedaría


representada de la siguiente manera.

Cine:

Visitas(1) Visitas(2) Visitas(3) Visitas(4) Visitas(5)


Visitas(6) Visitas(7)

Esto son tablas unidimensionales, pero también lo podemos


hacer de varias dimensiones llamadas matrices:

En el ejemplo del cine, vamos almacenar el género, así


contaremos también si es hombre o mujer:

01 cine.
02 genero occurs 2 times.
03 visitas pic 9(04) occurs 7 times.
Ahora para cargar o mover datos se necesitan dos índices, uno
para la fila y otro para la columna, de manera que quedaría así:

move 125 to visitas(1,1) move 125 to visitas(2,1)


move 125 to visitas(1,2) move 125 to visitas(2,2)
move 125 to visitas(1,3) move 125 to visitas(2,3)
move 125 to visitas(1,4) move 125 to visitas(2,4)
move 125 to visitas(1,5) move 125 to visitas(2,5)
move 125 to visitas(1,6) move 125 to visitas(2,6)
move 125 to visitas(1,7) move 125 to visitas(2,7)

Veamos como se representa en la memoria:

Cine:

Visitas(1,1) Visitas(1,2) Visitas(1,3) Visitas(1,4)


Visitas(1,5) Visitas(1,6) Visitas(1,7) Visitas(2,1)
Visitas(2,2) Visitas(2,3) Visitas(2,4) Visitas(2,5)
Visitas(2,6) Visitas(2,7)

Las tablas se pueden complicar como se quiera, incluso meter


una tabla dentro de otra, ponerlas en ficheros y demás.
Buscando en Internet vi un ejemplo que me pareció bastante
bueno para ver como son las que tienen varias dimensiones:

01 tabla.
02 trabajadores occurs 100 times.
03 nombre pic x(30).
03 nif pic x(10).
03 salario occurs 12 times.
05 bruto pic s9(08).
05 neto pic s9(08).
05 gastos occurs 10 times.
07 gasto pic s9(08).

Vamos a explicar todo este embrollo:


 Tenemos una tabla de trabajadores de 100 elementos,
compuestos cada uno de ellos por el nombre y el nif.
 Al mismo tiempo tenemos 12 salarios, uno por cada mes,
que se compone de un sueldo bruto y un sueldo neto, es
decir, tenemos 12 sueldos netos y 12 brutos por trabajador.
 Y para finalizar cada trabajador tiene 10 tipos de gastos
diferentes.

Vamos a ver como nos podemos referir a cada elemento:

 Para saber el nombre del trabajador número 50: display


nombre (50).
 Para saber el Nif del trabajador 50: display nif(50).
 Para saber el bruto de Mayo del trabajador 50: display
bruto(50, 5).
 Para saber el neto del trabajador 50 del mes de
Noviembre: display neto(50,11).
 Para saber el gasto número 3 del mes de Febrero del
trabajador 50: display gasto(50,2,3).

Ahora las tablas podemos empezar a usarlas con lo que


sabemos hasta ahora, como por ejemplo, los bucles para
buscar elementos, condiciones para
compararlos…etc…etc…etc.
Instalando COBOL

COBOL es un lenguaje de programación que se niega a morir. Por ahí


escuchamos que nunca morirá. Que será eterno. Que muy pronto cobrará
vida y todos le rendiremos pleitesía. ¡Larga vida al Rey! ¡Larga vida al
señor benevolente! Los bancos se niegan a migrar sus robustas
aplicaciones a lenguajes como Java, C#, Python, etc. Consideran que
"están muy chavos y les falta madurez". ¿Realmente Java puede procesar
miles de miles de archivos sin perder nada, sin alterar el status quo o
provocar una catástrofe? ¿Puede Python con todo el paquete? ¿Acaso es
necesario convertir miles de líneas de código Cobol a Java y así
obtendremos mejores resultados? Muchas preguntas y no muchas
respuestas satisfactorias.

COBOL es un lenguaje de programación destinado para la creación de


aplicaciones empresariales donde es necesario procesar grandes
cantidades de datos. Se ha escuchado en el mundo de la programación
que si algo funciona correctamente es mejor "no moverle nada" para que
no tener problemas a futuro. Es probable que muchas empresas se niegan
a ver otras alternativas por temor a que las cosas no salgan como se
esperan. "Si ya funciona, dejale así".

¿Qué tiene COBOL que no tengan otros lenguajes?

 Alta eficiencia en el procesamiento por lotes.


 Orientado a los negocios, ideal para crear aplicaciones para
realizar transacciones bancarias.
 Documentar un programa en COBOL debería ser más fácil.
 Compilado (crea un ejecutable con extensión *.exe)
 Relativamente la curva de aprendizaje no es tan alta como otros
(Java, ahí te hablan).
Instalación:
$ sudo apt-get update
$ sudo apt-get install open-cobol
$ cobc -V

La extensión de un programa COBOL puede ser *.cbl y/o *.cob

Ejemplo: Hola, mundo en Cobol.

Nombre del archivo: prog001.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. PROG001.
AUTHOR ALQUIMISTA.
INSTALLATION. ALQUIMISTA DE CODIGO.
DATE-WRITTEN. 13/04/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

PROCEDURE DIVISION.
DISPLAY '****************************'.
DISPLAY '** PROGRAMANDO EN COBOL **'.
DISPLAY ' '.
DISPLAY ' HOLA, MUNDO!! '.
DISPLAY '****************************'.
STOP RUN.

Compilamos:

$ cobc -x -free *.cbl -o prog001.exe

Ejecutamos:

$ ./prog001.exe
Para programar en COBOL debemos respetar la siguiente estructura:

Estructura COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. PROGRAMA.
AUTHOR AUTOR.
INSTALLATION. EMPRESA.
DATE-WRITTEN. dd/mm/yy.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

DATA DIVISION.
WORKING-STORAGE SECTION.

*> COMENTARIO
PROCEDURE DIVISION.
NOMBRE SECTION.
MAIN.

STOP "PAUSE".
STOP RUN.

Ejemplo. Hola mundo.


prog001.cbl.

IDENTIFICATION DIVISION.
PROGRAM-ID. HOLA-MUNDO.
AUTHOR ALQUIMISTA.
INSTALLATION. ALQUIMISTA.
DATE-WRITTEN. 16/04/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.
DATA DIVISION.
WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
DISPLAY '****************************'.
DISPLAY '** PROGRAMANDO EN COBOL **'.
DISPLAY ' '.
DISPLAY ' HOLA, MUNDO!! '.
DISPLAY '****************************'.
STOP RUN.

Compilar:
$ cobc -x -free prog001.cbl -o prog001.exe

Ejecutar:
$ ./prog001.exe

Cobol es un lenguaje de propósito específico y orientado a negocios. Al


igual que muchos otros lenguajes posee sus propias características y
aspectos únicos.

Imprimir en pantalla.
*> MOSTRAR EN PANTALLA
DISPLAY "HOLA, MUNDO".

Solicitar entrada de datos.


*> SOLICITAR DATOS
DISPLAY "INTRODUCE TU NOMBRE:".
ACCEPT WS-NOMBRE.

*>NOTA: EN COBOL DEBES DEFINIR UNA VARIABLE ANTES


DE USARLA

Ejemplo. Usar EVALUATE ... EVALUATE-END. Es parecido a switch


de Java.

IDENTIFICATION DIVISION.
PROGRAM-ID. EVALUAR.
AUTHOR ALQUIMISTA.
INSTALLATION. ALQUIMISTA.
DATE-WRITTEN. 17/04/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.

PROCEDURE DIVISION.
MOVE 3 TO WS-A.
DISPLAY "INTRODUCE NUMERO:".
ACCEPT WS-A.
EVALUATE TRUE
WHEN WS-A = 3
DISPLAY WS-A" es igual a 3"
WHEN WS-A > 2
DISPLAY WS-A" es mayor que 2"
WHEN WS-A < 0
DISPLAY WS-A"es menor a 0"
WHEN OTHER
DISPLAY "Entrada no valida"
END-EVALUATE.
STOP RUN.

En este ejemplo el usuario introduce un numero entero y de acuerdo a las


opciones se efectúa una instrucción. En caso que el número introducido
no este en el rango de opciones se mostrará un mensaje advirtiendo que
le entra no es válida.
Ejemplo. Uso de COMPUTE para efectuar operaciones aritméticas.

*> SUMA
COMPUTE WS-SUMA = WS-NUM-A + WS-NUM-B.

*> ELEVAR UN NUMERO A UNA POTENCIA


COMPUTE WS-POTENCIA = WS-NUMERO ** 2.

Ejemplo. Calcular grados Fahrenheit y Celsius.


IDENTIFICATION DIVISION.
PROGRAM-ID. PROG0014.
AUTHOR ALQUIMISTA.
INSTALLATION. ALQUIMISTA.
DATE-WRITTEN. 18/04/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VALOR PIC 9(3) VALUE 20.
01 WS-RESULTADO PICTURE 9(3)V99 VALUE 0.0.
01 WS-OPC PIC X(9) VALUE "F".
PROCEDURE DIVISION.
BEGIN.
DISPLAY 'Menu: '.
DISPLAY 'C. CELSIUS F. FAHRENHEIT'.
DISPLAY 'TU OPCION ES 'WS-OPC.

IF WS-OPC = 'C' OR 'c' THEN


COMPUTE WS-RESULTADO = (WS-VALOR - 32) *
0.55.

IF WS-OPC = 'F' OR 'f' THEN


COMPUTE WS-RESULTADO = (WS-VALOR * 1.8) + 32.

DISPLAY 'RESULTADO = 'WS-RESULTADO.

STOP RUN.

Un bloque en Cobol es similar a una función. Un bloque nos ayuda a


dividir nuestro código y hacerlo más legible. Recordemos un poco la
estructura básica de un programa en Cobol.

IDENTIFICATION DIVISION.
PROGRAM-ID. NOMBRE.
AUTHOR AUTOR.
INSTALLATION. ALQUIMISTA.
DATE-WRITTEN. dd/mm/yy.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

*>BLOQUE DE DATOS
DATA DIVISION.
WORKING-STORAGE SECTION.

*> BLOQUE PRINCIPAL


PROCEDURE DIVISION.

STOP RUN.

Recordar también que la extensión de un programa Cobol es *.cbl y/o


*.cob.

¿Cómo podemos crear un bloque en Cobol?

La sintaxis es la siguiente:

BLOQUE.
*> CÓDIGO.

¿Cómo podemos definir una variable y qué tipo está permitido?

*> PARA COLOCAR VARIABLES


DATA DIVISION.
WORKING-STORAGE SECTION.
*> SE PUEDE USAR PIC O PICTURE
*> EJEMPLOS:
*> NÚMERO CON SIGNO, VALUE PARA ASIGNAR UN VALOR
AL INICIO
01 WS-NUMERO PICTURE S9(05)V99 VALUE -33.11.
*> CARACTERES ALFANUMÉRICOS
01 WS-NOMBRE PIC X(10).
*>...

Ejemplo. Se requiere un programa donde introduciremos datos de un


empleado.

Definimos sus datos: nombre, apellido paterno, apellido materno y


salario.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATOS-TRAB.
02 WS-NOMBRE-TRAB PIC X(50).
02 WS-APELLIDO-PAT PIC X(50).
02 WS-APELLIDO-MAT PIC X(50).
02 WS-SALARIO PIC S9(05)V99.

Definimos un bloque donde solicitaremos esos datos:

DATOS.
DISPLAY "[NOMINA TRABAJADORES]".
DISPLAY "INTRODUCE NOMBRE:".
ACCEPT WS-NOMBRE-TRAB.
DISPLAY "INTRODUCE APELLIDO PATERNO:".
ACCEPT WS-APELLIDO-PAT.
DISPLAY "INTRODUCE APELLIDO MATERNO:".
ACCEPT WS-APELLIDO-MAT.
DISPLAY "INTRODUCE SALARIO:".
ACCEPT WS-SALARIO.

En muchos casos necesitaremos mostrar esos datos respetando el


formato. Para imprimir en mayúsculas empleamos la siguiente función:
FUNCTION UPPER-CASE()

Además podemos asignar ese nuevo valor a una variable ya definida. Así
tendremos:

*> MOVEMOS EL RESULTADO A LA VARIABLE YA


DEFINIDA, AHORRANDO CREAR OTRA NUEVA.
MOVE FUNCTION UPPER-CASE(WS-NOMBRE-TRAB) to WS-
NOMBRE-TRAB.
MOVE FUNCTION UPPER-CASE(WS-APELLIDO-PAT) to WS-
APELLIDO-PAT.
MOVE FUNCTION UPPER-CASE(WS-APELLIDO-MAT) to WS-
APELLIDO-MAT.

Nota:

WS-DATOS-TRAB.
Es la variable que guarda todo los datos introducidos por teclado.

¿Cómo invocamos un bloque?

PERFORM BLOQUE.
Sería entonces:

PROCEDURE DIVISION.
MAIN SECTION.
PERFORM DATOS.
STOP RUN.

Programa completo:

progtrab.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. PROG-TRAB.
AUTHOR ALQUIMISTA.
INSTALLATION. ALQUIMISTA.
DATE-WRITTEN. 26/04/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATOS-TRAB.
02 WS-NOMBRE-TRAB PIC X(50).
02 WS-APELLIDO-PAT PIC X(50).
02 WS-APELLIDO-MAT PIC X(50).
02 WS-SALARIO PIC S9(05)V99.

PROCEDURE DIVISION.
MAIN SECTION.
PERFORM DATOS.
STOP RUN.
DATOS.
DISPLAY "[NOMINA TRABAJADORES]".
DISPLAY "INTRODUCE NOMBRE:".
ACCEPT WS-NOMBRE-TRAB.
DISPLAY "INTRODUCE APELLIDO PATERNO:".
ACCEPT WS-APELLIDO-PAT.
DISPLAY "INTRODUCE APELLIDO MATERNO:".
ACCEPT WS-APELLIDO-MAT.
DISPLAY "INTRODUCE SALARIO:".
ACCEPT WS-SALARIO.
MOVE FUNCTION UPPER-CASE(WS-NOMBRE-TRAB) to
WS-NOMBRE-TRAB.
MOVE FUNCTION UPPER-CASE(WS-APELLIDO-PAT) to
WS-APELLIDO-PAT.
MOVE FUNCTION UPPER-CASE(WS-APELLIDO-MAT) to
WS-APELLIDO-MAT.
DISPLAY WS-DATOS-TRAB.

Compilamos y ejecutamos (desde terminal):

$ cobc -x -free progtrab.cbl -o progtrab.exe

$ ./progtrab.exe

Links:
https://alquimistadecodigo.blogspot.com/2019/04/cobol-en-un-
vistazo.html
https://alquimistadecodigo.blogspot.com/2019/04/cobol-estructura.html
https://alquimistadecodigo.blogspot.com/2019/04/instalando-open-
cobol.html
Is Cobol a dead language?
Muchos consideran que los lenguajes pueden morir, pero quizás se
equivocan. Los lenguajes no mueren si existe alguien que los usa o
sigue usando. Ya sea el vetusto Fortran y/o el lenguaje C e incluso el
BASIC son lenguajes que se siguen usando en la actualidad. No es
sorpresa encontrar ofertas laborales donde solicitan programadores con
conocimiento en Cobol.

Why should you program in Cobol?


Algunas razones podrían ser:

 Las empresas (sobre todo los bancos) se niegan a abandonar sus


aplicaciones.
 Si funciona, ¿por qué debería cambiarlo? (una regla no escrita
dentro de la programación)
 Los programas desarrollados en Cobol son eficientes para cálculos
matemáticos y el procesamiento de grandes cantidades de datos e
información, superando a Java y Python.
 Crear aplicaciones en cualquier otro lenguaje moderno (Java, C#,
Kotlin, etc.) que sustituyan a aplicaciones hechas en Cobol no son
factibles o muchos menos costeables (es decir, las empresas no lo
consideran rentables $) y las empresas solicitan gente para su
mantenimiento.
 Es divertido ver a un dinosaurio como compañero de trabajo
(chiste).
 No es necesario tener un mainframe en casa... puedes instalar
GNUCobol.

Are there resources to learn Cobol?


Si la pregunta fuera hecha en los 80's, 90's o principios de los 2000's la
respuesta sería: muy poca. Pero ahora es diferente. Existen miles de
sitios para aprender este lenguaje de programación.

IDENTIFICATION DIVISION.
PROGRAM-ID. ESQUELETO.
AUTHOR ALQUIMISTA.
INSTALLATION. ALQUIMISTA.
DATE-WRITTEN. 06/05/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.
DATA DIVISION.
WORKING-STORAGE SECTION.

*> COMENTARIO
PROCEDURE DIVISION.
DISPLAY 'DEBES BUSCAR...¡BUSCA!'.
STOP RUN.

Links:
https://www.quora.com/Is-Cobol-a-dead-language
¿Qué debemos hacer para aprender COBOL y no morir en el
intento?

Para empezar necesitas:

1. Tener bases de programación (obvio).


2. Conseguir un compilador dependiendo del sistema operativo que
uses (si usas Windows puedes usar Visual Studio e instalar un
compilador; si usas Linux puedes usar Gnu
OpenCOBOL, nosotros usaremos éste último en el blog).
3. Saber qué extensión se usa para crear un programa COBOL (.cb,
cbl, .cb). Nosotros usaremos .cbl
4. Comprender la estructura de un programa COBOL.
5. Conocer las estructuras de control y estructuras de datos en
COBOL.
6. Practicar.

ESTRUCTURA DE UN PROGRAMA (BÁSICO) EN COBOL:

IDENTIFICATION DIVISION.
*> AQUÍ VA INFORMACIÓN DE PROGRAMA Y EL AUTOR

*> DONDE DECLARAMOS LAS VARIABLES


DATA DIVISION.
WORKING-STORAGE SECTION.

*> MAIN DEL PROGRAMA


PROCEDURE DIVISION.
MAIN.

STOP RUN.

Información del programa:


IDENTIFICATION DIVISION.
PROGRAM-ID. MIPROGRAMA.
AUTHOR ALQUIMISTA DE CODIGO.
INSTALLATION. ALQUIMISTA DE CODIGO.
DATE-WRITTEN. 23/06/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

Las variables en COBOL:

*> AQUI DECLARO LAS VARIABLES


DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM-A PICTURE 9(5).
01 WS-NOMBRE PIC X(10).

¿Cómo se asigna valores a una variable?


Desde el STORAGE:

*> DESDE EL STORAGE


DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM-A PICTURE 9(5) VALUE 45.
01 WS-NOMBRE PICTURE X(10) VALUE 'ROMAN'.
Desde de el 'MAIN':

*> MAIN DEL PROGRAMA


PROCEDURE DIVISION.
MAIN.
*> MOVEMOS UN VALOR A UNA VARIABLE
MOVE 20 TO WS-NUM-A.
MOVE 'JUAN' TO WS-NOMBRE.

La hora de hacer un ejercicio.

Requerimiento: Calcular el volumen de un toroide y la área de un


paralelogramo. Para eso usaremos COMPUTE, para realizar las
operaciones necesarias.

Veamos cómo usar COMPUTE:

*> SUMA
COMPUTE WS-RESULTADO = WS-NUM-a + WS-NUM-B.
*> RESTA
COMPUTE WS-RESULTADO = WS-NUM-a - WS-NUM-B.
*> PRODUCTO
COMPUTE WS-RESULTADO = WS-NUM-a + WS-NUM-B.
*> POTENCIACION
COMPUTE WS-RESULTADO = WS-NUM-a ** WS-NUM-B.
*> LONGITUD DE UNA CADENA
COMPUTE WS-LONGITUD = FUNCTION LENGTH(WS-CADENA).

Ahora el código completo:

calculos.cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. MIPROGRAMA.
AUTHOR ALQUIMISTA DE CODIGO.
INSTALLATION. ALQUIMISTA DE CODIGO.
DATE-WRITTEN. 23/06/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM-A PICTURE 9(5).
01 WS-NUM-B PICTURE 9(5).
01 WS-VOLUMEN PICTURE 9(9).
01 WS-AREA PICTURE 9(9).

*> MAIN DEL PROGRAMA


PROCEDURE DIVISION.
MAIN.
MOVE 20 TO WS-NUM-A.
MOVE 40 TO WS-NUM-B.
DISPLAY '*** CALCULOS ***'.
COMPUTE WS-VOLUMEN = 2 * (3.14159 ** 2) * WS-
NUM-B * (WS-NUM-A ** 2)
DISPLAY 'R ='WS-NUM-B', r = 'WS-NUM-A.
DISPLAY 'VOLUMEN DE UN TOROIDE : 'WS-VOLUMEN.
DISPLAY 'b = 'WS-NUM-B', h ='WS-NUM-A.
MOVE 30 TO WS-NUM-A.
MOVE 45 TO WS-NUM-B.
COMPUTE WS-AREA = WS-NUM-B * WS-NUM-A.
DISPLAY 'BASE ='WS-NUM-B', ALTURA = 'WS-NUM-A.
DISPLAY 'AREA DE UN PARALELOGRAMO ='WS-AREA.

STOP RUN.

Si usas OpenCOBOL, compilamos con:

$ cobc -x -free test.cbl -o test.exe

Ejecutamos el programa con:

$ ./test.exe

Vemos en pantalla el resultado:

*** CALCULOS ***


R =00040, r = 00020
VOLUMEN DE UN TOROIDE : 000315826
b = 00040, h =00020
BASE =00045, ALTURA = 00030
AREA DE UN PARALELOGRAMO =000001350

IF-ELSE
Si condición entonces en COBOL. En cualquier lenguaje deprgramación
existen sentencias que se cumplen si cumplen alguna condición
previamente definida. Imaginemos un escenario donde el usuario
introduce un nombre (cadena ó STRING) en el programa.En COBOL,
ACCEPT se usa para introducir datos.

*> INTRODUCIR DATOS CON 'ACCEPT'


DISPLAY 'INTRODUCE NOMBRE:'
ACCEPT WS-NOMBRE

IF WS-NOMBRE EQUAL "ALFIE" THEN


DISPLAY 'HOLA, 'WS-NOMBRE
ELSE
DISPLAY 'BIENVENIDO, 'WS-NOMBRE
END-IF.

Nota: Usamos PICTURE X(10) para definir una variable alfanumérica.

*> STORAGE
DATA DIVISION.
WORKING-STORAGE SECTION.
*> DEFINIR UNA VARIABLE 'STRING'
01 WS-NOMBRE PICTURE X(10).

Programa completo:
condicional.cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST6.
AUTHOR ALQUIMISTA DE CÓDIGO.
INSTALLATION. ALQUIMISTA DE CÓDIGO.
DATE-WRITTEN. 25/06/19.
DATE-COMPILED.
SECURITY. NO ES CONFIDENCIAL.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NOMBRE PICTURE X(10).

*> MAIN DEL PROGRAMA


PROCEDURE DIVISION.
MAIN.
DISPLAY 'INTRODUCE NOMBRE:'
ACCEPT WS-NOMBRE

IF WS-NOMBRE EQUAL "FERNANDO" THEN


DISPLAY 'HOLA, 'WS-NOMBRE
ELSE
DISPLAY 'BIENVENIDO, 'WS-NOMBRE
END-IF.

STOP RUN.