ตอนแรกคิดว่า จะไม่เขียนบทความนี้
แต่น้องที่บริษัทฯ ทักว่าถ้าทำงานได้เร็ว (ท่อง โครงสร้างหลัก) ให้เขียนไว้ให้ดูด้วย
(ปรกติ จะต้องเขียนบ่อยๆ จนจำได้เอง)
รายงานที่พบเห็นกันบ่อย
Section Model Grp ItemNo Qty
AAA M111 A IT300 100
AAA M111 B IT310 100
AAA M111 K IT320 100
AAA M111 D IT330 100
---------------------------------------
ttl#2 M111 400
AAA M222 I IT500 100
AAA M222 F IT510 100
AAA M222 G IT520 100
----------------------------------------
ttl#2 M222 300
----------------------------------------------------------------
ttl#1
AAA 700
BBB X444 A IT360 100
BBB X444 B IT360 100
BBB X444 D IT362 100
---------------------------------------
ttl#2 ttl X444 300
BBB X555 I IT550 100
BBB X555 F IT552 100
---------------------------------------
ttl#2 X555 200
---------------------------------------------------------------
ttl#1
BBB 500
===============================================================
Grand
ttl 1200
Summary
by Group
A 200
B 200
K 100
D 200
I 200
F 200
G 100
รายงานในลักษณะข้างต้น User
มองเห็นต่อเนื่องกัน
1 ชุด
แต่สำหรับ IT แยกเป็น 2 ส่วนใหญ่ คือ ส่วนบน แสดงรายการอย่างละเอียด และ ส่วนล่าง แสดงแบบสรุป
แต่สำหรับ IT แยกเป็น 2 ส่วนใหญ่ คือ ส่วนบน แสดงรายการอย่างละเอียด และ ส่วนล่าง แสดงแบบสรุป
ส่วนบน ข้อมูลเรียงตาม Section, Model, ItemNo (ไม่ใด้เรียงตาม Grp)
ถ้าจะใช้ ดูแล้วเข้าใจง่าย ควรวาง Grp ไว้หลัง Item no
## ใช้ SQL ##
SQL จะ run แล้วได้ data ที่พร้อมใช้งาน 1 ชุด ใน ASP.net จะ bind เข้ากับ GridView
เราสามารถเขียน RPG ใน Style นี้ได้ แต่ code จะยาวกว่า (ย้อนไปดู หัวข้อ RPG เรียกใช้ SQL ครับ) สำหรับรายงานข้างต้น ต้องเขียน 2 ชุด
เราสามารถเขียน RPG ใน Style นี้ได้ แต่ code จะยาวกว่า (ย้อนไปดู หัวข้อ RPG เรียกใช้ SQL ครับ) สำหรับรายงานข้างต้น ต้องเขียน 2 ชุด
A. SQL สำหรับ
ส่วนบน
SQL
: Select ..(a).. From
Lib.File (b) Where (c) Order
by (d)
SQL
: Select ..(a).. From
Lib.File (b1) Left Join Lib.File
(b2) on … lWhere (c) Order
by (d)
Tip เพื่อความเร็ว ใน Where ต้องใช้
Field เหมือนใน Index
ข้อมูลควรจะเรียง ตามที่ User เห็น (เข้าใจง่าย)
ขณะที่ Bind ต้องแทรก พิมพ์ Sub-Total ด้วย
ขณะที่ Bind ต้องแทรก พิมพ์ Sub-Total ด้วย
B. SQL สำหรับ
ส่วนล่าง
SQL
: Select (ax), sum From Lib.File (b)
Where (c) Group by (ax) Order by (d)
## ใช้ Tool (เช่น Crytal Report, Run Query) ##
วิธีคล้ายกับ SQL พื้นฐาน แต่มีตัวช่วย
สร้าง Sub Total เพียงแค่บอก เลือก Field (ที่อยู่ใน Order
by)
เนื่องจากการทำ Sub-Total มักจะแสดงเมื่อเปลี่ยนกลุ่ม (ข้อมูลที่เรียงไว้ดีแล้ว)
เนื่องจากการทำ Sub-Total มักจะแสดงเมื่อเปลี่ยนกลุ่ม (ข้อมูลที่เรียงไว้ดีแล้ว)
## ใช้ RPG กับ DB2/400 ##
1.
เลือก File หลัก ที่มี Field เรียงลำดับเหมือนกับ รายงาน ->หา Logical-File
ตย. ข้างต้น L-File เรียงตาม
Sect,Model,ItemNo
ถ้า L-File ไม่มี,
"ขาด
Field" (เช่น ไม่มี Model) ต้องสร้าง L-File ใหม่
DB Design
จากความสัมพันธ์ (ER) จะพบว่า Model
ไม่ควรจัดเก็บรวมกับ ItemNo ไว้ใน Physial
File, Logical File เดียวกัน แต่การออกแบบใน DB2/400 ที่เขียนโดย
RPG แบบดั้งเดิม จะต้องรวมกัน ใช้วิธีนี้กันมาก
Q: ถ้ามี L-File หลายตัว จะเลือกอย่างไร ?
A: เข้าไปดูที่ Source File (QDDSSRC) หรือ ดู object ด้วยคำสั่ง
DSPFD
ถ้ามี L-File มากคงจะลำบากครับ ควรสร้าง Tool มาช่วย (จะอธิบายในครั้งต่อไป)
ถ้ามี L-File มากคงจะลำบากครับ ควรสร้าง Tool มาช่วย (จะอธิบายในครั้งต่อไป)
2. เลือกเทคนิค สำหรับ รายงานส่วนล่าง
2.1 ทุกครั้งที่สร้างรายงานส่วนบน
1 row ให้คำนวณสร้าง รายงานส่วนล่าง (เหมาะกับ ข้อมูลที่เปลี่ยนแปลง ตลอดเวลา เช่น
งานรับ/จ่าย
ทำให้ รวมค่าจากด้านบน = ด้านล่างเสมอ)เขียนยุ่งยากกว่า
2.2 อ่านข้อมูลใหม่ เพื่อทำรายงานส่วนล่าง (เลือก L-File ใหม่ที่เหมาะ)(เหมาะกับ ข้อมูลที่ “ไม่เปลี่ยนแปลง” เช่น ข้อมูลหลังปิดบัญชี เป็นต้น)เขียนง่ายมากผู้เขียนมักเลือก 2.1
(เพราะใช้ได้กับทุกกรณี)
3. เขียนโปรแกรม
สำหรับ รายงานส่วนบน
Loop อ่านข้อมูลจาก File หลัก
ตรวจสอบ Filter เช่น ไม่แสดงข้อมูลที่ Qty =
0
ตรวจสอบ ทำงานเฉพาะ ครั้งแรก
ตรวจสอบ การเปลี่ยนกลุ่ม (เพื่อพิมพ์ Sub total, Clear ค่า, ตั้งค่าเริ่มต้นใหม่)
ทุกครั้งที่อ่าน File หลัก 1 Row ให้ไปอ่าน File รอง หรือ ส่วนขยาย (เช่น ItemName, Color)
สังเกต
การปรับแต่ง/แก้ปัญหา มักจะแยกเป็น
3 จุด คือ เริ่มต้น Loop, ใน Loop และ สิ้นสุดLoop
FAQ
Q1: เริ่มต้น (รอบแรก) Sub-total พิมพ์เกินออกมา ... เพิ่มตัวเช็คว่าเคยพิมพ์
หรือยัง (first#)
Q2: หลังเปลี่ยนกลุ่ม ค่าไม่ถูก reset ... ใช้ตัวแปร
เก็บค่าเก่า สำหรับเช็คเปลี่ยนกลุ่ม เช่น O#xxxx, T1Sum
Q3: หลังเปลี่ยนกลุ่ม หลัก
ไม่พิมพ์ กลุ่มย่อย ... ต้องพิมพ์กลุ่มย่อย ให้ครบ ก่อนจึงพิมพ์กลุ่มหลัก
Q4: หลังหมด data ไม่พิมพ์
Sub Total … ต้องพิมพ์
Q5: ถ้าไม่มี data ต้องไม่พิมพ์
Grand Total … เพิ่มตัวเช็คว่าเคยพิมพ์ (ใช้ร่วมกับ Q1
ได้)
ตย. Psudo Code ด้านล่าง เขียนเป็น Template ที่ครอบคลุมปัญหาข้างต้น (อาจจะดูยาวไปนิด)
fiest# = 'Y'
Key15 Setll L-File
Key14 ReadE L-File
Do While EoF, End of Key
'---More
Filter
'----init 1st Time
If first# = Y'
Then
fiest#
= 'N'
O#Itno
= L1Itno
O#IModl
= L1Modl
End
'---------------------------------------------------
If Chg-Lvl-1 (O#Modl <> L1Modl) Then
Print Total Lvl-1
O#Itno
= L1Itno, T1Sum = 0
Print Total Lvl-2
O#Modl
= L1Modl, T2Sum = 0
Else
If Chg-Lvl-2 (O#Itno <> L1Itno) Then
Print Total Lvl-2
O#Itno
= L1Itno, T1Sum = 0
End
End
'---------------------------------------------------
'---อ่าน File รอง (เช่น ItemNo -> File -> ItemName, Draw,Color, ...)
Add T1Sum, T2Sum
Print
Detail
Key14 ReadE L-File
End Do
if first# = 'N'
Then
Print Total Lvl-2
O#Itno
= L1Itno
Print Total Lvl-1
O#Modl
= L1Modl
Print Grand Total
End
End
Tip ถ้าการเช็คเปลี่ยนกลุ่ม มีขนาดมาก
(เช่น Qty,Amt มี 8 field) สามารถแยก code ที่ซ้ำๆกัน ไปเป็น Sub-Routine
ไม่มีความคิดเห็น:
แสดงความคิดเห็น