viernes, 19 de febrero de 2016

Jcl: Condiciones de ejecución

En los pasos de los jcl's se puede poner condiciones para que dichos pasos se ejecuten o no se ejecuten. Tal como: COND=(0,NE) o COND=(4,LT)

Comencemos con el siguiente ejemplo de condición: COND=(0,NE)

El tema de las condiciones siempre ha sido mi eterna lucha: ¿qué condición pongo para que se ejecute el siguiente paso? En ocasiones he puesto una condición y no he conseguido que funcionase en la manera que quería. 

Tras poner la correspondiente cara de asombro, he tenido que cambiar la condición hasta que funcionase de la manera correcta. El poner la condición correcta era una cuestión de prueba y error....hasta hoy, día en el que he descubierto lo siguiente: la condición que pongas NO se tiene que cumplir para que el paso en cuestión se ejecute. Fíjate que lo he puesto en rojo porque es la idea principal para poner la condición correcta y, por tanto, el paso en cuestión se ejecute. Vamos a ver una serie de ejemplos en los que se cumpla esta idea.

Imagínate la típica cadena cuyo primer paso es el borrado de ficheros de trabajo o ficheros temporales. Un paso de ese tipo suele terminar con la sentencia SET MAXCC=0. Partiendo de la idea principal, ¿adivinas qué condición habría que poner al siguiente paso para que éste se ejecute?

¿Lo sabes? Tic, tac, tic, tac...va pasando el tiempo...Habría que poner lo siguiente: COND=(0,NE)

Es decir, supongamos que en un jcl hay dos pasos: el PASO1 que es el de borrado, el cual termina con la mencionada sentencia de SET MAXCC=0, y el paso PASO2 cuya condición es COND=(0,NE). ¿Por qué en este caso ponemos dicha condición? Muy sencillo. En el paso PASO1 estamos poniendo la sentencia SET MAXCC=0, lo que supone obligar a dicho paso que termine con código 0. Si queremos que el siguiente paso se ejecute debemos de poner la condición COND=(0,NE), que, si la interpretamos, significa NOT EQUAL 0. Y, ¿0 es distinto de 0? Nooooo, entonces se ejecuta el paso.

Ahora pasamos a otro ejemplo: cuando ejecutamos un paso de descarga de una tabla (También conocido como UNLOAD). Al ejecutarse dicho paso podemos obtener un fichero con datos o un fichero vacío (esto es muy típico cuando la SELECT ejecutada en el paso de descarga tiene cláusula WHERE y en la tabla que se está intentando descargar no existe ninguna fila que cumpla las condiciones del WHERE). Esto supone que podemos obtener dos posibles códigos: 0 si el fichero obtenido en la descarga contiene información o 4 si el fichero de descarga está vacío.

Llegados a este punto tenemos lo siguiente: el paso de UNLOAD puede devolver 0 si se ha descargado información (hemos obtenido un fichero con datos) o 4 si no se ha descargado información (hemos obtenido un fichero vacío). Teniendo en cuenta esto tenemos que preguntarnos con respecto al siguiente paso cuando éste ejecuta, por ejemplo, un programa que recibe en la entrada el fichero (con o sin datos) generado en la descarga de la tabla. Nos lo tenemos que preguntar porque nos puede interesar que sólo se ejecute si el código de retorno del paso de UNLOAD es 0 o que se ejecute indistintamente de que dicho código sea 0 ó 4. Si sólo queremos que se ejecute cuando el código de retorno del paso de UNLOAD sea 0 tenemos que poner la siguiente condición: COND=(0,NE). Imagino que recordarás el por qué (porque 0 no es igual a 0 y la condición no se cumple, como la condición no se cumple entonces se ejecuta el paso). Si queremos que se ejecute indistintamente de que el código de retorno del paso de UNLOAD sea 0 ó 4  tenemos que poner la siguiente condición: COND=(4,GT). GT es Greater Than (mayor que). Dado que ni 0 ni 4 son mayores que 4, no se cumpliría la condición y se ejecutaría el paso en cuestión. Sin embargo, las condiciones usadas en los pasos que se ejecutan a continuación de un paso de descarga tienen una particularidad: son la excepción que confirman la regla. ¿Por qué? Por que a pesar de lo que se acaba de explicar para los pasos ejecutados tras un paso de descarga (usar COND=(0,NE) o COND=(4,GT)) podemos usar también la siguiente condición: COND=(4,LT). Si usamos dicha condición en un paso que se ejecute después de un paso de UNLOAD tenemos que dicho paso se ejecutará con independencia del código devuelto por el paso de descarga. 

Hemos aprendido cuál es la regla general (jamás debes olvidarla) y cómo se aplica en diferentes casos así como las excepciones (que se dan cuando se ha ejecutado un paso de UNLOAD).


No hay comentarios:

Publicar un comentario