Para condicionar la ejecución de un paso de un JCL al resultado de los pasos anteriores tenemos dos opciones:
- La estructura IF/THEN/ELSE/ENDIF
- El parámetro COND
En este artículo vamos a analizar la primera de ellas, que es la más sencilla y la recomendada por IBM en su manual oficial. Su sintaxis es la siguiente:
//IF (expresión relacional) THEN
//Paso/s a ejecutar si la expresión es verdadera
//ELSE
//Paso/s a ejecutar si la expresión es falsa
// ENDIF
Podemos ver que consta de
- Una expresión relacional en la que podemos usar los operadores &(AND), | (OR) y ¬ (NOT), >, <, >=, <= y =.
- Una serie de pasos a ejecutar si la expresión se evalúa a true (verdadero)
- Una serie de pasos a ejecutar si la expresión se evalúa a false (falso)
La forma de codificar la expresión condicional determina cómo se evalúa la expresión condicional:
- Evaluación a nivel de job:si no incluimos un nombre de paso, la expresión se evaluará para a todos los pasos anteriores del job.
- Evaluación a nivel de paso:si incluimos un nombre de paso, la expresión se evaluará sólo para el paso indicado.
En caso de que algún paso del job termine anormalmente, lo habitual es que el sistema no ejecute los restantes pasos y finalice la ejecución del job. Sin embargo, la estructura IF/THEN/ELSE/ENDIF nos permite ejecutar un paso incluso cuando alguno de los pasos anteriores haya abendado.
El control de abends se puede hacer de dos formas:
- Comprobando si se ha producido un abend (cualquiera): IF (ABEND)
- Comprobando si se ha producido un código de abend concreto: Por ejemplo, IF (ABENDCC=S0C4) para detectar un S0C4.
Vamos a ver varios ejemplos de utilización de la estructura:
1) Ejecutar PASO2 sólo si el código de retorno de PASO1 es 5. Si no, saltar PASO2 y ejecutar directamente PASO3.
//PASO1 EXEC PGM=PROGRAMA1
//*-----------------------------------------
// IF (PASO1.RC=05) THEN
//*-----------------------------------------
//PASO2 EXEC PGM=PROGRAMA2
//*-----------------------------------------
// ELSE
//*-----------------------------------------
//PASO3 EXEC PGM=PROGRAMA3
//*-----------------------------------------
// ENDIF
2) Ejecutar el paso CONTERR sólo si el código de retorno de alguno de los pasos anteriores es mayor que 4. En caso contrario, continuar directamente al paso SIGUIENTE.
//*-----------------------------------------
// IF (RC > 4) THEN
//*-----------------------------------------
//CONTERR EXEC PGM=ERRORES
//*-----------------------------------------
// ELSE
//*-----------------------------------------
//SIGUIENTE EXEC …
//*-----------------------------------------
// ENDIF
3) Ejecutar el paso RETESP sólo si el retorno del paso 1 es mayor que 20 o el del paso 2 es igual a 10. Si no, continuar directamente al paso SIGUIENTE.
//*-------------------------------------------
// IF (PASO1.RC > 20 | PAS02.RC = 10) THEN
//*-------------------------------------------
//RETESP EXEC PGM=ERRORES
//*-------------------------------------------
// ENDIF
//*-------------------------------------------
//SIGUIENTE EXEC …
4) Ejecutar PASOABE si se ha producido un abend en alguno de los pasos anteriores.
//*-------------------------------------------
// IF (ABEND)
//*-------------------------------------------
//PASOABE EXEC PGM=RUTERR
//*-------------------------------------------
// ENDIF
5) Ejecutar PASOABE si se ha producido un abend S0C4 en PASO3.
//*-------------------------------------------
// IF (PASO3.ABENDCC=S0C4)
//*-------------------------------------------
//PASOABE EXEC PGM=RUTERR
//*-------------------------------------------
// ENDIF
hola, esto no está al revés?
3) Ejecutar el paso RETESP sólo si el retorno del paso 1 es mayor que 10 o el del paso 2 es igual a 20. Si no, continuar directamente al paso SIGUIENTE.
//*——————————————-
// IF (PASO1.RC > 20 | PAS02.RC = 10) THEN
//*——————————————-
saludos y gracias por compartir la información.
Gracias por detectar la errata; ya está corregida.