Desarrollando en Cobol y Natural sobre Plataforma Mainframe

lunes, 26 de octubre de 2015

Comando COMPUTE para Cobol

Como en todos los lenguajes, en Cobol también disponemos de un comando específico que nos permite realizar operaciones matemáticas entre operandos. Eso sí, debido a que nuestro lenguaje no está pensado para su utilización en entornos científicos, en las rutinas que elaboremos sólo podremos incluir operaciones aritméticas sencillas.

Ejecución de operaciones matemáticas en Cobol


Seguro que, en más de una ocasión, os habéis encontrado con una situación en la que el algoritmo de una determinada funcionalidad os ha obligado a implementar alguna operación matemática. Para acometer tareas de este tipo, en lenguaje Cobol disponemos de los comandos ADD, SUBTRACT, MULTIPLY y DIVIDE (sumar, restar, multiplicar y dividir).

Pero, si queremos implementar fórmulas algo más complejas, podemos recurrir al comando COMPUTE. Esta función nos permitiría incluir, en una misma declaración, la ejecución de múltiples operaciones sobre operandos diversos. De este modo, podremos realizar sumas, restas, multiplicaciones y divisiones en la misma sentencia.


Como vemos, se trata de un comando bastante estándar. De hecho, hay varios lenguajes de programación en los que esta función se denomina del mismo modo: COMPUTE. Sin ir más lejos, así ocurre en Natural ADABAS, otro de los lenguajes de los que solemos hablar de vez en cuando en el blog.

¿Cómo se implementa una sentencia COMPUTE?


A continuación vamos a ver un ejemplo de cómo se debería implementar la sentencia COMPUTE dentro de un párrafo de Cobol. Obviamente, el número de combinaciones para esta función es muy elevado pero, para facilitar su explicación, centrémonos en la siguiente fórmula modelo que se compone de 3 operadores y de 8 variables.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 W-PTOS-CALCULADOS           PIC 9(5).

01 W-DISTANCIAS-ABS.                                   
  05 W-REGL-NU-COORDX-DESDE    PIC  9(5)     VALUE ZEROES.
  05 W-REGL-NU-COORDY-DESDE    PIC  9(5)     VALUE ZEROES.
  05 W-PTCO-NU-COORDX-DESDE    PIC  9(5)     VALUE ZEROES.
  05 W-PTCO-NU-COORDY-DESDE    PIC  9(5)     VALUE ZEROES.

  05 W-REGL-NU-COORDX-HASTA    PIC  9(5)     VALUE ZEROES.
  05 W-REGL-NU-COORDY-HASTA    PIC  9(5)     VALUE ZEROES.
  05 W-PTCO-NU-COORDX-HASTA    PIC  9(5)     VALUE ZEROES.
  05 W-PTCO-NU-COORDY-HASTA    PIC  9(5)     VALUE ZEROES.


...

PROCEDURE DIVISION.

COMPUTE  W-PTOS-CALCULADOS  =    
   (W-REGL-NU-COORDX-HASTA -     
    W-REGL-NU-COORDX-DESDE + 1 ) *
   (W-REGL-NU-COORDY-HASTA -     
    W-REGL-NU-COORDY-DESDE + 1 ) *
   (W-PTCO-NU-COORDX-HASTA -     
    W-PTCO-NU-COORDX-DESDE + 1 ) *
   (W-PTCO-NU-COORDY-HASTA -     
    W-PTCO-NU-COORDY-DESDE + 1 ).   


Como se aprecia, en la declaración anterior se están usando 8 variables y 3 operadores aritméticos: suma, resta y multiplicación. De este modo nos evitamos tener que emplear 3 sentencias distintas con los comandos ADD, SUBTRACT y MULTIPLY y, al mismo tiempo, nos ahorramos la definición de algunas variables auxiliares que hubiésemos tenido que utilizar en el caso de no recurrir al comando COMPUTE.


Por lo que respecta a la fórmula en sí misma, entiendo que es muy sencilla y que no hace falta recurrir a ninguna explicación adicional de la misma. Básicamente, se están calculando las diferencias entre varias coordenadas y multiplicando dichas distancias entre sí para obtener un valor denominado "Puntos Calculados" (variable que, una vez visto el ejemplo, ya no tiene interés para nosotros y que se usará posteriormente en el algoritmo del programa Cobol CICS).

Aprendiendo a utilizar el comando COMPUTE


Una vez visto cómo hemos realizado la declaración en nuestro ejemplo, no deberíais tener problemas a la hora de extrapolar su empleo a vuestros propios programas. Se trata de un comando estándar cuya utilización es bastante intuitiva y, según mi experiencia, no suele causar demasiadas dificultades a los programadores principiantes.

Por si acaso, y teniendo en cuenta que un ejemplo práctico vale más que 1.000 palabras de teoría, a continuación paso a incluir algunas sentencias más con posibles usos del comando. A partir de ellos, se pueden elaborar otras 1.000 variantes diferentes, de manera que no vamos a tener problemas para encontrar la opción que encaje con el que requiera nuestro algoritmo.

COMPUTE W-TOTAL-1 = W-OPERANDOS-1 + W-OPERANDOS-2

COMPUTE W-TOTAL-2 = W-OPERANDOR-1 - W-OPERANDOR-2

COMPUTE W-TOTAL-3 = W-OPERANDOM-1 * W-OPERANDOM-2

COMPUTE W-TOTAL-4 = W-OPERANDOD-1 / W-OPERANDOD-2

COMPUTE W-TOTAL-5 = (W-OPERANDOSD-1 + W-OPERANDOSD-2) / (W-OPERANDOSD-3 - W-OPERANDOSD-4)

COMPUTE W-TOTAL-6 = (W-OPERANDODM-1 / W-OPERANDODM-2) * (W-OPERANDODM-3 / W-OPERANDODM-4)

COMPUTE W-TOTAL-7 = (W-OPERANDORD-1 - W-OPERANDORD-2) / W-OPERANDORD-3

COMPUTE W-TOTAL-8 = (W-OPERANDOSM-1 + 1) * (W-OPERANDOSM-2 / W-OPERANDOSM-3) * ((W-OPERANDOSM-4 - W-OPERANDOSM-5) / W-OPERANDOSM-6)

Como vemos, las construcciones con COMPUTE se pueden ir incrementando de dificultad de forma indefinida. Esto nos va a facilitar la incorporación de la complejidad requerida a nuestras fórmulas, siempre y cuando no nos salgamos del catálogo de operaciones aritméticas básicas. En mi propia experiencia, el comando COMPUTE es más que suficiente para implementar la mayoría de las fórmulas requeridas en los algoritmos de los programas Cobol CICS DB2.


En definitiva, tenemos que considerar al COMPUTE como una sentencia de elaboración de fórmulas aritméticas que nos va a permitir ahorrar tiempo y código a la hora de desarrollar. Por un lado, su uso nos permitirá sustituir a los comandos ADD, SUBTRAC, MULTIPLY y DIVIDE; por otro lado, reduciremos el número de variables auxiliares precisadas para operar.

Y eso es todo por hoy. Espero que lo comentado os sirva para resolver todas las dudas que tengáis acerca del comando COMPUTE y que os facilite vuestra labor con el cliente. De todas formas, ya sabéis que podéis dejarme cualquier comentario aquí abajo y os lo responderé lo antes posible...

Saludos.

1 comentario:

  1. Hola, tengo una duda, estoy realizando el COMPUTE con varios campos, pero no me arroja nada con el DISPLAY y la variable, que crees que pueda ser?.
    Te dejo un ejemplo
    COMPUTE SUM-IMP = CNC + CNPR + OTRO + LIBRE + UCD
    MOVE SUM-IMP TO SUM-IMPORTE.

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...