การสร้างเครื่องมือ ดู Key ใน L-File (Logical)
จากบทความ สร้างรายงาน จะพบว่าต้องหา L-File (Logical File) ที่มี key
ที่ตรงกับรายงาน
ถ้าระบบงานมี L-File จำนวนมาก ก็จะเสียเวลา ค้นหา(พอสมควร) การมีเครื่องมือที่ดีย่อมช่วยการทำงานได้รวดเร็วขึ้น (แต่ตอนสร้าง เสียเวลาเล็กน้อยน๊ะครับ)
ถ้าระบบงานมี L-File จำนวนมาก ก็จะเสียเวลา ค้นหา(พอสมควร) การมีเครื่องมือที่ดีย่อมช่วยการทำงานได้รวดเร็วขึ้น (แต่ตอนสร้าง เสียเวลาเล็กน้อยน๊ะครับ)
ข้อจำกัด เครื่องมือดังกล่าว จะทำงานได้ดี บนสภาพแวดล้อม แบบนี้น๊ะครับ
- 1 Table มี 1 Member, 1 Record Format เท่านั้น
- สร้าง L-File เหมือน P-File แต่เพิ่ม Key เข้าไปเท่านั้น
- สร้าง 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 วิธีพื้นฐาน
(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
ชื่อ 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
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)
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)
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 */
/* ชื่อ Record Format ดูได้จาก DSPFD QTEMP/B */
RCVF RCDFMT(QLIDOBJD)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END010))
/* เลือกเฉพาะ L-FIle เท่านั้น */
/* เลือกเฉพาะ L-FIle เท่านั้น */
IF COND((&ODOBAT *GE 'LF ') *AND
(&ODOBAT *LE 'LF38')) THEN(DO)
CALL PGM(pgm-C) PARM(&ODLBNM &ODOBNM)
ENDDO
End010:
ENDPGM
ENDPGM
สร้าง Command เรียกใช้ Pgm-B
(ไม่ขออธิบาย รายละเอียด น๊ะครับ)
สร้างใน QCMDSRC
(รับส่ง ตัวแปร 2 ตัว)
ขณะ Create ให้ไปเรียกใช้ Pgm-B (ซึ่งรับ 2 ตัวแปรนี้)
สรุป
คงเห็นภาพการสร้าง Tool ขึ้นมาช่วยหา key ใน L-File กันได้บ้างแล้วน๊ะครับเทคนิคข้างต้น สามารถนำไปใช้ได้กับ งานหลายประเภท จะเรียกเทคนิคนี้ว่า API (Application Program Interface) "ย่อมๆ" เราใช้คำสั่งพื้นฐาน และหาทางติดต่อกับชุดคำสั่งของ OS แต่ที่เรียกว่า "ย่อมๆ" เพราะ เราต้องเขียนโปรแกรมเองค่อนข้างมาก
ตัวคำสั่งแต่ละตัวจะเห็นข้อมูลปริมาณมาก แต่ในการใช้งาน ผมได้เลือกใช้เฉพาะที่เข้าใจง่าย
ผู้อ่านสามารถเพิ่มรายละเอียดต่างๆ ได้ตามสภาพแวดล้อมของตนเองได้ เช่น L-File Key มีการกำหนด Select/Omit เป็นต้น