JCL - การประมวลผลตามเงื่อนไข

ระบบป้อนงานใช้สองวิธีในการประมวลผลแบบมีเงื่อนไขใน JCL เมื่องานเสร็จสิ้นรหัสส่งคืนจะถูกตั้งค่าตามสถานะของการดำเนินการ รหัสส่งคืนอาจเป็นตัวเลขระหว่าง 0 (การดำเนินการสำเร็จ) ถึง 4095 (ที่ไม่ใช่ศูนย์แสดงเงื่อนไขข้อผิดพลาด) ค่าทั่วไปที่พบบ่อยที่สุดคือ:

  • 0 = ปกติ - ตกลงทั้งหมด

  • 4 = คำเตือน - ข้อผิดพลาดหรือปัญหาเล็กน้อย

  • 8 = ข้อผิดพลาด - ข้อผิดพลาดหรือปัญหาที่สำคัญ

  • 12 = ข้อผิดพลาดที่รุนแรง - ข้อผิดพลาดหรือปัญหาที่สำคัญผลลัพธ์ไม่ควรเชื่อถือได้

  • 16 = Terminal error - ปัญหาร้ายแรงมากอย่าใช้ผลลัพธ์

การดำเนินการขั้นตอนงานสามารถควบคุมได้ตามรหัสส่งคืนของขั้นตอนก่อนหน้าโดยใช้ COND พารามิเตอร์และ IF-THEN-ELSE สร้างซึ่งได้อธิบายไว้ในบทช่วยสอนนี้

พารามิเตอร์ COND

CONDสามารถเข้ารหัสพารามิเตอร์ในคำสั่ง JOB หรือ EXEC ของ JCL เป็นการทดสอบโค้ดส่งคืนของขั้นตอนงานก่อนหน้านี้ หากการทดสอบได้รับการประเมินว่าเป็นจริงการดำเนินการขั้นตอนงานปัจจุบันจะถูกข้าม การข้ามเป็นเพียงการละเว้นขั้นตอนงานและไม่ใช่การเลิกจ้างที่ผิดปกติ สามารถมีเงื่อนไขได้สูงสุดแปดเงื่อนไขในการทดสอบเดียว

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์พื้นฐานของพารามิเตอร์ JCL COND:

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

นี่คือคำอธิบายของพารามิเตอร์ที่ใช้:

  • rc : นี่คือรหัสส่งคืน

  • logical-operator : อาจเป็น GT (มากกว่า), GE (มากกว่าหรือเท่ากับ), EQ (เท่ากับ), LT (น้อยกว่า), LE (น้อยกว่าหรือเท่ากับ) หรือ NE (ไม่เท่ากับ)

  • stepname : นี่คือขั้นตอนงานที่ใช้รหัสส่งคืนในการทดสอบ

สองเงื่อนไขสุดท้าย (a) COND = แม้และ (b) COND = เท่านั้นได้อธิบายไว้ด้านล่างในบทช่วยสอนนี้

COND สามารถเข้ารหัสได้ทั้งในคำสั่ง JOB หรือคำสั่ง EXEC และในทั้งสองกรณีจะทำงานแตกต่างกันดังที่อธิบายไว้ด้านล่าง:

COND ภายในคำสั่ง JOB

เมื่อมีการเข้ารหัส COND ในคำสั่ง JOB เงื่อนไขจะถูกทดสอบสำหรับทุกขั้นตอนของงาน เมื่อเงื่อนไขเป็นจริงในขั้นตอนงานใดขั้นตอนหนึ่งระบบจะข้ามไปพร้อมกับขั้นตอนงานที่ตามมา ต่อไปนี้เป็นตัวอย่าง:

//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 ภายในคำสั่ง EXEC

เมื่อ COND ถูกเข้ารหัสในคำสั่ง EXEC ของขั้นตอนงานและพบว่าเป็นจริงขั้นตอนงานนั้นเท่านั้นที่จะถูกข้ามและการดำเนินการจะดำเนินต่อจากขั้นตอนงานถัดไป

//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 = แม้

เมื่อมีการเข้ารหัส COND = EVEN ขั้นตอนงานปัจจุบันจะถูกดำเนินการแม้ว่าขั้นตอนก่อนหน้านี้จะยุติลงอย่างผิดปกติก็ตาม หากมีการเข้ารหัสเงื่อนไข RC อื่น ๆ พร้อมกับ COND = EVEN ขั้นตอนงานจะดำเนินการหากไม่มีเงื่อนไข RC ใดเป็นจริง

//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 = เท่านั้น

เมื่อมีการเข้ารหัส COND = ON เท่านั้นขั้นตอนงานปัจจุบันจะถูกดำเนินการเฉพาะเมื่อขั้นตอนก่อนหน้านี้ยุติอย่างผิดปกติ หากมีการเข้ารหัสเงื่อนไข RC อื่น ๆ พร้อมด้วย COND = ONLY ขั้นตอนงานจะดำเนินการหากไม่มีเงื่อนไข RC ใดเป็นจริงและขั้นตอนงานก่อนหน้านี้ล้มเหลวอย่างผิดปกติ

//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 สร้าง

อีกวิธีหนึ่งในการควบคุมการประมวลผลงานคือการใช้โครงสร้าง IF-THEN-ELSE สิ่งนี้ให้ความยืดหยุ่นมากขึ้นและวิธีการประมวลผลตามเงื่อนไขที่เป็นมิตรกับผู้ใช้

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์พื้นฐานของ JCL IF-THEN-ELSE Construct:

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

ต่อไปนี้เป็นคำอธิบายของข้อกำหนดที่ใช้ใน IF-THEN-ELSE Construct ด้านบน:

  • name : นี่เป็นทางเลือกและชื่อสามารถมีอักขระที่เป็นตัวเลขและตัวอักษรได้ 1 ถึง 8 ตัวโดยขึ้นต้นด้วยตัวอักษร #, $ หรือ @

  • Condition : เงื่อนไขจะมีรูปแบบ: KEYWORD OPERATOR VALUE, ที่ไหน KEYWORDSสามารถเป็น RC (Return Code), ABENDCC (System หรือรหัสการเติมข้อมูลของผู้ใช้), ABEND, RUN (ขั้นตอนที่เริ่มดำเนินการ) อันOPERATOR สามารถเป็นตัวดำเนินการเชิงตรรกะ (AND (&), OR (|)) หรือตัวดำเนินการเชิงสัมพันธ์ (<, <=,>,> =, <>)

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างง่ายๆที่แสดงการใช้ 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

ลองดูโปรแกรมด้านบนเพื่อทำความเข้าใจในรายละเอียดเพิ่มเติมเล็กน้อย:

  • รหัสส่งคืนของ STP01 ถูกทดสอบใน IF1 ถ้าเป็น 0 แสดงว่า STP02 ถูกเรียกใช้งาน มิฉะนั้นการประมวลผลจะไปที่คำสั่ง IF ถัดไป (IF2)

  • ใน IF2 ถ้า STP01 เริ่มดำเนินการแล้ว STP03a และ STP03b จะถูกเรียกใช้งาน

  • ใน IF3 ถ้า STP03b ไม่ ABEND แสดงว่า STP04 จะดำเนินการ ใน ELSE ไม่มีงบ เรียกว่าคำสั่ง NULL ELSE

  • ใน IF4 ถ้า STP01.RC = 0 และ STP02.RC <= 4 เป็น TRUE จะดำเนินการ STP05

  • ใน IF5 ถ้า PST1 ขั้นตอน proc ใน PROC PRC1 ในขั้นตอนงาน STP05 ABEND จะดำเนินการ STP06 อื่น STP07 ถูกเรียกใช้งาน

  • หาก IF4 ประเมินว่าเป็นเท็จ STP05 จะไม่ถูกดำเนินการ ในกรณีนั้นจะไม่มีการทดสอบ IF5 และขั้นตอน STP06, STP07 จะไม่ถูกดำเนินการ

IF-THEN-ELSE จะไม่ถูกดำเนินการในกรณีที่มีการยกเลิกงานอย่างผิดปกติเช่นผู้ใช้ยกเลิกงานหมดเวลางานหรือชุดข้อมูลถูกอ้างอิงย้อนหลังไปยังขั้นตอนที่ข้ามไป

การตั้งค่าจุดตรวจ

คุณสามารถตั้งค่าชุดข้อมูลจุดตรวจภายในโปรแกรม JCL ของคุณโดยใช้ SYSCKEOV, ซึ่งเป็นคำสั่ง DD

CHKPTคือพารามิเตอร์ที่เข้ารหัสสำหรับชุดข้อมูล QSAM แบบหลายวอลุ่มในคำสั่ง DD เมื่อ CHKPT ถูกเข้ารหัสเป็น CHKPT = EOV จุดตรวจจะถูกเขียนไปยังชุดข้อมูลที่ระบุในคำสั่ง SYSCKEOV ที่ส่วนท้ายของแต่ละโวลุ่มของชุดข้อมูลหลายโวลุ่มอินพุต / เอาต์พุต

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

ในตัวอย่างข้างต้นจุดตรวจจะถูกเขียนในชุดข้อมูล SAMPLE.CHK ที่ส่วนท้ายของแต่ละโวลุ่มของชุดข้อมูลเอาต์พุต SAMPLE.OUT

เริ่มการประมวลผลใหม่

คุณสามารถรีสตาร์ทการประมวลผลอีเธอร์โดยใช้วิธีอัตโนมัติโดยใช้ไฟล์ RD parameter หรือคู่มือโดยใช้ RESTART parameter.

RD parameter ถูกเข้ารหัสในคำสั่ง JOB หรือ EXEC และช่วยในการรีสตาร์ท JOB / STEP อัตโนมัติและสามารถเก็บค่าหนึ่งในสี่ค่า: R, RNC, NR หรือ NC

  • RD=R อนุญาตให้รีสตาร์ทอัตโนมัติและพิจารณาจุดตรวจที่เข้ารหัสในพารามิเตอร์ CHKPT ของคำสั่ง DD

  • RD=RNC อนุญาตให้รีสตาร์ทอัตโนมัติ แต่แทนที่ (ละเว้น) พารามิเตอร์ CHKPT

  • RD=NRระบุว่างาน / ขั้นตอนไม่สามารถเริ่มต้นใหม่โดยอัตโนมัติ แต่เมื่อรีสตาร์ทด้วยตนเองโดยใช้พารามิเตอร์ RESTART พารามิเตอร์ CHKPT (ถ้ามี) จะได้รับการพิจารณา

  • RD=NC ปิดการใช้งานการรีสตาร์ทอัตโนมัติและการประมวลผลจุดตรวจ

หากมีข้อกำหนดในการรีสตาร์ทอัตโนมัติสำหรับรหัสหยุดเฉพาะเท่านั้นก็สามารถระบุได้ในไฟล์ SCHEDxx สมาชิกของไลบรารี parmlib ระบบ IBM

RESTART parameterถูกเข้ารหัสในคำสั่ง JOB หรือ EXEC และช่วยในการรีสตาร์ท JOB / STEP ด้วยตนเองหลังจากงานล้มเหลว RESTART สามารถมาพร้อมกับ checkid ซึ่งเป็นจุดตรวจที่เขียนในชุดข้อมูลที่เข้ารหัสในคำสั่ง SYSCKEOV DD เมื่อมีการเข้ารหัส checkid คำสั่ง SYSCHK DD ควรถูกเข้ารหัสเพื่ออ้างอิงชุดข้อมูลจุดตรวจหลังจากคำสั่ง JOBLIB (ถ้ามี) อื่น ๆ หลังจากคำสั่ง 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

ในตัวอย่างข้างต้น chk5 คือ checkid กล่าวคือ STP01 ถูกรีสตาร์ทที่จุดตรวจ 5 โปรดทราบว่ามีการเพิ่มคำสั่ง SYSCHK และคำสั่ง SYSCKEOV ถูกแสดงความคิดเห็นในโปรแกรมก่อนหน้านี้ที่อธิบายไว้ในส่วนการตั้งค่าจุดตรวจ