COBOL - Declaraciones condicionales

Las sentencias condicionales se utilizan para cambiar el flujo de ejecución según determinadas condiciones especificadas por el programador. Las declaraciones condicionales siempre se evaluarán como verdaderas o falsas. Las condiciones se utilizan en las declaraciones IF, Evaluate y Perform. Los diferentes tipos de condiciones son los siguientes:

  • Declaración de condición IF
  • Condición de relación
  • Condición de la señal
  • Condición de clase
  • Condición Nombre Condición
  • Condición negada
  • Condición combinada

Declaración de condición IF

La declaración IF comprueba las condiciones. Si una condición es verdadera, se ejecuta el bloque IF; y si la condición es falsa, se ejecuta el bloque ELSE.

END-IFse utiliza para finalizar el bloque IF. Para finalizar el bloque IF, se puede utilizar un punto en lugar de END-IF. Pero siempre es preferible usar END-IF para múltiples bloques IF.

Nested-IF- Bloques IF que aparecen dentro de otro bloque IF. No hay límite para la profundidad de las declaraciones IF anidadas.

Sintaxis

A continuación se muestra la sintaxis de las declaraciones de condición IF:

IF [condition] THEN
   [COBOL statements]
ELSE
   [COBOL statements]
END-IF.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1 WS-NUM3.
   MOVE 15 TO WS-NUM2 WS-NUM4.
   
   IF WS-NUM1 > WS-NUM2 THEN
      DISPLAY 'IN LOOP 1 - IF BLOCK'
      
      IF WS-NUM3 = WS-NUM4 THEN
         DISPLAY 'IN LOOP 2 - IF BLOCK'
      ELSE
         DISPLAY 'IN LOOP 2 - ELSE BLOCK'
      END-IF
      
   ELSE
      DISPLAY 'IN LOOP 1 - ELSE BLOCK'
   END-IF.
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK

Condición de relación

La condición de relación compara dos operandos, cualquiera de los cuales puede ser un identificador, literal o expresión aritmética. La comparación algebraica de campos numéricos se realiza independientemente del tamaño y la cláusula de uso.

For non-numeric operands

Si se comparan dos operandos no numéricos de igual tamaño, los caracteres se comparan desde la izquierda con las posiciones correspondientes hasta que se llega al final. El operando que contiene mayor número de caracteres se declara mayor.

Si se comparan dos operandos no numéricos de tamaño desigual, el elemento de datos más corto se agrega con espacios al final hasta que el tamaño de los operandos se vuelve igual y luego se compara de acuerdo con las reglas mencionadas en el punto anterior.

Sintaxis

A continuación se muestra la sintaxis de las declaraciones de condiciones de relación:

[Data Name/Arithmetic Operation]

   [IS] [NOT] 

[Equal to (=),Greater than (>), Less than (<), 
Greater than or Equal (>=), Less than or equal (<=) ]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1.
   MOVE 15 TO WS-NUM2.
   
   IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
      DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
   ELSE
      DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
   END-IF.
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

WS-NUM1 IS GREATER THAN WS-NUM2

Condición de la señal

La condición de signo se utiliza para verificar el signo de un operando numérico. Determina si un valor numérico dado es mayor, menor o igual que CERO.

Sintaxis

A continuación se muestra la sintaxis de las declaraciones de condición de signos:

[Data Name/Arithmetic Operation] 

   [IS] [NOT] 

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(9) VALUE -1234.
   01 WS-NUM2 PIC S9(9) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   IF WS-NUM1 IS POSITIVE THEN
      DISPLAY 'WS-NUM1 IS POSITIVE'.
      
   IF WS-NUM1 IS NEGATIVE THEN
      DISPLAY 'WS-NUM1 IS NEGATIVE'.
      
   IF WS-NUM1 IS ZERO THEN
      DISPLAY 'WS-NUM1 IS ZERO'.
      
   IF WS-NUM2 IS POSITIVE THEN
      DISPLAY 'WS-NUM2 IS POSITIVE'.

STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

Condición de clase

La condición de clase se usa para verificar si un operando contiene solo alfabetos o datos numéricos. Los espacios se consideran en ALFABÉTICO, ALFABÉTICO-INFERIOR y ALFABÉTICO-SUPERIOR.

Sintaxis

A continuación se muestra la sintaxis de las declaraciones de condición de clase:

[Data Name/Arithmetic Operation>]

   [IS] [NOT] 

[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
   01 WS-NUM2 PIC 9(9) VALUE 123456789.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF WS-NUM1 IS ALPHABETIC THEN
      DISPLAY 'WS-NUM1 IS ALPHABETIC'.
      
   IF WS-NUM1 IS NUMERIC THEN
      DISPLAY 'WS-NUM1 IS NUMERIC'.
      
   IF WS-NUM2 IS NUMERIC THEN
      DISPLAY 'WS-NUM2 IS NUMERIC'.
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

Condición nombre-condición

Un nombre-condición es un nombre definido por el usuario. Contiene un conjunto de valores especificados por el usuario. Se comporta como variables booleanas. Se definen con el nivel número 88. No tendrá cláusula PIC.

Sintaxis

A continuación se muestra la sintaxis de las declaraciones de condiciones definidas por el usuario:

88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM PIC 9(3).
   88 PASS VALUES ARE 041 THRU 100.
   88 FAIL VALUES ARE 000 THRU 40.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 65 TO WS-NUM.
   
   IF PASS 
      DISPLAY 'Passed with ' WS-NUM ' marks'.
      
   IF FAIL 
      DISPLAY 'FAILED with ' WS-NUM 'marks'.
      
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

Passed with 065 marks

Condición negada

La condición negada se da utilizando la palabra clave NOT. Si una condición es verdadera y le hemos dado NOT delante de ella, entonces su valor final será falso.

Sintaxis

A continuación se muestra la sintaxis de las declaraciones de condición negadas:

IF NOT [CONDITION] 
   COBOL Statements
END-IF.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(9) VALUE 25.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
      DISPLAY 'IF-BLOCK'
   ELSE
      DISPLAY 'ELSE-BLOCK'
   END-IF.
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

ELSE-BLOCK

Condición combinada

Una condición combinada contiene dos o más condiciones conectadas mediante operadores lógicos Y u O.

Sintaxis

A continuación se muestra la sintaxis de las declaraciones de condiciones combinadas:

IF [CONDITION] AND [CONDITION]
   COBOL Statements
END-IF.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(2) VALUE 25.
   01 WS-NUM3 PIC 9(2) VALUE 20.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
      DISPLAY 'Both condition OK'
   ELSE
      DISPLAY 'Error'
   END-IF.
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

Both condition OK

Evaluar Verbo

Evaluar verbo es un reemplazo de una serie de instrucciones IF-ELSE. Puede usarse para evaluar más de una condición. Es similar a la instrucción SWITCH en los programas C.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.
   
PROCEDURE DIVISION.
   MOVE 3 TO WS-A.
   
   EVALUATE TRUE
      WHEN WS-A > 2
         DISPLAY 'WS-A GREATER THAN 2'

      WHEN WS-A < 0
         DISPLAY 'WS-A LESS THAN 0'

      WHEN OTHER
         DISPLAY 'INVALID VALUE OF WS-A'
   END-EVALUATE.
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

WS-A GREATER THAN 2