วันพุธที่ 22 มกราคม พ.ศ. 2557

CL - สร้างโปรแกรมช่วย ลดการทำงาน-1

CL - สร้างโปรแกรมช่วย ลดการทำงาน-1

CL = Control Language เป็นภาษาที่ใช้จัดการ  คำสั่ง  บน OS/400
ถ้าเทียบกับ Windows  ก็คือ เขียน/สร้าง Batch File เพื่อใช้คำสั่งย่อย ต่อเนื่องกัน

เทคนิคช่วยลด เวลา  ในการทำงานซ้ำๆได้ครับ

ตย. ทุกเดือนต้อง Backup Data  (เช่น Lib1/File1 -> LibB/FileH) โดยกำหนดขั้นตอนดังนี้
(1). แยกข้อมูลตาม ช่วงเวลา (เช่น  1 member ต่อ 6 เดือน เป็นต้น)
(2). เมื่อย้ายข้อมูลเสร็จ  จะนำข้อมูล
    2.1 จัดเก็บใน  Cartridge
    2.2 จัดเก็บใน  History Server (ที่ราคาถูกกว่า เช่น MS SQL Server)
          ต้องรวม Member กลับไปเป็น 1 Member
          (LibB/File1-หลาย member -> LibH/FileH 1 member)

ผมสนใจข้อ 2.2 ซึ่งต้องทำแบบ Manual ดังนี้
a. ตรวจดูว่า LibB/File1  มี member ชื่ออะไรบ้าง ? ด้วยคำสั่ง
    DSPFD  FILE(LibB/File1)  TYPE(*MBRLIST)
    (จดรายชื่อไว้)
b. Copy รวม data ด้วยคำสั่ง
    CPYF  FROMFILE(LibB/File1)   TOFILE(LibH/FileH)   FROMMBR(ระบุชื่อ)  TOMBR(*FIRST)   MBROPT(*ADD)

ตย. มี 10  File แต่ละ File มี 5-10  member ที่ชื่ออ่านยาก    การทำแบบ Manual  จะใช้เวลา "นาน" และเสี่ยงที่จะผิดพลาด (จดชื่อผิด)

เราจะสร้างโปรแกรมช่วย ลดการทำงาน ในข้อ 2.2 กัน
โดยสร้างโปรแกรม และทำงานดังนี้   CALL   BK2HT   (LibB   File1     LibH  FileH)

สร้าง CL  โดยปรับขั้นตอนตามนี้
(รับค่า   &LibB  &File1  &LibH  &FileH)
a. DSPFD FILE(&LibB/&File1) TYPE(*MBRLIST)  OUTPUT(*OUTFILE)  OUTFILE(QTEMP/A)
Loop อ่าน File  QTEMP/A
       b. CPYF  FROMFILE(&LibB/&File1)   TOFILE(&LibH/&FileH)  
                       FROMMBR
(&mlname)    TOMBR(*FIRST)   MBROPT(*ADD)

จากนั้น  เพิ่มรายละเอียดต่างๆ  เช่น
- ตรวจ Lib/File ต้องมี
- ถ้ามี File แต่ไม่มี Member
- ...

มาดู code  BK2HT แบบเต็มๆกัน

---------------------------------------------------------------------
PGM        PARM(&LIBB &FILE1  &LIBH  &FILEH)                  
                                             
DCLF       FILE(A)                    
DCL        VAR(&LIBB)    TYPE(*CHAR) LEN(10)  
DCL        VAR(&FILE1)   TYPE(*CHAR) LEN(10) 
DCL        VAR(&LIBH)    TYPE(*CHAR) LEN(10)  
DCL        VAR(&FILEH)  TYPE(*CHAR) LEN(10) 

CHKOBJ OBJ(&LIBB/&FILE1) OBJTYPE(*FILE)
MONMSG     MSGID(CPF9801) EXEC(GOTO CMDLBL(STP090)

CHKOBJ OBJ(&LIBH/&FILEH) OBJTYPE(*FILE)
MONMSG     MSGID(CPF9801) EXEC(GOTO CMDLBL(STP090)

DSPFD FILE(&LibB/&File1) TYPE(*MBRLIST)  OUTPUT(*OUTFILE)  OUTFILE(QTEMP/A)

/*-- Start Loop --*/
STP010:
  RCVF                                               
  MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(STP090))
  CPYF  FROMFILE(&LibB/&File1)   TOFILE(&LibH/&FileH)  
        FROMMBR
(&mlname)    TOMBR(*FIRST)   MBROPT(*ADD)

GOTO       CMDLBL(STP010)

/*-- End Loop --*/
STP090:
ENDPGM
---------------------------------------------------------------------
ก่อน compile  ให้เรียกใช้คำสั่งข้อ  a.  ก่อน (เพื่อสร้าง Object = QTemp/A)

อื่นๆ

เทคนิคนี้ใช้บ่อย   ได้กับงานที่เรียกใช้ CL Cmd ติดต่อกัน
- ตรวจ data size ในระบบ file ไหนมีขนาดใหญ่ เกินกำหนด
- ตรวจ job ที่ (กำลัง) ทำงานใน subsystem
- ...

ตย. ข้างต้น  เมื่อดุดีๆ  จะพบว่า  ถ้าปรับขั้นตอน  (1)  ให้ไปเก็บใน LibH/FileH 1 member เลย  ก็ไม่ต้องทำ 2.2     ที่ไม่ทำเพราะ  (1) เป็นโปรแกรมที่เก่ามาก  และมีเทคนิคเฉพาะหลายอย่าง ... การปรับถือว่าไม่คุ้ม


ไม่มีความคิดเห็น:

แสดงความคิดเห็น