Curso de Cobol y PowerCobol

¿Cómo funciona el condicional IF en COBOL?

Capítulo 21: Evaluación de tipos de datos y CLASS

En esta ocasión, vas a ver como crear evaluaciones de tipos de datos y lo que son las clases (CLASS) de COBOL, es decir, por ejemplo, que si una variable es de tipo numérico, que se ejecute el IF, en lugar de especificar expresiones con valores como vimos en el capítulo anterior.

Tipo de dato IS NUMERIC

Empecemos con IS NUMERIC. Gracias a esto, podemos crear condiciones en base a que el tipo de dato de una variable sea numérico, sin importar su valor.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Numero1 PIC 99 VALUE 7.

       PROCEDURE DIVISION.

       Condicionales.
       IF Numero1 IS NUMERIC THEN
           DISPLAY "Se ejecuta el IF."
       END-IF.

       STOP RUN.

       END PROGRAM Capitulo21.

Dado que Numero1 contiene un valor numérico, se cumple la condición y se ejecuta el IF.

Se ejecuta el IF.

Esto evalúa el valor de la variable. Por ejemplo, aunque tengamos un número como string en una variable alfanumérica (X) o alfabética (A), nos va a dar true, ya que va a detectar que la variable contiene un valor numérico.

Si el valor contiene números y letras, ya no es numérico, sería alfanumérico y por lo tanto, nos daría false.

01 Numero1 PIC XXXX VALUE "7".

Tipo de dato IS ALPHABETIC

Con IS ALPHABETIC, podemos evaluar los valores alfabéticos, solo letras.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC X(16) VALUE "Esto es un texto".

       PROCEDURE DIVISION.

       Condicionales.
       IF Texto1 IS ALPHABETIC THEN
           DISPLAY "Se ejecuta el IF."
       END-IF.

       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

Ten en cuenta, que en este caso, si tenemos una variable de tipo texto con un valor numérico, aunque esté entre comillas, la condición da false.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC X(16) VALUE "7".

       PROCEDURE DIVISION.

       Condicionales.
       IF Texto1 IS ALPHABETIC THEN
           DISPLAY "Se ejecuta el IF."
       END-IF.

       STOP RUN.

       END PROGRAM Capitulo21.

No se ejecuta nada en la consola.

No me cansaré de repetirlo, COBOL tiene muchas palabras reservadas. Podemos hasta incluso hacer condiciones que evalúen si el texto está en mayúsculas o en minúsculas.

Con ALPHABETIC-UPPER, evaluaremos las mayúsculas:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC A(1) VALUE "Q".

       PROCEDURE DIVISION.

       Condicionales.
       IF Texto1 IS ALPHABETIC-UPPER THEN
           DISPLAY "Se ejecuta el IF."
       END-IF.

       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

Con ALPHABETIC-LOWER, evaluaremos las minúsculas:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC A(1) VALUE "q".

       PROCEDURE DIVISION.

       Condicionales.
       IF Texto1 IS ALPHABETIC-LOWER THEN
           DISPLAY "Se ejecuta el IF."
       END-IF.

       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

Todas las evaluaciones que acabas de aprender, las puedes utilizar con el operador de negación NOT con el fin de expresar todo lo contrario.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Numero1 PIC 99 VALUE 10.

       PROCEDURE DIVISION.

       Condicionales.
       IF Numero1 IS NOT ALPHABETIC THEN
           DISPLAY "Se ejecuta el IF."
       END-IF.

       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

También se puede utilizar el NOT con los operadores vistos en el capítulo anterior. Por ejemplo:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Numero1 PIC 99 VALUE 10.

       PROCEDURE DIVISION.

       Condicionales.
       IF Numero1 IS NOT > 15 THEN
           DISPLAY "Se ejecuta el IF."
       END-IF.

       STOP RUN.

       END PROGRAM Capitulo21.

Puesto que Numero1 no es mayor que 15, se cumple la condición y se ejecuta el condicional.

Se ejecuta el IF.

El uso de clases con CLASS de COBOL

Esto no acaba aquí, COBOL es una locura y nos da la genial posibilidad de declarar nuestros propios tipos de clases en SPECIAL-NAMES de la ENVIRONMENT DIVISION.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS A-G IS "A" THRU "G".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Numero1 PIC 99 VALUE 10.

       PROCEDURE DIVISION.
       Condicionales.
       IF Numero1 IS A-G THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.

La condición da false y no se ejecuta nada, puesto que el valor 10, no entra en el rango del SPECIAL-NAMES que he escrito (A-G).

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS A-G IS "A" THRU "G".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC A VALUE "C".

       PROCEDURE DIVISION.
       Condicionales.
       IF Texto1 IS A-G THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.

Esta vez si que se ejecuta, ya que el carácter C, entra en el rango que he creado y le he pasado como condición.

Se ejecuta el IF.

Aunque pongamos más de un carácter, mientras todos estén en el rango, va a dar true.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS A-G IS "A" THRU "G".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC AAAA VALUE "ABCD".

       PROCEDURE DIVISION.
       Condicionales.
       IF Texto1 IS A-G THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

COBOL en cuanto a los strings, si que es case sensitive, por lo que esto, hará que la condición anterior se torne false, solo por contener caracteres en minúsculas, ya que el rango establecido, es todo en mayúsculas.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS A-G IS "A" THRU "G".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC AAAA VALUE "aBCd".

       PROCEDURE DIVISION.
       Condicionales.
       IF Texto1 IS A-G THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.

No se ejecuta nada.

Solo hay que ajustar el rango y contemplar las mayúsculas y minúsculas.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS A-G IS "A" THRU "G", "a" THRU "g".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC AAAA VALUE "aBCd".

       PROCEDURE DIVISION.
       Condicionales.
       IF Texto1 IS A-G THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

Por cierto, estas CLASS de COBOL, no tienen nada que ver con las clases de la programación orientada a objetos.

Evaluar espacios en blanco con IF en COBOL

Podemos crear CLASS para todo, por ejemplo, creemos otra para los espacios.

CLASS ESPACIO IS SPACE.

Evaluar valores binarios en COBOL

¿Se te ocurre una CLASS que contemple valores binarios (0s y 1s)?

Es tan fácil como ponerle un rango del 0 al 1.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS BINARIO IS ZERO THRU "1".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC XXXX VALUE "0101".

       PROCEDURE DIVISION.
       Condicionales.
       IF Texto1 IS BINARIO THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

El valor de ZERO lo puedes sustituir por "0", es lo mismo.

Evaluar valores octales en COBOL

¿Y una CLASS para los números octales (0-7)?

Pues un rango del 0 al 7. Así de fácil.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS OCTALES IS ZERO THRU "7".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC XXXX VALUE "4573".

       PROCEDURE DIVISION.
       Condicionales.
       IF Texto1 IS OCTALES THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

Evaluar valores hexadecimales en COBOL

Una CLASS para los números hexadecimales (0-9 y a-f), es un poco más complicada, pero no mucho.

Se trata solo de hacer un rango de los números y las letras de la a a la f contemplando mayúsculas y minúsculas. Puedes ir añadiendo reglas a una CLASS, tantas como quieras y separadas por comas.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo21.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       CLASS HEXADECIMALES IS
           ZERO THRU "9", 
		   "a" THRU "f", 
		   "A" THRU "F".
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 Texto1 PIC XXXXX VALUE "aF679".

       PROCEDURE DIVISION.
       Condicionales.
       IF Texto1 IS HEXADECIMALES THEN
       DISPLAY "Se ejecuta el IF."
       STOP RUN.

       END PROGRAM Capitulo21.
Se ejecuta el IF.

Puedes hacer tantas clases como necesites y se te ocurran. Solo ponle imaginación.


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.