JCL - Bedingte Verarbeitung
Das Job Entry System verwendet zwei Ansätze, um eine bedingte Verarbeitung in einer JCL durchzuführen. Wenn ein Job abgeschlossen ist, wird basierend auf dem Ausführungsstatus ein Rückkehrcode festgelegt. Der Rückkehrcode kann eine Zahl zwischen 0 (erfolgreiche Ausführung) und 4095 sein (ungleich Null zeigt Fehlerbedingung an). Die gebräuchlichsten konventionellen Werte sind:
0 = Normal - alles in Ordnung
4 = Warnung - kleinere Fehler oder Probleme.
8 = Fehler - signifikante Fehler oder Probleme.
12 = Schwerer Fehler - schwerwiegende Fehler oder Probleme, den Ergebnissen sollte nicht vertraut werden.
16 = Terminalfehler - sehr schwerwiegende Probleme, verwenden Sie die Ergebnisse nicht.
Die Ausführung eines Jobschritts kann basierend auf dem Rückkehrcode der vorherigen Schritte mithilfe von gesteuert werden COND Parameter und IF-THEN-ELSE Konstrukt, das in diesem Tutorial erklärt wurde.
COND-Parameter
EIN CONDParameter können in der JOB- oder EXEC-Anweisung von JCL codiert werden. Es ist ein Test des Rückkehrcodes der vorhergehenden Jobschritte. Wenn der Test als wahr bewertet wird, wird die aktuelle Jobschrittausführung umgangen. Das Umgehen ist nur das Weglassen des Jobschritts und keine abnormale Beendigung. In einem einzigen Test können höchstens acht Bedingungen kombiniert werden.
Syntax
Es folgt die grundlegende Syntax eines JCL COND-Parameters:
COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or
COND=ONLY
Hier ist die Beschreibung der verwendeten Parameter:
rc : Dies ist der Rückkehrcode
logical-operator : Dies kann GT (größer als), GE (größer als oder gleich), EQ (gleich als), LT (kleiner als), LE (kleiner als oder gleich) oder NE (nicht gleich) sein.
stepname : Dies ist der Jobschritt, dessen Rückkehrcode im Test verwendet wird.
Die letzten beiden Bedingungen (a) COND = EVEN und (b) COND = ONLY wurden unten in diesem Tutorial erläutert.
Der COND kann entweder innerhalb der JOB-Anweisung oder der EXEC-Anweisung codiert werden. In beiden Fällen verhält er sich wie unten erläutert unterschiedlich:
COND in der JOB-Anweisung
Wenn COND in der JOB-Anweisung codiert ist, wird die Bedingung für jeden Jobschritt getestet. Wenn die Bedingung für einen bestimmten Jobschritt erfüllt ist, wird sie zusammen mit den darauf folgenden Jobschritten umgangen. Es folgt ein Beispiel:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID,COND=(5,LE)
//*
//STEP10 EXEC PGM=FIRSTP
//* STEP10 executes without any test being performed.
//STEP20 EXEC PGM=SECONDP
//* STEP20 is bypassed, if RC of STEP10 is 5 or above.
//* Say STEP10 ends with RC4 and hence test is false.
//* So STEP20 executes and lets say it ends with RC16.
//STEP30 EXEC PGM=SORT
//* STEP30 is bypassed since 5 <= 16.
COND in der EXEC-Anweisung
Wenn COND in der EXEC-Anweisung eines Jobschritts codiert und als wahr befunden wird, wird nur dieser Jobschritt umgangen und die Ausführung ab dem nächsten Jobschritt fortgesetzt.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.
//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),(10,GT,STP02))
//* In STP03, first condition fails and hence STP03 executes.
//* Since STP02 is bypassed, the condition (10,GT,STP02) in
//* STP03 is not tested.
COND = AUCH
Wenn COND = EVEN codiert ist, wird der aktuelle Jobschritt ausgeführt, auch wenn einer der vorherigen Schritte abnormal beendet wird. Wenn eine andere RC-Bedingung zusammen mit COND = EVEN codiert ist, wird der Jobschritt ausgeführt, wenn keine der RC-Bedingungen erfüllt ist.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.
//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),EVEN)
//* In STP03, condition (10,LT,STP01) evaluates to true,
//* hence the step is bypassed.
COND = NUR
Wenn COND = ONLY codiert ist, wird der aktuelle Jobschritt nur ausgeführt, wenn einer der vorherigen Schritte abnormal beendet wird. Wenn eine andere RC-Bedingung zusammen mit COND = ONLY codiert ist, wird der Jobschritt ausgeführt, wenn keine der RC-Bedingungen erfüllt ist und einer der vorherigen Jobschritte abnormal fehlschlägt.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(4,EQ,STP01)
//* In STP02, condition evaluates to FALSE, step is executed
//* and assume the step abends.
//STP03 EXEC PGM=IEBGENER,COND=((0,EQ,STP01),ONLY)
//* In STP03, though the STP02 abends, the condition
//* (0,EQ,STP01) is met. Hence STP03 is bypassed.
IF-THEN-ELSE Konstrukt
Ein anderer Ansatz zur Steuerung der Jobverarbeitung ist die Verwendung von IF-THEN-ELSE-Konstrukten. Dies bietet mehr Flexibilität und eine benutzerfreundliche Art der bedingten Verarbeitung.
Syntax
Es folgt die grundlegende Syntax eines JCL IF-THEN-ELSE-Konstrukts:
//name IF condition THEN
list of statements //* action to be taken when condition is true
//name ELSE
list of statements //* action to be taken when condition is false
//name ENDIF
Es folgt die Beschreibung der verwendeten Begriffe im obigen IF-THEN-ELSE-Konstrukt:
name : Dies ist optional und ein Name kann 1 bis 8 alphanumerische Zeichen enthalten, beginnend mit Alphabet, #, $ oder @.
Condition : Eine Bedingung hat ein Format: KEYWORD OPERATOR VALUE, wo KEYWORDSkann RC (Rückkehrcode), ABENDCC (System- oder Benutzerabschlusscode), ABEND, RUN (schrittweise gestartete Ausführung) sein. EinOPERATOR kann ein logischer Operator (AND (&), OR (|)) oder ein relationaler Operator (<, <=,>,> =, <>) sein.
Beispiel
Das folgende einfache Beispiel zeigt die Verwendung von IF-THEN-ELSE:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//PRC1 PROC
//PST1 EXEC PGM=SORT
//PST2 EXEC PGM=IEBGENER
// PEND
//STP01 EXEC PGM=SORT
//IF1 IF STP01.RC = 0 THEN
//STP02 EXEC PGM=MYCOBB1,PARM=123
// ENDIF
//IF2 IF STP01.RUN THEN
//STP03a EXEC PGM=IEBGENER
//STP03b EXEC PGM=SORT
// ENDIF
//IF3 IF STP03b.!ABEND THEN
//STP04 EXEC PGM=MYCOBB1,PARM=456
// ELSE
// ENDIF
//IF4 IF (STP01.RC = 0 & STP02.RC <= 4) THEN
//STP05 EXEC PROC=PRC1
// ENDIF
//IF5 IF STP05.PRC1.PST1.ABEND THEN
//STP06 EXEC PGM=MYABD
// ELSE
//STP07 EXEC PGM=SORT
// ENDIF
Versuchen wir, das obige Programm zu untersuchen, um es etwas genauer zu verstehen:
Der Rückkehrcode von STP01 wird in IF1 getestet. Wenn es 0 ist, wird STP02 ausgeführt. Andernfalls geht die Verarbeitung zur nächsten IF-Anweisung (IF2).
Wenn in IF2 die Ausführung von STP01 begonnen hat, werden STP03a und STP03b ausgeführt.
Wenn in IF3 STP03b nicht ABEND ist, wird STP04 ausgeführt. In ELSE gibt es keine Anweisungen. Es wird eine NULL ELSE-Anweisung genannt.
Wenn in IF4 STP01.RC = 0 und STP02.RC <= 4 TRUE sind, wird STP05 ausgeführt.
Wenn in IF5 der Prozessschritt PST1 in PROC PRC1 im Jobschritt STP05 ABEND ist, wird STP06 ausgeführt. Andernfalls wird STP07 ausgeführt.
Wenn IF4 als falsch ausgewertet wird, wird STP05 nicht ausgeführt. In diesem Fall werden IF5 nicht getestet und die Schritte STP06, STP07 werden nicht ausgeführt.
IF-THEN-ELSE wird nicht ausgeführt, wenn der Job abnormal beendet wird, z. B. wenn der Benutzer den Job abbricht, die Jobzeit abläuft oder ein Datensatz rückwärts auf einen Schritt verweist, der umgangen wird.
Checkpoints setzen
Sie können das Checkpoint-Dataset in Ihrem JCL-Programm mithilfe von festlegen SYSCKEOV, Das ist eine DD-Anweisung.
EIN CHKPTist der Parameter, der für mehrvolumige QSAM-Datasets in einer DD-Anweisung codiert ist. Wenn ein CHKPT als CHKPT = EOV codiert ist, wird ein Prüfpunkt in das in der SYSCKEOV-Anweisung angegebene Dataset am Ende jedes Volumes des mehrvolumigen Eingabe- / Ausgabe-Datasets geschrieben.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=MYCOBB
//SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1 DD DSN=SAMPLE.IN,DISP=SHR
//OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
// CHKPT=EOV,LRECL=80,RECFM=FB
Im obigen Beispiel wird ein Prüfpunkt in das Dataset SAMPLE.CHK am Ende jedes Volumes des Ausgabedatensatzes SAMPLE.OUT geschrieben.
Starten Sie die Verarbeitung neu
Sie können die Verarbeitung von Ether mithilfe der automatisierten Methode neu starten RD parameter oder manuell mit dem RESTART parameter.
RD parameter ist in der JOB- oder EXEC-Anweisung codiert und hilft beim automatisierten JOB / STEP-Neustart und kann einen der vier Werte enthalten: R, RNC, NR oder NC.
RD=R Ermöglicht automatisierte Neustarts und berücksichtigt den im Parameter CHKPT der DD-Anweisung codierten Prüfpunkt.
RD=RNC Ermöglicht automatisierte Neustarts, überschreibt jedoch den CHKPT-Parameter (ignoriert ihn).
RD=NRGibt an, dass der Job / Schritt nicht automatisch neu gestartet werden kann. Wenn es jedoch manuell mit dem Parameter RESTART neu gestartet wird, wird der Parameter CHKPT (falls vorhanden) berücksichtigt.
RD=NC verbietet automatisierten Neustart und Checkpoint-Verarbeitung.
Wenn ein automatischer Neustart nur für bestimmte Abbruchcodes erforderlich ist, kann dies im Feld angegeben werden SCHEDxx Mitglied der IBM System Parmlib Library.
RESTART parameterist in der JOB- oder EXEC-Anweisung codiert und hilft beim manuellen Neustart von JOB / STEP nach dem Jobfehler. RESTART kann von einer Check-ID begleitet werden. Dies ist der Checkpoint, der in dem in der DD-Anweisung SYSCKEOV codierten Datensatz geschrieben ist. Wenn eine Check-ID codiert ist, sollte die SYSCHK DD-Anweisung so codiert werden, dass sie auf das Checkpoint-Dataset nach der JOBLIB-Anweisung (falls vorhanden) verweist, andernfalls nach der JOB-Anweisung.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID,RESTART=(STP01,chk5)
//*
//SYSCHK DD DSN=SAMPLE.CHK,DISP=OLD
//STP01 EXEC PGM=MYCOBB
//*SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1 DD DSN=SAMPLE.IN,DISP=SHR
//OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
// CHKPT=EOV,LRECL=80,RECFM=FB
Im obigen Beispiel ist chk5 die Check-ID, dh STP01 wird am Checkpoint 5 neu gestartet. Bitte beachten Sie, dass eine SYSCHK-Anweisung hinzugefügt und die SYSCKEOV-Anweisung im vorherigen Programm auskommentiert wurde, das im Abschnitt Einstellen des Prüfpunkts erläutert wurde.