Here is a good example of extensive use of the if/then/else construct in
jcl that I ran across just this week. I can't claim to have originated
it but I surely stole a copy for my personal jcllib.
//STEP0010 EXEC PGM=GIMSMP,REGION=6M
//SMPCSI DD DISP=SHR,DSN=SMPE.Z19.GLOBAL.CSI
//TGTDD DD DSN=SVS.MIRROR.RESZP2.TO.RESZS3.D090624,
// DISP=(NEW,CATLG),
// SPACE=(CYL,(100,50),RLSE),UNIT=SYSDA
//SMPLOG DD SYSOUT=*
//SMPLOGA DD SYSOUT=*
//SMPCNTL DD *
SET BOUNDARY(RESZP2) .
ZONEEXPORT
(RESZP2) /* source ResVol zone */
OUTFILE(TGTDD) NOPURGE.
/*
// IF (STEP0010.RC EQ 0) THEN
//STEP0015 EXEC PGM=GIMSMP,REGION=6M
//SMPCSI DD DISP=SHR,DSN=SMPE.Z19.GLOBAL.CSI
//SMPOUT DD SYSOUT=*
//SMPLOG DD SYSOUT=*
//SMPLOGA DD SYSOUT=*
//SMPCNTL DD *
SET BOUNDARY(RESZS3)
/*
This will generate a non-zero return code if
the zone is not defined. As would be the case
the first time we clone to a new sysres volume
*/
.
/*
//*
//CHKTZONE IF (STEP0015.RC EQ 0) THEN
//*
//* zero return from step0019 means target zone exists, back it
//* up and drop the zone index (purge) from global
//*
//STEP0017 EXEC PGM=GIMSMP,REGION=6M
//SMPCSI DD DISP=SHR,DSN=SMPE.Z19.GLOBAL.CSI
//SMPLOG DD SYSOUT=*
//SMPLOGA DD SYSOUT=*
//TGTDD DD DSN=SVS.MIRROR.RESZS3.BKUP.D090624,DISP=(NEW,CATLG),
// SPACE=(CYL,(100,50),RLSE),UNIT=SYSDA
//SMPCNTL DD *
SET BOUNDARY(RESZS3) .
ZONEEXPORT
(RESZS3) /* new ResVol zone */
OUTFILE(TGTDD) PURGE(INDEX).
/*
//*
//CHKTZONE ELSE
//*
//* Brand New target zone, nothing to back up or purge
//* so set good return code for later checks
//*
//STEP0018 EXEC PGM=IEFBR14
//*
//CHKTZONE ENDIF
//*
// IF ((STEP0017.RUN AND STEP0017.RC=0) OR
// STEP0018.RC = 0) THEN
//STEP0020 EXEC PGM=IEFBR14
// ENDIF
// ENDIF
// IF (STEP0010.RC EQ 0 AND
// STEP0020.RC EQ 0) THEN
//*
//* DELETE AND CLONE SMPE TRACKING PDS DATASETS AND LOGS
//* for the cloned target
//*
//STEP0024 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE SMPE.Z19.RESZS3.SMPLTS
DELETE SMPE.Z19.RESZS3.SMPMTS
DELETE SMPE.Z19.RESZS3.SMPSCDS
DELETE SMPE.Z19.RESZS3.SMPSTS
DELETE SMPE.Z19.RESZS3.SMPTLOG
DELETE SMPE.Z19.RESZS3.SMPTLOGA
SET MAXCC = 0
//STEP0026 EXEC PGM=ADRDSSU
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
COPY DATASET( INCL(SMPE.Z19.RESZP2.SMPTLOG )) -
CONCURRENT NOTIFYCONCURRENT -
CATALOG TOL(ENQF) WAIT(2,30) -
STORCLAS ( SCNONSMS ) OUTDYNAM(OMVSS3) -
RENUNC( (SMPE.Z19.RESZP2.SMPTLOG , -
SMPE.Z19.RESZS3.SMPTLOG ) -
)
// ENDIF
// IF (STEP0010.RC EQ 0 AND
// STEP0020.RC EQ 0 AND
// STEP0026.RC LE 4) THEN
//STEP0030 EXEC PGM=GIMSMP,REGION=6M
//SMPCSI DD DISP=SHR,DSN=SMPE.Z19.GLOBAL.CSI
//SMPCNTL DD *
SET BOUNDARY(GLOBAL).
UCLIN.
ADD GZONE ZINDEX ((RESZS3,SMPE.Z19.RESZS3.CSI,TARGET)) .
ENDUCL.
/*
// ENDIF
// IF (STEP0010.RC EQ 0 AND
// STEP0020.RC EQ 0 AND
// STEP0026.RC LE 4 AND
// STEP0030.RC EQ 0) THEN
//***************************************************************//
//* DEFINE THE ZONE *//
//***************************************************************//
//STEP0040 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE SMPE.Z19.RESZS3.CSI
SET MAXCC = 0
DEFINE CLUSTER(+
NAME(SMPE.Z19.RESZS3.CSI) +
FREESPACE(25,10) +
KEYS(24 0) +
CYLINDERS(2 1) CISZ(4096) +
)
/*
// ENDIF
// IF (STEP0010.RC EQ 0 AND
// STEP0020.RC EQ 0 AND
// STEP0026.RC LE 4 AND
// STEP0030.RC EQ 0 AND
// STEP0040.RC EQ 0) THEN
//***************************************************************//
//* INIT THE ZONE *//
//***************************************************************//
//STEP0050 EXEC PGM=IDCAMS
//SMPZONE DD DISP=SHR,DSN=SMPE.Z19.RESZS3.CSI
//ZPOOL DD DSN=SYS1.MACLIB(GIMZPOOL),DISP=SHR,
// UNIT=SYSDA,VOL=SER=RESZP2
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
REPRO OUTFILE(SMPZONE) INFILE(ZPOOL)
/*
// ENDIF
// IF (STEP0010.RC EQ 0 AND
// STEP0020.RC EQ 0 AND
// STEP0026.RC LE 4 AND
// STEP0030.RC EQ 0 AND
// STEP0040.RC EQ 0 AND
// STEP0050.RC EQ 0) THEN
//STEP0060 EXEC PGM=GIMSMP,REGION=6M
//SMPCSI DD DISP=SHR,DSN=SMPE.Z19.GLOBAL.CSI
//DD1 DD DSN=SVS.MIRROR.RESZP2.TO.RESZS3.D090624,DISP=OLD
//SMPLOG DD DUMMY
//SMPCNTL DD *
SET BOUNDARY(RESZS3) .
ZONEIMPORT (RESZP2) INFILE(DD1) INTO(RESZS3) RELATED(ZOS19D)
OPTIONS(ZOSOPT).
/*
// ENDIF
// IF (STEP0010.RC EQ 0 AND
// STEP0020.RC EQ 0 AND
// STEP0026.RC LE 4 AND
// STEP0030.RC EQ 0 AND
// STEP0040.RC EQ 0 AND
// STEP0050.RC EQ 0 AND
// STEP0060.RC LE 4) THEN
//STEP0070 EXEC PGM=GIMSMP,REGION=6M
//SMPCSI DD DISP=SHR,DSN=SMPE.Z19.GLOBAL.CSI
//SMPLOG DD SYSOUT=*
//SMPLOGA DD SYSOUT=*
//SMPCNTL DD *
SET BOUNDARY(RESZS3) .
ZONEEDIT DDDEF .
IF (VOLUME=RESZP2)
CHANGE VOLUME(RESZP2,RESZS3) .
ENDZONEEDIT.
ZONEEDIT DDDEF .
CHANGE PATH('/Service/RESZP2'*,'/Service/RESZS3'*).
ENDZONEEDIT.
SET BOUNDARY(RESZS3) .
ZONEEDIT DDDEF .
IF (DATASET=SMPE.Z19.RESZP2.SMPTLOG)
CHANGE DATASET(SMPE.Z19.RESZP2.*,SMPE.Z19.RESZS3.*).
ENDZONEEDIT.
/*
// ENDIF
//*
//* abend with 806 to let me know something wasn't kosher
//*
// IF (STEP0010.RC GT 0 OR
// STEP0020.RC GT 0 OR
// STEP0026.RC GT 4 OR
// STEP0030.RC GT 0 OR
// STEP0040.RC GT 0 OR
// STEP0050.RC GT 0 OR
// STEP0060.RC GT 4 OR
// STEP0070.RC GT 0) THEN
//ABEND EXEC PGM=ABEND806
// ENDIF
Ken Klein
Sr. Systems Programmer
Hi Michael,
the IF THEN ELSE construct is useful to check step condition codes. You
can for example decide weather a step should run after a previous one
depending on its result. This is similar to the COND parameter in the
EXEC cards. From my experiences you cannot evaluate JCL symbols. To exec
batch depending on external conditions, I would prefer to set up an
OPC/TWS application from the questioned job steps. Well, under certain
circumstances I found it sufficient to generate the desired JCL with
IEBEDIT and then submit it by IKJEFTxx or just having a small REXX-Exec
as a kind of wrap-around.
Cheers
Michael
Michael Knigge <[email protected]> Gesendet von: IBM
Mainframe Discussion List <[email protected]>
25.06.2009 10:35
Bitte antworten an
IBM Mainframe Discussion List <[email protected]>
An
[email protected]
Kopie
Thema
IF-Statement in JCL
All,
is it possible to control the steps to be executed by a IF-Statement, i.
e. with a variable?
Like this:
// SET SWITCH1=YES
// SET SWITCH2=NO
//*
//* EXECUTE ONLY IF SWITCH1 IS SET TO YES
//IF SWITCH1=YES
//STEP01 EXEC PGM=IEBGENER
//... more stuff
//ENDIF
//*
//* EXECUTE ONLY IF SWITCH2 IS SET TO YES
//IF SWITCH2=YES
//STEP02 EXEC PGM=IEBGENER
//... more stuff
//ENDIF
//*
If I've understood the JCL docs corretly there are only some predefined
variables (like "RC") that can be checked... I wonder if there is a
way...
Thanks....
Bye,
Michael
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html