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.