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:
Muy bueno el tutorial :D Realmente es dificil encontrar este tipo de ayuda en internet. Saludos desde Mexico.
Excelente tutorial, en serio se agradece este tipo de ayuda y se notan las ganas de ayudar, muchas gracias y felicidades por su blog!!!
Muchas gracias Martín, esa es nuestra intención
: )
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
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!
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!
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!
Este comentario ha sido eliminado por el autor.
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.