viernes, 5 de noviembre de 2021

COBOL - utilizar un switch

En Cobol solemos utilizar un switch para saber si estamos ante una determinada situación o ante otra.

Empecemos, por ejemplo, por los ficheros. Tenemos un programa que usa dos ficheros: uno de entrada y otro de salida. Dichos ficheros serán FENTRADA y FSALIDA.

Para esos ficheros podremos definir los siguientes switches:

     01 SWITCHES.
          05 FS-FENTRADA        PIC X(02) VALUE ZEROES.
               10 FENTRADA-OK                 VALUE '00'.
               10 FENTRADA-FIN                VALUE '10'.
          05 SW-FIN-FENTRADA PIC X(01).
               10 SI-FIN-FENTRADA            VALUE 'S'.
               10 NO-FIN-FENTRADA           VALUE 'N'.
          05 FS-FSALIDA           PIC X(02) VALUE ZEROES.
               10 FSALIDA-OK                     VALUE '00'.
               10 FSALIDA-FIN                    VALUE '10'.


Cuando definamos los ficheros FENTRADA y FSALIDA en el FILE-CONTROL del área INPUT-OUTPUT SECTION indicaremos lo siguiente con respecto al file status de los ficheros:

     FILE STATUS IS FS-FENTRADA.
     FILE STATUS IS FS-FSALIDA.

Pues bien, vayamos al meollo del asunto. ¿Cómo podemos utilizar estos switch? En el caso del fichero de entrada, cuando abramos dicho fichero (OPEN INPUT FENTRADA) podemos controlar el file status devuelto:

     IF FENTRADA-OK
         <<fichero abierto>>
     ELSE
         <<error lógico>>
     END-IF.

Cuando se lea de dicho fichero (READ FENTRADA INTO COPY) también podemos controlar el file status:

     SET NO-FIN-FENTRADA TO TRUE
*-------------------------------------------------------
     IF FENTRADA-OK
         <<lectura correcta>>
     ELSE
         IF FENTRADA-FIN
             SET SI-FIN-FENTRADA TO TRUE
         ELSE
             <<error lógico>>
         END-IF
     END-IF.

Tras la lectura del fichero de entrada podemos hacer una cosa u otra en función de si se ha llegado o no al final del mismo:

     IF SI-FIN-FENTRADA
         <<se ha llegado al final de FENTRADA, se hará lo que corresponda>>
     ELSE
         <<no se ha llegado al final de FENTRADA, se hará lo que corresponda>>
     END-IF.

Continuamos con otros ejemplo de switch. Sobretodo uno que resulta muy interesante para hacer las condiciones de los IF más sencillas. Veamos el siguiente IF:

     IF (campo = 2 or 4 or 6 or 8 or 10)
         DISPLAY 'ES PAR.'
     ELSE
         DISPLAY 'ES IMPAR.'
     END-IF.

Si declaramos un switch como el siguiente:


     01 SWITCHES.
          05 SW-PAR-O-IMPAR       PIC 9(02).
               10 ES-PAR                 VALUE 2,4,6,8,10.
               10 ES-IMPAR              VALUE 1,3,5,7,9.

Y si se realiza un MOVE como este otro:

     MOVE campo TO SW-PAR-O-IMPAR

La condición del IF anterior quedará tan sencilla como la que viene a continuación:

     IF ES-PAR
         DISPLAY 'ES PAR.'
     ELSE
         DISPLAY 'ES IMPAR.'
     END-IF.

Pues esto es todo lo que puedo contar sobre el fascinante mundo de los switches. Espero que os resulte de utilidad.