
¿Qué son las listas de nivel 88 de COBOL?
Capítulo 34: Listas de nivel 88
Vamos a utilizar el nivel 88
con unos ejemplos nuevos.
Los IF con nombres de condición
Gracias al nivel 88
de COBOL, podemos crear grupos de condiciones con el fin de mejorar el entendimiento y escritura de algunos condicionales.
Metalenguaje de nivel 88
En las variables de nombres de condición, hay que seguir el siguiente metalenguaje:

Empezamos con el número de nivel 88
. Seguimos con el nombre de la condición. Le damos un valor y especificamos o bien un solo valor literal de tipo numérico o alfanumérico o un valor mínimo numérico o alfanumérico para crear un rango. Utilizaremos el verbo THRU
o THROUGH
para indicar hasta donde llega el rango con otro valor del mismo tipo.
Los verbos THRU
o THROUGH
, los podemos traducir al español como "a través de" o "hasta". Tiene sentido, es como decirle a COBOL créame un rango que vaya del 0 hasta el 9.
En el siguiente ejemplo, vamos a crear algo parecido a un switch o un if else. Vamos a anidar 6 IF
en uno principal para contemplar posible código según el día de la semana que introduzca el usuario.
Fíjate bien en la indentación. Empezamos en la primera columna donde se escribe el código con un IF
y un ELSE
. El ELSE
es el camino alternativo que se va a tomar si el día introducido no es 1 o Lunes. El código es otro IF
anidado que contempla que el día de la semana sea martes. En caso de que no sea ni lunes ni martes, se va al siguiente y se busca a ver si el día es miércoles. Así hasta llegar al domingo. Si la evaluación concluye en que no es ninguno de los 7 días, se ejecuta el último ELSE
que contempla cualquier carácter que no sea del rango 1-7. Es decir, que sea igual a 8 o mayor o también 0 o inferior.
Mucho cuidado con los cierres del IF
. Hazlo fácil. Respeta la indentación y el último te quedará siempre en la columna 8. Además, 7 IF
que se abren, 7 que se cierran.
IDENTIFICATION DIVISION.
PROGRAM-ID. Capitulo34.
ENVIRONMENT DIVISION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 DiaSemana PIC 9 VALUE ZERO.
88 Lunes VALUE 1.
88 Martes VALUE 2.
88 Miercoles VALUE 3.
88 Jueves VALUE 4.
88 Viernes VALUE 5.
88 Sabado VALUE 6.
88 Domingo VALUE 7.
PROCEDURE DIVISION.
SeleccionaDia.
DISPLAY "¿Qué día de la semana estamos? (1-7)".
ACCEPT DiaSemana.
IF Lunes THEN
DISPLAY "Te espera una semana dura."
ELSE
IF Martes THEN
DISPLAY "Un día menos para el fin de semana."
ELSE
IF Miercoles THEN
DISPLAY "El día intermedio."
ELSE
IF Jueves THEN
DISPLAY "¿Qué es eso? Se acerca el fin de "-
"semana."
ELSE
IF Viernes THEN
DISPLAY "¡Llegó el viernes!"
ELSE
IF Sabado THEN
DISPLAY "El mejor día de mi vida."
ELSE
IF Domingo THEN
DISPLAY "Sabes que viene después de"-
" esto ¿Verdad?"
ELSE
DISPLAY " Hasta lo"-
"que yo sé, ese día no"-
" existe."
END-IF
END-IF
END-IF
END-IF
END-IF
END-IF
END-IF
STOP RUN.
END PROGRAM Capitulo34.
Se le pregunta al usuario el día de la semana. Se espera que ponga un número del 1 al 7. Si es así, muestra una frase para cada día de la semana. EN caso de que introduzca otra cosa, tiene un mensaje alternativo.
¿Qué día de la semana estamos? (1-7)
Veamos otro ejemplo. Esta vez, vamos a programar un sistema muy simple capaz de detectar si un carácter introducido por el usuario, es una letra o un número.
Gracia a THRU
podemos hacer que se recorra todo el abecedario, para no tener que escribir 88 Letras VALUE "A","B","C","D"..."Y""Z"
. Sería una locura, ¿verdad?
Lo mismo hacemos con los números.
El programa está diseñado para contemplar una letra de la A a la Z y los números del 0 al 9. Un solo carácter.
¿Qué pasa si se introduce un valor de más de un carácter? Te avisa con el último ELSE
. Lo mismo si le pones, por ejemplo, un guion o un símbolo cualquiera.
IDENTIFICATION DIVISION.
PROGRAM-ID. Capitulo34.
ENVIRONMENT DIVISION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 LetrasYNumeros PIC X VALUE ZERO.
88 Letras VALUES "A" THRU "Z".
88 Numeros VALUES 0 THRU 9.
PROCEDURE DIVISION.
IntroduceCaracter.
DISPLAY "Introduce una letra o un número y te digo de que tipo"-
" es".
ACCEPT LetrasYNumeros.
IF Letras THEN
DISPLAY "Has introducido una letra."
ELSE
IF Numeros THEN
DISPLAY "Has introducido un número."
ELSE
DISPLAY "No me han programado para saber que es esto."
END-IF
END-IF
STOP RUN.
END PROGRAM Capitulo34.
Introduce una letra o un número y te digo de que tipo es
Q
Has introducido una letra.
Introduce una letra o un número y te digo de que tipo es
7
Has introducido un número.
Introduce una letra o un número y te digo de que tipo es
$
No me han programado para saber que es esto.
Con este último resultado, sabemos que nuestro pequeño programa, es íntegro y no acepta sobornos.

Crear listas en COBOL
Podemos utilizar el nivel 88
para generar listas en COBOL. Algo parecido a un array, pero que no es un array.
Para crear una lista, solo tienes que especificar datos separados con comas. Ten en cuenta que el PICTURE
especificado en el nivel 01
debe tener tamaño suficiente para albergar al elemento más largo de la lista si queremos utilizarlo en un ACCEPT
. Por ejemplo. Supón que en el siguiente código, le dejo un valor de 5 al PICTURE
. Cuando el usuario introduzca por ejemplo, amarillo, lo que se guarda en el programa es "amari", de esta forma, lee los elementos en la lista y al no encontrar nada coincidente, salta el último ELSE
.
IDENTIFICATION DIVISION.
PROGRAM-ID. Capitulo34.
ENVIRONMENT DIVISION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 Colores PIC x(8) VALUE ZERO.
88 Primarios VALUES "rojo", "amarillo", "azul".
88 Secundarios VALUES "naranja", "verde", "violeta".
PROCEDURE DIVISION.
SeleccionaColor.
DISPLAY "Introduce un color y te digo de que tipo es.".
ACCEPT Colores.
IF Primarios THEN
DISPLAY "Ese color es primario."
ELSE
IF Secundarios THEN
DISPLAY "Ese color es secundario."
ELSE
DISPLAY "No tengo almacenado ese color."
END-IF
END-IF
STOP RUN.
END PROGRAM Capitulo34.
Probemos un par de colores. Si el valor introducido es rojo...
Introduce un color y te digo de que tipo es.
rojo
Ese color es primario.
Si el valor introducido es violeta...
Introduce un color y te digo de que tipo es.
violeta
Ese color es secundario.
Si el valor introducido es cualquier cosa que no esté en las listas...
Introduce un color y te digo de que tipo es.
azul celeste
No tengo almacenado ese color.
Veamos un último ejemplo con listas y relaciones entre ellas.
Realmente, para el siguiente programa, las listas no tienen ningún tipo de relación entre los diferentes niveles 88
. La relación se la vamos a dar en algún IF
.
Los elementos los puedes separar con comas o sin ellas.
Lo que he escrito aquí es una lista llamada PaisesAsiaticos
con cuatro países asiáticos.
Aparte, tengo listas con los continentes y unos cuantos países de ejemplo.
La comparación que se hace en el código, es que si el país que se introduce es asiático y a la vez está en la lista PaisesAsiaticos
, que se ejecute el código del primer IF
.
Si el país es asiático pero no está en la lista PaisesAsiaticos
, entonces, se ejecuta el segundo IF
.
Si el país no es ninguno de esas dos listas, entonces, se ejecuta el último ELSE
.
Creo que es culpa de OpenCobolIDE, que en algunas líneas de listas que se acercan a la última columna, pero que no la sobrepasan, como en la imagen de abajo, da el siguiente error: syntax error, unexpected Identifier, expecting . (error de sintaxis, identificador inesperado, esperando un punto.).

IDENTIFICATION DIVISION.
PROGRAM-ID. Capitulo34.
ENVIRONMENT DIVISION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 Mundo PIC X(20).
88 PaisesAsiaticos VALUE "Bután" "Irán" "China" "Japón".
88 Africa VALUES "Egipto" "Etiopía" "Libia" "Marruecos"
"Nigeria" "República del Congo" "Senegal".
88 America VALUES "Argentina" "México" "Colombia" "Perú"
"República Dominicana" "Venezuela" "Chile".
88 Asia VALUES "Bután" "Malasia" "Irán" "China" "Japón"
"Turquía" "Mongolia".
88 Europa VALUES "Francia" "Italia" "España" "Suiza"
"Andorra" "Dinamarca" "Portugal".
88 Oceania VALUES "Australia" "Nueva Zelanda" "Samoa"
"Micronesia" "Tuvalu" "Palaos".
PROCEDURE DIVISION.
SeleccionaPais.
DISPLAY "Introduce un país y te digo si está en la lista.".
ACCEPT Mundo.
IF PaisesAsiaticos AND Asia THEN
DISPLAY "El país asiático está en la lista."
ELSE
IF Asia THEN
DISPLAY "El país es asiático, pero no está en la "-
"lista de países especificados."
ELSE
DISPLAY "El país no es asiático."
END-IF
END-IF
STOP RUN.
END PROGRAM Capitulo34.
Lo mismo pero con la sintaxis de comas para separar los elementos.
WORKING-STORAGE SECTION.
01 Mundo PIC X(20).
88 PaisesAsiaticos VALUES "Bután", "Irán", "China",
"Japón".
88 Africa VALUES "Egipto", "Etiopía", "Libia",
"Marruecos", "Nigeria", "República del Congo",
"Senegal".
88 America VALUES "Argentina", "México", "Colombia",
"Perú", "República Dominicana", "Venezuela", "Chile".
88 Asia VALUES "Bután", "Malasia", "Irán", "China",
"Japón", "Turquía", "Mongolia".
88 Europa VALUES "Francia", "Italia", "España",
"Suiza", "Andorra", "Dinamarca", "Portugal".
88 Oceania VALUES "Australia", "Nueva Zelanda",
"Samoa", "Micronesia", "Tuvalu", "Palaos".
Normalmente, para que tenga más sentido, se utiliza VALUE para indicar un dato individual en el nivel 88, por ejemplo, 01 DiaSemana PIC 9 VALUE ZERO, mientras que en casos como el ejemplo de los países, es mejor ponerlo en plural (VALUES), ya que son varios.
Japón, es un elemento existente en la lista de PaisesAsiaticos
y que a la vez está en los países de la lista de Asia
.
Introduce un país y te digo si está en la lista.
Japón
El país asiático está en la lista.
Mongolia, es un país que está en la lista de Asia
, pero no está en la lista de PaisesAsiaticos
.
Introduce un país y te digo si está en la lista.
Mongolia
El país es asiático, pero no está en la lista de países especificados.
Cualquier otro país de las otras listas, hará saltar el último ELSE
.
Introduce un país y te digo si está en la lista.
Australia
El país no es asiático.
Comentarios
Si te quedan dudas sobre el temario, sobre Cobol, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.