Curso de Cobol y PowerCobol

¿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:

Metalenguaje del nivel 88

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.

Robot soborno

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.).

Bug OpenCobolIDE
⁠⁠       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.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.