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

มาทำรายงานกัน


ตอนแรกคิดว่า จะไม่เขียนบทความนี้
แต่น้องที่บริษัทฯ ทักว่าถ้าทำงานได้เร็ว  (ท่อง โครงสร้างหลัก)  ให้เขียนไว้ให้ดูด้วย
(ปรกติ จะต้องเขียนบ่อยๆ จนจำได้เอง)

รายงานที่พบเห็นกันบ่อย

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 ส่วนใหญ่  คือ  ส่วนบน  แสดงรายการอย่างละเอียด และ  ส่วนล่าง แสดงแบบสรุป
ส่วนบน  ข้อมูลเรียงตาม  Section, Model, ItemNo  (ไม่ใด้เรียงตาม Grp)
ถ้าจะใช้  ดูแล้วเข้าใจง่าย  ควรวาง Grp ไว้หลัง Item no

## ใช้ SQL  ##

SQL จะ run แล้วได้ data ที่พร้อมใช้งาน 1 ชุด  ใน ASP.net  จะ bind เข้ากับ  GridView
เราสามารถเขียน
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 ด้วย
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   มักจะแสดงเมื่อเปลี่ยนกลุ่ม (ข้อมูลที่เรียงไว้ดีแล้ว)

## ใช้ 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 มาช่วย  (จะอธิบายในครั้งต่อไป)

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
Tip          ถ้าการเช็คเปลี่ยนกลุ่ม  มีขนาดมาก (เช่น Qty,Amt มี 8 field)  สามารถแยก code ที่ซ้ำๆกัน  ไปเป็น Sub-Routine 





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

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