lunes, 7 de mayo de 2012

JCL Avanzado I. Incluir condiciones IF THEN

Actualizado: Paso para comprobar si un fichero existe y otro modo de incluir condiciones IF/ELSE.

Os dejo otra pequeña utilidad para que un jcl ejecute un paso o no en función de una condición.
Vamos a aplicar las condiciones para hacer que un jcl ejecute un paso u otro en función de si un fichero tiene datos o está vacío

Lo primero que hacemos es verificar que el fichero tiene datos o no:

//**=======================================================*
//** PASO01 - COMPRUEBA SI EL FICHERO TIENE DATOS O ESTÁ VACIO
//**=======================================================*
//PASO01   EXEC PGM=IDCAMS
//IN       DD DSN=nombre.fichero.prueba1,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  PRINT INFILE(IN) COUNT(1)
  IF MAXCC=12 THEN SET MAXCC=4
/*

Lo segundo es incluir la condición en el paso para que se ejecute en función de éste:


//**=======================================================*
//** PASO02 - REALIZA EL PASO SI SE CUMPLE LA CONDICIÓN    
//**=======================================================*
//PASO02   EXEC SORTD,COND=(4,EQ,PASO01)
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=nombre.fichero.prueba1,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.prueba2,
//            DISP=(,CATLG),
//            SPACE=(CYL,(100,100),RLSE)
//SYSIN    DD *
  SORT FIELDS=COPY

Posibles resultados:

- Si existe y tiene datos --> El primer paso dice que todo es correcto (MAXXCC=0) y se ejecuta el segundo paso.
- Si existe pero está vacío --> El primer paso da un MAXXCC=4 y no se ejecuta el siguiente paso
- Si no existe --> El jcl abenda dando un FLUSH

Si lo que quieres es lo contrario, es decir, que ejecute el paso solo cuando el fichero esté vacío, pon: COND=(0,EQ,PASO01) en vez de COND=(4,EQ,PASO01).

NOTAS:
- Si se quiere aplicar la condición a más pasos posteriores únicamente añadir el COND=(X,EQ,PASO01) en cada paso.
- Ojo con poner correctamente el nombre del paso en el COND=(0,EQ,PASO01). Puede ser cualquier nombre pero debe coincidir con el que hace la validación de fichero vacío.


Otra manera de incluir condiciones IF/ELSE:
Vamos a construir un paso de JOB que comprueba si un fichero existe.
OJO! No estamos comprobando si lleva datos, sólo si existe.

//**=======================================================*
//** PASO01 - COMPRUEBA SI EL FICHERO EXISTE
//**=======================================================*
//PASO01 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
 LISTCAT ENTRIES (nombre.fichero.prueba1) ALL
 IF LASTCC NE 0 THEN DO
    SET MAXCC=4
    END
/*
//**********************************************************
//**CONDICION PARA EJECUTAR EL SIGUIENTE PASO
//**SOLO SI EL FICHERO EXISTE*
//**********************************************************
//CONDIC1 IF (PASO01.RC > 0) THEN
//* NO EJECUTA BLOQUE CONDIC1 PORQUE EL FICHERO NO EXISTE
//CONDIC1 ELSE
//*******************************************************
//** PASO 02 A EJECUTAR. POR EJEMPLO UN SORT:
//*******************************************************
//PASO02 EXEC SORTD
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=nombre.fichero.prueba1,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.prueba2,
//           DISP=(,CATLG),
//           SPACE=(CYL,(100,100),RLSE)
//SYSIN DD *
SORT FIELDS=COPY
/*
//CONDIC1 ENDIF

En primer lugar utilizamos el programa IDCAMS para comprobar si el fichero existe con la instrucción LISTCAT. Si el fichero no existe, el Return Code (RC) será 4.

Lo siguiente que hacemos es crear un paso CONDIC1 con la sentencia IF, donde preguntamos si el RC del PASO01 es mayor que cero. Si es mayor que cero significa que el fichero no existe, por lo que no haremos nada. En otro caso, ejecutamos los siguientes pasos del JOB.

OJO! Todas las partes de un mismo IF deben ir precedidas del mismo nombre de paso. En nuestro ejemplo CONDIC1.
Todo IF debe terminar con un ENDIF.
La sentencia ELSE no es obligatoria.

9 comentarios:

Unknown dijo...

Muy bueno el tutorial :D Realmente es dificil encontrar este tipo de ayuda en internet. Saludos desde Mexico.

Martín Moya dijo...

Excelente tutorial, en serio se agradece este tipo de ayuda y se notan las ganas de ayudar, muchas gracias y felicidades por su blog!!!

Tallian dijo...

Muchas gracias Martín, esa es nuestra intención
: )

alexander maldonado dijo...

Hola buen dia, tengo la siguiente pregunta, y me gustaria que porfavor me colaboraran, que comando puedo utiliar en un jcl para saber el dia de la semana, o como lo puedo hacer

gracias

grace.bn dijo...

HOLA muchas gracias por los tutos eres lo max...
Tengo una consulta soy nueva en esto, es mas no deberia estar
programando esto pero me es necesario...
* COPIA ARCHIVO DE PDS A LIBRARIAN
//********************************************
//STEP01 EXEC PGM=AFOLIBR,PARM='IEX=LIBRADD'
//STEPLIB DD DSN=LIBR.V43.SP05.CAILIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//INDEX DD SYSOUT=*
//LIST DD SYSOUT=*
//MASTER DD DSN=TDESA.MASTER.BOOKS.Y2K,DISP=SHR
//PDS DD DSN=&&DSNPDS,DISP=(OLD,PASS)
//OSJOB DD DUMMY
//SYSIN DD *
-END
//*
************************************************
ese LIBRADD copia un reporte a la direccion Tdesa.master...
el problema es que si este reporte ya existe con el mismo nombre

simplemente no lo copia y sale error...Conoceras alguna forma
de ejecutarlo pero que solo lo reemplaze si existe..Encontre el
comando IEXSTOW pero sale error y no se como usar una condicional
para q 1ero lo borre...help me!

Tallian dijo...

Hola Grace.
Lo que puedes hacer es meter un paso de borrado que se ejecute siempre, pero que aunque no exista el fichero no de error:
//BORRADO EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE nombre.de.tu.fichero
SET MAXCC = 0

Un saludo!

grace.bn dijo...

hola el nombre de mi fichero es TDESA.MASTER.BOOKS.Y2K(tabla) debo ponerlo entre parentesis? y tambien debo poner el DISP e intentado y no puedo aun borrarlo y sigue error, con el codigo que me mandaste.

saludos!

Juan Luis Olivera dijo...
Este comentario ha sido eliminado por el autor.
Diana Gastu dijo...

Hola,

¿alguien sabe si es posible usar SET MAXCC=n en algun utilidad que no sea IDCAMS? Necesito generar un RC = 10 (por ejemplo) en caso de detectar que un fichero está vacío mediante IEBPTPCH.

Muchas gracias.