CL - ตั้งเวลาทำงาน ด้วย DLYJOB
เขียนโปรแกรม CL:Control Language - ตั้งเวลาทำงานตย. ผมจะต้องเรียกใช้ RGZPFM (ลดขนาดข้อมูล) กับ File หลายตัว
ผมแยก File (ที่จะทำ RGZPFM) ออกเป็น 2 กลุ่ม
1. กลุ่ม File ที่ใช้เวลาสั้น
2. กลุ่ม File ที่ใช้เวลานาน (File ที่มี number of records มาก)
(เจาะลึก)
Q: รวมกันได้มั๊ย ? ถ้าได้ ทำไมต้องแยก
A: ได้ครับ ที่จัดกลุ่มเพราะ เคยพบว่า บาง File ขนาดใหญ่ มากใช้เวลา "นานมาก"
มี File ขนาดเล็ก รอทำงานอยู่มาก
(เจาะลึกได้อีก)
Note การจัดกลุ่ม ในแบบ ต่างๆ
- แยกเป็น ตามกลุ่ม User (ถ้าเสร็จ User กลุ่มนั้นก็จะใช้งานได้)
- แยกเป็น 5-10 กลุ่ม เมื่อ เครื่องทำงานได้เร็วพอ
แต่ละ วิธีจะมีข้อดี และ ข้อเสีย เลือกตามความเหมาะสมน๊ะครับ
กลับมาทำต่อ
ผมเขียน CL ตามกลุ่ม ข้างต้น (ด้านในมีคำสั่ง RGZPFM)
จากนั้น ก็ตั้งเวลาทำงาน "ล่วงหน้า" เช่น
(วันนี้ 12 เมษา เวลา 15:00) ให้ทำ 13 เมษา 2561 เวลา 8:00
(วันนี้ 10 เมษา) ให้ทำ 13 เมษา 2561 เวลา 8:00
ผมเลือกให้ทำงานแบบ Batch - ไม่ต้องเปิด 1 จอ รอให้ทำงาน
+ ต้อง ตรวจสิ่งที่เรา โยนไปได้
+ เมื่อทำงานเสร็จ ต้องส่ง Msg ไปที่ ... (UsrPrf ของผม)
การตั้งเวลา ในที่นี้จะพูดถึง 2 วิธี
1. CL ที่มีคำสั่ง DLYJOB เรียกใช้งานแบบ Batch
2. ใช้ cmd WrkJobScdE อันนี้สะดวกกว่า (Job ทำงานแบบ Batch)
เช็ค/ทบทวน ก่อน
- เมื่อ Batch ทำงานเสร็จ จะส่ง Msg ไปที่ UsrPrf ที่สร้าง Job
CHGMSGQ myUSrPrf DLVRY(*BREAK)
- คำสั่ง SBMJOB ทั่วไป เมื่อทำงานเสร็จ จะไม่มี Spool JobLog ไว้
เพิ่ม ตั้งค่า เพื่อให้สร้าง Spool File
SBMJOB CMD(DSPFD FILE(*LIBL/QPRINT) OUTPUT(*PRINT))
JOB(TEST2)
LOG(4 0 *MSG) LOGCLPGM(*YES) LOGOUTPUT(*JOBEND)
ทดลองเรียก ดู จะเกิด Break Msg ที่ UsrPrf ของเรา
และ เกิด Spool File การทำงานของ Job ใน outq(QEZJOBLOG)
มาดู Code กัน
1. CL ที่มีคำสั่ง DLYJOB เรียกใช้งานแบบ Batch
(วันนี้ 12 เมษา เวลา 15:00) ให้ทำ 13 เมษา 2561 เวลา 8:00
สร้าง Code QGPL/QCLSRC TEST1
PGM
DLYJOB RSMTIME('08:00:00')
RGZPFM FILE(MYLIB1/MYFILE2)
ENDPGM
DLYJOB สามารถ ป้อนเป็น วินาทีได้ (สูงสุดได้ 27 วัน)
เช่น ให้รอไป 18ชม = 18*60*60 = 64800 วินาที เปลี่ยน Code เป็น
DLYJOB DLY(64800)
สังเกต เหมาะกับ ตั้งเวลา สั่งงาน ในวันนั้น หรือ รอ 1 วัน
2. คำสั่ง WrkJobScdE
ใช้งานได้ ยืดหยุ่นกว่า
ทำ ครั้งเดียว หรือ ทุกอาทิตย์ หรือ ทุกเดือน
ครั้งเดียว = ระบุวันที่ได้
ทุกอาทิตย์,ทุกเดือน = ทำวันไหน (1 วัน หรือ หลายวัน,ทุกวัน) จันทร์,อังคาร,...
ทำงาน ณ. เวลา ...
ยกเว้น วันไหน (เช่น วันที่ปิดเครื่อง)
สร้าง Code QGPL/QCLSRC TEST2
PGM
RGZPFM FILE(MYLIB1/MYFILE2)
ENDPGM
WrkJobScdE ป้อนรายการใหม่ F6=Add ป้อนตามนี้
ADDJOBSCDE JOB(TEST2)
CMD(CALL PGM(QGPL/TEST1))
FRQ(*WEEKLY)
SCDDAY(*TUE *THU *SAT)
SCDTIME('08:00:00')
ข้อสังเกต อ่านแล้วได้ความหมายดี ยืดหยุ่นกว่าด้วย ครับ
Q: มันทำงานแบบ Batch - ถ้าทำงานขณะที่มี User ใช้งาน "มาก"
Job นี้จะไม่ทำงานเลย (CPU ไม่ว่างพอ) มีทางแก้ไขหรือไม่ ?
A: เปลี่ยน ให้มันทำงาน แบบ Interactive ซะ ซึ่งมีหลายรายละเอียด
เช่น JobQ(QINTER) - ไปใช้ Pool ของ QINTER
แต่คุณสมบัติยังเป็น Batch อยุ่ (RunPty ต่ำกว่า, TimeSlice นานกว่า)
การแก้ไขคุณสมบัติ ให้เป็นงาน Interactive
- ต้องสร้าง/เรียกใช้ JobD โดยระบุรายละเอียด
... ขอไม่อธิบายครับ เริ่มมีรายละเอียดมากไป ครับ
สำหรับงาน สำคัญ ขอให้ ทดสอบ ก่อนใช้จริง น๊ะครับ
อื่นๆ มีบางท่านแนะนำให้ เพิ่มคำสั่ง sndmsg แทรกใน CL ของเรา
เพื่อให้มันแจ้งว่า มันผ่าน คำสั่งอะไรไปแล้วบ้าง
- ดู Msg น่าจะง่ายกว่า ไปเปิด Spool