miércoles, 29 de mayo de 2013

Cobol: imprimir información (1)

Si queremos imprimir información debemos enviar información a impresora (valga la redundancia).

¿Cómo se hace eso desde Cobol? Muy fácil, sólo tenemos que crear un fichero en nuestro programa que haga referencia a la impresora.

Estamos acostumbrados a poner algo como lo siguiente:

     SELECT FENTRADA ASSIGN TO FENTRADA

     La anterior sentencia lo que hace es asignar en nuestro programa cobol el
     nombre FENTRADA al fichero FENTRADA que existe en el jcl que llama a
     nuestro programa.

Pero crear un fichero en nuestro programa que haga referencia a la impresora es tan fácil como lo siguiente:

     SELECT IMPRES ASSIGN TO PRINTER

     FD IMPRES LABEL RECORD OMITTED

     01 REG-IMPRES PIC X(80)

Y luego, sólo que habría que informar la información a imprimir y escribirlo en el fichero.

Esto es muy típico, por ejemplo, cuando nos llega un fichero en entrada con el formato adecuado para ser impreso lo procesamos de manera que cada línea leída se va grabando en el fichero que hace referencia a la impresora que, después de todo, es un fichero de salida.



viernes, 3 de mayo de 2013

Cobol: Perform

La instrucción PERFORM nos permite transferir el control a otro u otros procedimientos (párrafos) o bien realizar una serie de sentencias dentro de ella misma mientras se cumplan las condiciones que le hayamos indicado.

A continuación vamos a ver los diversos formatos de esta instrucción.

Formato 1: Con este formato transferimos el control del programa a un párrafo, cuando éste termine vuelve el control a la instrucción que sigue al PERFORM.

          PERFORM nombre_párrafo

Formato 2: Una extensión del anterior es indicarle que ejecute más de un párrafo, especificando el inicio y el fin.

          PERFORM nombre_párrafo1 THRU nombre_párrafo2

Nota: Los párrafos relativos a  nombre_párrafo1  y a  nombre_párrafo2  pueden ir seguidos, por lo que se ejecutará uno y luego el otro; pero al poner el THRU lo que conseguimos es que el control no se devuelva hasta llegar al párrafo indicado después del THRU. Es decir, entre los párrafos  nombre_párrafo1 y nombre_párrafo2  podrá haber cinco párrafos más y todos ellos se hubieran ejecutado.

Formato 3: Seguimos ampliando las capacidades, ahora conseguimos que el PERFORM se realice tantas veces como se indique en el número o variable que va delante de TIMES.

 PERFORM nombre_párrafo1 [THRU nombre_párrafo2] número-o-variable TIMES

Formato 4: Igual que el anterior formato solo que el número de veces que se ejecute dependerá de una condición y no de un número fijo.

PERFORM nombre_párrafo1 [THRU nombre_párrafo2] número-o-variable UNTIL condición

Formato 5: Ejecutar una serie de sentencias en un bucle utilizando PERFORM y END-PERFORM.

          PERFORM número-o-variable TIMES
                    condiciones
          END-PERFORM

          PERFORM condición TIMES
                    condiciones
          END-PERFORM

Nota: Como veis no puede haber puntos entre el PERFORM y el END-PERFORM puesto que eso haría terminar con error la sentencia. Es decir, en condiciones estarán todas las sentencias a ejecutar, una detrás de o otra y ninguna de ellas lleva punto.


     PERFORM  VARYING variable FROM número-o-variable1 BY número-o-valor2
     UNTIL  condición
          sentencias
     END-PERFORM


La anterior sentencia inicializa la variable indicada en variable con el valor que sigue al FROM, es decir el valor indicado por el número o variable de número-o-variable1, a continuación va incrementado el valor de la variable en la cantidad indicada por el valor de número-o-valor2 que va después del BY y ejecuta las sentencias que van a continuación hasta que se cumple la condición indicada en condición y que suele ser algo del estilo a variable = número-o-valor3.


Formato 6: En primer lugar, hay que aclarar que, por defecto, el contenido del PERFORM se ejecuta después de hacer la comprobación de la condición que precede a UNTIL, pero podemos hacer que ésta se realice antes.

     PERFORM  WITH TEST  [AFTER - BEFORE ] VARYING variable FROM 
     número-o-variable1 BY número-o-valor2 UNTIL condición
          sentencias
     END-PERFORM


Con la opción TEST BEFORE, que es la opción por defecto, se comprueba primero la condición y si se cumple se ejcuta el resto, con lo cual es posible que las sentencias no se ejecuten ninguna vez, si al comenzar ya está rota la condición.

Con la opción TEST AFTER, se ejecutan las sentencias antes de comprobar la condición, con lo cual las sentencias se van a ejecutar al menos en una ocasión, incluso aunque entremos en el PERFORM con la condición rota.