JCL - Koşullu İşleme

İş Giriş Sistemi, bir JCL'de koşullu işleme gerçekleştirmek için iki yaklaşım kullanır. Bir iş tamamlandığında, yürütme durumuna bağlı olarak bir dönüş kodu belirlenir. Dönüş kodu, 0 (başarılı yürütme) ile 4095 arasında bir sayı olabilir (sıfır olmayan hata durumunu gösterir). En yaygın geleneksel değerler şunlardır:

  • 0 = Normal - her şey yolunda

  • 4 = Uyarı - küçük hatalar veya sorunlar.

  • 8 = Hata - önemli hatalar veya sorunlar.

  • 12 = Ciddi hata - büyük hatalar veya sorunlar, sonuçlara güvenilmemelidir.

  • 16 = Terminal hatası - çok ciddi sorunlar, sonuçları kullanmayın.

Bir iş adımının yürütülmesi, önceki adımların dönüş koduna göre kontrol edilebilir. COND parametre ve IF-THEN-ELSE Bu eğitimde açıklanan yapı.

COND parametresi

Bir CONDparametresi JOB veya JCL'nin EXEC deyiminde kodlanabilir. Önceki iş adımlarının dönüş kodu üzerinde yapılan bir testtir. Test doğru olarak değerlendirilirse, mevcut iş adımının yürütülmesi atlanır. Baypas, sadece iş adımının atlanmasıdır ve anormal bir sonlandırma değildir. Tek bir testte birleştirilen en fazla sekiz koşul olabilir.

Sözdizimi

JCL COND Parametresinin temel sözdizimi aşağıdadır:

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

İşte kullanılan parametrelerin açıklaması:

  • rc : Bu dönüş kodudur

  • logical-operator : Bu, GT (Büyüktür), GE (Büyüktür veya Eşittir), EQ (Eşittir), LT (Küçüktür), LE (Küçüktür veya Eşittir) veya NE (Eşit Değil) olabilir.

  • stepname : Testte dönüş kodu kullanılan iş adımıdır.

Son iki koşul (a) COND = EVEN ve (b) COND = ONLY, bu eğitimde aşağıda açıklanmıştır.

COND, JOB ifadesi veya EXEC ifadesi içinde kodlanabilir ve her iki durumda da aşağıda açıklandığı gibi farklı davranır:

JOB içinde COND ifadesi

COND, JOB deyiminde kodlandığında, koşul her iş adımı için test edilir. Herhangi bir iş adımında koşul doğru olduğunda, onu takip eden iş adımlarıyla birlikte atlanır. Aşağıda bir örnek verilmiştir:

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

EXEC ifadesi içindeki COND

COND, bir iş adımının EXEC ifadesinde kodlandığında ve doğru olduğu görüldüğünde, yalnızca bu iş adımı atlanır ve yürütme bir sonraki iş adımından devam ettirilir.

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

COND = EVEN kodlandığında, önceki adımlardan herhangi biri anormal şekilde sona erse bile mevcut iş adımı yürütülür. Başka herhangi bir RC koşulu, COND = EVEN ile birlikte kodlanırsa, RC koşullarından hiçbiri doğru değilse, iş adımı yürütülür.

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

COND = ONLY kodlandığında, mevcut iş adımı, yalnızca önceki adımlardan herhangi biri anormal şekilde sona erdiğinde yürütülür. Başka herhangi bir RC koşulu, COND = ONLY ile birlikte kodlanırsa, RC koşullarından hiçbiri doğru değilse ve önceki iş adımlarından herhangi biri anormal şekilde başarısız olursa, iş adımı yürütülür.

//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 Yapısı

İş sürecini kontrol etmek için başka bir yaklaşım, IF-THEN-ELSE yapılarını kullanmaktır. Bu, koşullu işleme için daha fazla esneklik ve kullanıcı dostu bir yol sağlar.

Sözdizimi

JCL IF-THEN-ELSE Yapısının temel sözdizimi aşağıdadır:

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

Aşağıdaki IF-THEN-ELSE Yapısında kullanılan terimlerin açıklaması aşağıdadır:

  • name : Bu isteğe bağlıdır ve bir ad, alfabe, #, $ veya @ ile başlayan 1 ila 8 alfanümerik karakter içerebilir.

  • Condition : Bir koşulun bir biçimi olacaktır: KEYWORD OPERATOR VALUE, nerede KEYWORDSRC (Dönüş Kodu), ABENDCC (Sistem veya kullanıcı tamamlama kodu), ABEND, RUN (başlatılan adım yürütme) olabilir. BirOPERATOR mantıksal operatör (VE (&), OR (|)) veya ilişkisel operatör (<, <=,>,> =, <>) olabilir.

Misal

Aşağıda IF-THEN-ELSE'nin kullanımını gösteren basit bir örnek verilmiştir:

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

Biraz daha detaylı anlamak için yukarıdaki programa bakalım:

  • STP01'in dönüş kodu IF1'de test edilir. 0 ise, STP02 yürütülür. Aksi takdirde, işlem bir sonraki IF deyimine (IF2) gider.

  • IF2'de, STP01 yürütmeye başladıysa, STP03a ve STP03b yürütülür.

  • IF3'te, STP03b ABEND değilse, STP04 yürütülür. ELSE'de hiçbir ifade yoktur. NULL ELSE ifadesi denir.

  • IF4'te, eğer STP01.RC = 0 ve STP02.RC <= 4 DOĞRU ise, o zaman STP05 çalıştırılır.

  • IF5'te, STP05 ABEND iş adımında PROC PRC1'deki proc adımı PST1 ise, STP06 yürütülür. Başka bir STP07 yürütülür.

  • IF4 yanlış olarak değerlendirilirse, STP05 yürütülmez. Bu durumda, IF5 test edilmez ve STP06, STP07 adımları yürütülmez.

IF-THEN-ELSE, kullanıcının işi iptal etmesi, iş süresinin dolması veya bir veri kümesinin atlanan bir adıma geriye dönük referans olması gibi işin anormal şekilde sonlandırılması durumunda yürütülmeyecektir.

Kontrol Noktalarını Ayarlama

JCL programınızın içindeki kontrol noktası veri setini aşağıdakileri kullanarak ayarlayabilirsiniz: SYSCKEOV, bir DD ifadesidir.

Bir CHKPTDD ifadesindeki çok hacimli QSAM veri kümeleri için kodlanmış parametredir. Bir CHKPT, CHKPT = EOV olarak kodlandığında, girdi / çıktı çok hacimli veri kümesinin her hacminin sonunda SYSCKEOV deyiminde belirtilen veri kümesine bir kontrol noktası yazılır.

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

Yukarıdaki örnekte, SAMPLE.OUT çıktı veri kümesinin her hacminin sonunda SAMPLE.CHK veri kümesine bir kontrol noktası yazılmıştır.

İşlemeyi Yeniden Başlat

Eter işlemeyi otomatik yolu kullanarak yeniden başlatabilirsiniz. RD parameter veya kullanma kılavuzu RESTART parameter.

RD parameter JOB veya EXEC deyiminde kodlanmıştır ve otomatik JOB / STEP yeniden başlatmaya yardımcı olur ve dört değerden birini tutabilir: R, RNC, NR veya NC.

  • RD=R otomatik yeniden başlatmaya izin verir ve DD ifadesinin CHKPT parametresinde kodlanmış kontrol noktasını dikkate alır.

  • RD=RNC otomatik yeniden başlatmaya izin verir, ancak CHKPT parametresini geçersiz kılar (yok sayar).

  • RD=NRişin / adımın otomatik olarak yeniden başlatılamayacağını belirtir. Ancak RESTART parametresi kullanılarak manuel olarak yeniden başlatıldığında, CHKPT parametresi (varsa) dikkate alınacaktır.

  • RD=NC otomatik yeniden başlatmaya ve denetim noktası işlemeye izin vermez.

Yalnızca belirli durdurma kodları için otomatik yeniden başlatma gereksinimi varsa, o zaman SCHEDxx IBM sistemi parmlib kitaplığı üyesi.

RESTART parameterJOB veya EXEC deyiminde kodlanmıştır ve iş hatasından sonra JOB / STEP'in manuel olarak yeniden başlatılmasına yardımcı olur. RESTART'a, SYSCKEOV DD deyiminde kodlanmış veri kümesinde yazılı kontrol noktası olan bir kontrol kimliği eşlik edebilir. Bir kontrol kimliği kodlandığında, SYSCHK DD ifadesi, JOBLIB ifadesinden (varsa) sonra, JOB ifadesinden sonra kontrol noktası veri setine referans verecek şekilde kodlanmalıdır.

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

Yukarıdaki örnekte, chk5 checkid'dir, yani STP01 kontrol noktası5'te yeniden başlatılır. Lütfen bir SYSCHK ifadesinin eklendiğine ve SYSCKEOV ifadesinin Kontrol Noktası Ayarlama bölümünde açıklanan önceki programda yorumlandığına dikkat edin.