วันจันทร์ที่ 1 เมษายน พ.ศ. 2556

การสร้างเครื่องมือ ดู Key ใน L-File

การสร้างเครื่องมือ ดู Key ใน L-File (Logical)

จากบทความ  สร้างรายงาน  จะพบว่าต้องหา L-File (Logical File) ที่มี key ที่ตรงกับรายงาน    
ถ้าระบบงานมี
L-File จำนวนมาก  ก็จะเสียเวลา ค้นหา(พอสมควร)   การมีเครื่องมือที่ดีย่อมช่วยการทำงานได้รวดเร็วขึ้น (แต่ตอนสร้าง เสียเวลาเล็กน้อยน๊ะครับ)

ข้อจำกัด เครื่องมือดังกล่าว จะทำงานได้ดี  บนสภาพแวดล้อม  แบบนี้น๊ะครับ
- 1 Table มี 1 Member, 1 Record Format เท่านั้น
- สร้าง L-File  เหมือน P-File  แต่เพิ่ม Key  เข้าไปเท่านั้น
- การตั้งชื่อ File ทำคล้ายแบบนี้            SQL010p  (P-file) -> SQL010L1, SQL010L2, ...
               ไม่ได้สร้างจาก SQL0X0L1 ที่เกิดจากการ Join หลาย File SQL010p กับ SQL020p


ตย.1 ดูรายชื่อ Key ที่มีใน L-File  ผ่าน Spool  ป้อนคำสั่ง  (ที่สร้างเอง)  ตามนี้
klist sql010l*              
จะเกิด Spool
                  Device or                       Total   Current              
 Opt  File        Queue       User Data   Status  Pages     Page   Copies      
      QPRINT      PSUQ                     RDY        1                1     

ภายใน Spool จะเห็นแบบนี้ 
                             Display Spooled File                             
File  . . . . . :   QPRINT                           Page/Line   1/3          
Control . . . . .   W48                              Columns     48 - 125     
Find  . . . . . .                                                             
..5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+
 S T  O U T  * *                                         DATE 13/04/01  PAGE  
RECORD     KEY :                                                              
SQL010R1   L1PLAC L1DIVI L1OPEC L1EPNO                                         
SQL010R2   L1PLAC L1DIVI L1OPEC L1EDUC L1EPNO                                 
SQL010R3   L1PLAC L1DIVI L1OPEC L1SEX  L1EPNO                                 
SQL010R4   L1PLAC L1DIVI L1OPEC L1MARY L1EPNO                                  
                                                               ** END OF LIST   

ตอนนี้เราสามารถเลือก L-File ที่ตรงกับที่เราต้องการได้ง่าย  แล้ว

ตย.2 ดูรายชื่อ Key ที่มีใน L-File  ให้แสดง ที่หน้าจอ ป้อนคำสั่ง  (ที่สร้างเอง)  ตามนี้
klistw sql010l*              

KEY100W1         **  K L I S T  D I S P L A Y  O U T  **      4/01/13 10:39:29
                                                                              
 FILE       KEY   :  FILE       KEY   :  FILE       KEY   :  FILE       KEY   
-----------------   -----------------   -----------------   ----------------- 
SQL010L1   L1PLAC   SQL010L2   L1PLAC   SQL010L3   L1PLAC   SQL010L4   L1PLAC 
           L1DIVI              L1DIVI              L1DIVI              L1DIVI 
           L1OPEC              L1OPEC              L1OPEC              L1OPEC 
           L1EPNO              L1EDUC              L1SEX               L1MARY 
                               L1EPNO              L1EPNO              L1EPNO 

แนวการสร้าง Tool

การค้นหา  เราสามารถทำได้โดยเปิดดูผ่าน
(1) Source File   วิธีพื้นฐาน
(2) Object  ด้วยคำสั่ง DspFd  QGPL/SQL010L1


ตัวอย่างผลลัพธ์บางส่วน แสดงดังนี้
Record format . . . . . . . . . . . . . . . :            SQL010R1 
  Key field . . . . . . . . . . . . . . . . :            L1PLAC   
    Sequence  . . . . . . . . . . . . . . . :            Ascending
    Sign specified  . . . . . . . . . . . . :            UNSIGNED 
    Zone/digit specified  . . . . . . . . . :            *NONE    
    Alternative collating sequence  . . . . :            No       
  Key field . . . . . . . . . . . . . . . . :            L1DIVI   
    Sequence  . . . . . . . . . . . . . . . :            Ascending
    Sign specified  . . . . . . . . . . . . :            UNSIGNED 
    Zone/digit specified  . . . . . . . . . :            *NONE    
    Alternative collating sequence  . . . . :            No       
  Key field . . . . . . . . . . . . . . . . :            L1OPEC   
    Sequence  . . . . . . . . . . . . . . . :            Ascending
    Sign specified  . . . . . . . . . . . . :            UNSIGNED  
    Zone/digit specified  . . . . . . . . . :            *NONE     
    Alternative collating sequence  . . . . :            No        
  Key field . . . . . . . . . . . . . . . . :            L1EPNO    
    Sequence  . . . . . . . . . . . . . . . :            Ascending 
    Sign specified  . . . . . . . . . . . . :            UNSIGNED  
    Zone/digit specified  . . . . . . . . . :            *NONE     
    Alternative collating sequence  . . . . :            No        

การดูผ่าน Object น่าจะ  ถูกต้องกว่า

เทคนิคที่ใช้

ทำโดย  เปลี่ยนสิ่งที่เห็น  บนหน้าจอ ไปเป็น File  แล้วเขียนโปรแกรมอ่านจาก File ดังกล่าว
a. ป้อน  ชื่อ File (แบบ Generic) เช่น SQL010*
b. ค้นหา  รายชื่อ File ในกลุ่ม

            DSPOBJD OBJ(QGPL/SQL010*)   OBJTYPE(*FILE)   OUTPUT(*OUTFILE)   OUTFILE(QTEMP/B1)    


       ถ้า  กำหนดให้  ป้อน a เป็น P-File  สามารถหาได้ว่า  มี file อะไร  ที่เป็น L-File บ้าง   ด้วยคำสั่งชุดนี้
            DSPDBR FILE(QGPL/SQL010P)  OUTPUT(*OUTFILE)   OUTFILE(QTEMP/B2)    
    
    (ปรกติจะได้ ข้อมูลหลาย Row)  Loop อ่าน ข้อมูลจาก b. จะได้  Lib,File
    
เลือกเฉพาะ Attrbute ที่เป็น LF,LF38


            ชื่อ Field ดูได้จากคำสั่ง DSPFFD QTEMP/B     
               ODLBNM=Lib, ODOBNM=file, ODOBAT = "LF ", "LF38 ", ... (เพิ่มได้ตามต้องการ)
               อ่านทีละ File (Row) แล้วให้แสดงค่า key ใน file
               เช่น  ได้ค่า              ODLBNM=qgpl,  ODOBNM=SQL010L1


c. ดึงค่า Key ของ  Lib,File จาก b.


            DSPFD FILE(qgpl/SQL010L1)   TYPE(*ACCPTH)  OUTPUT(*OUTFILE)  OUTFILE(QTEMP/C)     


            ชื่อ Field ดูได้จากคำสั่ง DSPFFD QTEMP/C     
            APFTYP = File type (P=PF,L=LF), APKEYF = Key Field Name, APKEYN = Key Field Number
            นำค่า Key ที่ได้  บันทึกลง File

d. ทำโปรแกรม แสดงผลลัพธ์  ตาม ตย.1,2

ข้อแนะนำ ควรสร้างและทดสอบ c. ก่อน  แล้วจึงสร้าง b
            call   pgm-c  (Lib  File)

สร้าง Pgm-C

               call  Pgm-C  parm(Lib  File)
               Pgm-C  (เป็น CL-Pgm)
           กรณีนี้  ผมจะสร้าง File Output  (เพื่อใช้ตรวจสอบได้ง่าย)  อ้างอิงจาก ผลลัพธ์นี้  

               DSPFD FILE(&Lib/&File)   TYPE(*ACCPTH)  OUTPUT(*OUTFILE)  OUTFILE(QTEMP/C) 
               ดู field ด้วยคำสั่ง  dspffd qtemp/c
Source Code
qgpl/qddssrc    KeyFp
qgpl/qddssrc    KeyFL1
            APLib               10                   
            APFile              10                   
            APKSEQ            1                   
            APKEYF           10
            APLib               10
            APFile              10
            APKSEQ            1
            APKEYF           10
       K   APKSEQ
       K   APKEYF          


สร้าง P-file, L-File จาก Source Code ข้างต้น

           note ถ้าใช้ QTEMP/C ได้คล่อง  สามารถสร้าง L-file อ้างอิง Qtemp/C ได้เลย   ไม่ต้องสร้าง File Output

                      Pgm   Parm(&Lib  &File)
                      dcl     &File    *CHAR   10
                      dcl     &Lib     *CHAR   10

                      /*  บันทึก Key ใน L-File ลง file  */
                      DSPFD FILE(&Lib/&File)   TYPE(*ACCPTH)  OUTPUT(*OUTFILE)  OUTFILE(QTEMP/C) 

                      /*  ย้ายข้อมูล QTEMP/C ไป KeyFp  */
                      CPYF FROMFILE(QTEMP/C) TOFILE(GQPL/KeyFp) MBROPT(*ADD)    

                      EndPgm

               Tip          เพิ่ม  ตรวจสอบอื่นๆได้  เช่น  ตรวจสอบ Error (ไม่พบ File)
               ทดสอบ
                              (Clear Data ใน  qgpl/KeyFp ก่อน)
                              call   pgm-c  ('QGPL'  'SQL010L1')
                              call   pgm-c  ('QGPL'  'SQL010L2')
                              call   pgm-c  ('QGPL'  'SQL010L3')
                              ตรวจดู Data (ใช้อะไร ก็ได้ที่ง่ายๆ)

สร้าง Pgm-D  

ใช้ดูผลลัพธ์ (แบบ ตย.1)

            first# = 'Y'
            Read  KeyFL1
            ---------------------------------------------------------
            Loop Not EoF (End of File)

                        '---First time
                        If  first# = 'Y'  Then
                                    first# = 'N'
                                    O#File = k1file
                        End                 
                        If  chg-Grp  (O#File <> K1file)  Then
                                    Print     O#File, Array
                                    O#File = k1file
                                    Clear Array
                        End
                        Move  k1KSeq -> j#
                        Array(j#) = k1KeyF

                        Read  KeyFL1
            Next
            ---------------------------------------------------------
            If  first# = 'N'  Then
                        Print     O#File, Array
            End                 

สร้าง Pgm-B

เพื่อเรียกใช้  Pgm-C
            call  Pgm-B  (Lib   File) 

            Pgm   Parm(&wLib  &wFile)
            DclF    File(Qtemp/B)
            dcl     &File    *CHAR   10
            dcl     &Lib     *CHAR   10

            DSPOBJD OBJ(Lib/File)   OBJTYPE(*FILE)   OUTPUT(*OUTFILE)   OUTFILE(QTEMP/B)    
            /*  แสดงชื่อ File ทั้งหมดที่อยู่ในกลุ่ม  Generic Name */

   Stp010:
            /*  ชื่อ Record Format ดูได้จาก  DSPFD  QTEMP/B */
            RCVF       RCDFMT(QLIDOBJD)
            MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(END010))

            /*  เลือกเฉพาะ L-FIle เท่านั้น  */
            IF         COND((&ODOBAT *GE 'LF ') *AND (&ODOBAT *LE 'LF38')) THEN(DO)                          
                CALL PGM(pgm-C) PARM(&ODLBNM &ODOBNM)
            ENDDO                                                     

   End010:
            ENDPGM

สร้าง Command เรียกใช้ Pgm-B  

               (ไม่ขออธิบาย รายละเอียด น๊ะครับ)
               สร้างใน QCMDSRC  (รับส่ง ตัวแปร 2 ตัว)
               ขณะ Create ให้ไปเรียกใช้  Pgm-B  (ซึ่งรับ 2 ตัวแปรนี้)

สรุป

คงเห็นภาพการสร้าง Tool ขึ้นมาช่วยหา key ใน L-File กันได้บ้างแล้วน๊ะครับ
เทคนิคข้างต้น  สามารถนำไปใช้ได้กับ งานหลายประเภท    จะเรียกเทคนิคนี้ว่า API (Application Program Interface)  "ย่อมๆ"  เราใช้คำสั่งพื้นฐาน และหาทางติดต่อกับชุดคำสั่งของ OS  แต่ที่เรียกว่า "ย่อมๆ"  เพราะ  เราต้องเขียนโปรแกรมเองค่อนข้างมาก

ตัวคำสั่งแต่ละตัวจะเห็นข้อมูลปริมาณมาก  แต่ในการใช้งาน ผมได้เลือกใช้เฉพาะที่เข้าใจง่าย
ผู้อ่านสามารถเพิ่มรายละเอียดต่างๆ  ได้ตามสภาพแวดล้อมของตนเองได้  เช่น 
L-File Key มีการกำหนด Select/Omit  เป็นต้น

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

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