JCL - Traitement conditionnel

Le Job Entry System utilise deux approches pour effectuer un traitement conditionnel dans un JCL. Lorsqu'un travail se termine, un code retour est défini en fonction de l'état de l'exécution. Le code retour peut être un nombre compris entre 0 (exécution réussie) et 4095 (une condition d'erreur différente de zéro). Les valeurs conventionnelles les plus courantes sont:

  • 0 = Normal - tout est OK

  • 4 = Avertissement - erreurs ou problèmes mineurs.

  • 8 = Erreur - erreurs ou problèmes importants.

  • 12 = Erreur grave - erreurs ou problèmes majeurs, les résultats ne doivent pas être fiables.

  • 16 = Erreur de terminal - problèmes très graves, n'utilisez pas les résultats.

L'exécution d'une étape de travail peut être contrôlée en fonction du code retour de la ou des étapes précédentes à l'aide du COND paramètre et IF-THEN-ELSE construct, qui a été expliqué dans ce tutoriel.

Paramètre COND

UNE CONDLe paramètre peut être codé dans l'instruction JOB ou EXEC de JCL. Il s'agit d'un test sur le code retour des étapes de travail précédentes. Si le test est évalué comme vrai, l'exécution de l'étape de travail en cours est ignorée. Le contournement est simplement une omission de l'étape de travail et non une interruption anormale. Il peut y avoir au plus huit conditions combinées dans un seul test.

Syntaxe

Voici la syntaxe de base d'un paramètre JCL COND:

COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or 
COND=ONLY

Voici la description des paramètres utilisés:

  • rc : Ceci est le code retour

  • logical-operator : Cela peut être GT (supérieur à), GE (supérieur ou égal à), EQ (égal à), LT (inférieur à), LE (inférieur ou égal à) ou NE (différent de).

  • stepname : Il s'agit de l'étape du travail dont le code retour est utilisé dans le test.

Les deux dernières conditions (a) COND = EVEN et (b) COND = ONLY, ont été expliquées ci-dessous dans ce tutoriel.

Le COND peut être codé à l'intérieur de l'instruction JOB ou de l'instruction EXEC, et dans les deux cas, il se comporte différemment comme expliqué ci-dessous:

Instruction COND inside JOB

Lorsque COND est codé dans l'instruction JOB, la condition est testée pour chaque étape du travail. Lorsque la condition est vraie à une étape de travail particulière, elle est contournée avec les étapes de travail qui la suivent. Voici un exemple:

//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 dans l'instruction EXEC

Lorsque COND est codé dans l'instruction EXEC d'une étape de travail et trouvé vrai, seule cette étape de travail est contournée et l'exécution se poursuit à partir de l'étape de travail suivante.

//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 = MÊME

Lorsque COND = EVEN est codé, l'étape de travail en cours est exécutée, même si l'une des étapes précédentes se termine anormalement. Si une autre condition RC est codée avec COND = EVEN, alors l'étape de travail s'exécute si aucune des conditions RC n'est vraie.

//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 = UNIQUEMENT

Lorsque COND = ONLY est codé, l'étape de travail en cours est exécutée uniquement lorsque l'une des étapes précédentes se termine anormalement. Si une autre condition RC est codée avec COND = ONLY, alors l'étape de travail s'exécute si aucune des conditions RC n'est vraie et si l'une des étapes de travail précédentes échoue anormalement.

//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.

Construction IF-THEN-ELSE

Une autre approche pour contrôler le traitement du travail consiste à utiliser des constructions IF-THEN-ELSE. Cela donne plus de flexibilité et un moyen convivial de traitement conditionnel.

Syntaxe

Voici la syntaxe de base d'une construction JCL IF-THEN-ELSE:

//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

Voici la description des termes utilisés dans la construction IF-THEN-ELSE ci-dessus:

  • name : Ceci est facultatif et un nom peut comporter de 1 à 8 caractères alphanumériques commençant par l'alphabet, #, $ ou @.

  • Condition : Une condition aura un format: KEYWORD OPERATOR VALUE, où KEYWORDSpeut être RC (code de retour), ABENDCC (code d'achèvement du système ou de l'utilisateur), ABEND, RUN (exécution de l'étape démarrée). UnOPERATOR peut être un opérateur logique (AND (&), OR (|)) ou un opérateur relationnel (<, <=,>,> =, <>).

Exemple

Voici un exemple simple montrant l'utilisation de 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

Essayons d'examiner le programme ci-dessus pour le comprendre un peu plus en détail:

  • Le code retour de STP01 est testé dans IF1. S'il vaut 0, alors STP02 est exécuté. Sinon, le traitement passe à l'instruction IF suivante (IF2).

  • Dans IF2, si STP01 a commencé l'exécution, alors STP03a et STP03b sont exécutés.

  • Dans IF3, si STP03b n'ABEND, alors STP04 est exécuté. Dans ELSE, il n'y a aucune déclaration. Cela s'appelle une instruction NULL ELSE.

  • En IF4, si STP01.RC = 0 et STP02.RC <= 4 sont TRUE, alors STP05 est exécuté.

  • Dans IF5, si l'étape de processus PST1 dans PROC PRC1 dans l'étape de travail STP05 ABEND, alors STP06 est exécuté. Sinon, STP07 est exécuté.

  • Si IF4 est évalué à faux, alors STP05 n'est pas exécuté. Dans ce cas, IF5 ne sont pas testés et les étapes STP06, STP07 ne sont pas exécutées.

Le IF-THEN-ELSE ne sera pas exécuté en cas d'arrêt anormal du travail tel que l'annulation du travail par l'utilisateur, l'expiration du temps du travail ou un ensemble de données est référencé en arrière vers une étape qui est contournée.

Définition des points de contrôle

Vous pouvez définir un jeu de données de point de contrôle dans votre programme JCL en utilisant SYSCKEOV, qui est une instruction DD.

UNE CHKPTest le paramètre codé pour les ensembles de données QSAM multi-volumes dans une instruction DD. Lorsqu'un CHKPT est codé comme CHKPT = EOV, un point de contrôle est écrit dans l'ensemble de données spécifié dans l'instruction SYSCKEOV à la fin de chaque volume de l'ensemble de données multi-volumes d'entrée / sortie.

//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

Dans l'exemple ci-dessus, un point de contrôle est écrit dans l'ensemble de données SAMPLE.CHK à la fin de chaque volume de l'ensemble de données de sortie SAMPLE.OUT.

Redémarrer le traitement

Vous pouvez redémarrer le traitement de l'éther de manière automatisée en utilisant le RD parameter ou manuel en utilisant le RESTART parameter.

RD parameter est codé dans l'instruction JOB ou EXEC et facilite le redémarrage automatisé du JOB / STEP et peut contenir l'une des quatre valeurs: R, RNC, NR ou NC.

  • RD=R autorise les redémarrages automatisés et considère le point de contrôle codé dans le paramètre CHKPT de l'instruction DD.

  • RD=RNC autorise les redémarrages automatisés, mais remplace (ignore) le paramètre CHKPT.

  • RD=NRindique que le travail / l'étape ne peut pas être redémarré automatiquement. Mais lorsqu'il est redémarré manuellement à l'aide du paramètre RESTART, le paramètre CHKPT (le cas échéant) sera pris en compte.

  • RD=NC interdit le redémarrage automatique et le traitement des points de contrôle.

S'il est nécessaire d'effectuer un redémarrage automatique pour des codes de fin anormale spécifiques uniquement, cela peut être spécifié dans le SCHEDxx membre de la bibliothèque IBM System parmlib.

RESTART parameterest codé dans l'instruction JOB ou EXEC et facilite le redémarrage manuel du JOB / STEP après l'échec du travail. RESTART peut être accompagné d'un checkid, qui est le point de contrôle écrit dans l'ensemble de données codé dans l'instruction SYSCKEOV DD. Lorsqu'un checkid est codé, l'instruction SYSCHK DD doit être codée pour référencer l'ensemble de données de point de contrôle après l'instruction JOBLIB (le cas échéant), sinon après l'instruction JOB.

//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

Dans l'exemple ci-dessus, chk5 est le checkid, c'est-à-dire que STP01 est redémarré au point de contrôle5. Veuillez noter qu'une instruction SYSCHK est ajoutée et l'instruction SYSCKEOV est commentée dans le programme précédent expliqué dans la section Définition du point de contrôle.