[Report] Logic ผิด หรือเราไม่รู้ การทำงานของมัน

วันนี้ได้ไปช่วยพี่ที่ทำงานมา ซึ่งตัวรายงานมี Layout ดังนี้ (ขอเบลอรูปนิดนึง 55)

โดยโจทย์มีอยู่ว่า ชื่อของรายงาน @ReportName(หมายเลข 1 ในรูป) ขึ้นอยู่ผลรวม(SUM) ของ field (หมายเลข 2 ในรูป) โดยมีเงื่อนไข ดังนี้

  • กรณีที่ค่าเป็นบวก: ให้แสดงชื่อรายงานเป็น "สรุปรายงานการรับ/จ่ายเงินส่วน(ตราสารทุน) - Incoming"
  • กรณีที่ค่าเป็นลบ: ให้แสดงชื่อรายงานเป็น "สรุปรายงานการรับ/จ่ายเงินส่วน(ตราสารทุน) - Outgoing"

ซึ่งในตัว Crystal Report เราสามารถเขียน formula เพื่อกำหนดการแสดงผลได้ ดังนี้

If {#SumNetAmountGrandTotal} > 0 then
"สรุปรายงานการรับ/จ่ายเงินส่วน(ตราสารทุน) - Incoming"
Else
"สรุปรายงานการรับ/จ่ายเงินส่วน(ตราสารทุน) - Outgoing"

แต่เมื่อลองรัน Application และแสดงรายงานดูปรากฏว่า เงื่อนไขที่ได้กำหนดไว้ ไม่ทำงาน

แล้วสาเหตุ คือ อะไร ?

ลองกลับมาดูการทำงานของ Report กัน ตัว Crystal Report มีการ Render เหมือน Printer หรือถ้าในภาษาขอ Programming คือ Interpreter นี้แหละ เมื่อเรารู้ Consept การทำงานของการสร้าง Report แล้ว วกกลับมาดูที่ Layout ของ Report พบว่าส่วนของ @ReportName(หมายเลข 1 ในรูป) ถูกทำงานก่อนที่ระบบหาค่า (หมายเลข 2 ในรูป) ที่ถูกรวม (SUM) ก่อนอีก ?

รู้สาเหตุแล้ว แก้ปัญหาอย่างไร ?

เมื่อเข้าใจการทำงานของ Report ที่ทำงานจากบนลงล่างแบบ printer ดังนั้น วิธีแก้ คือ ต้องหาผลรวม(SUM) field ก่อนเข้าเงื่อนไข โดยแก้ไข formula ดังนี้

If Sum({TMPSETTLEMENT_EQREPORT.NETAMOUNT}) > 0 then
"สรุปรายงานการรับ/จ่ายเงินส่วน(ตราสารทุน) - Incoming"
Else
"สรุปรายงานการรับ/จ่ายเงินส่วน(ตราสารทุน) - Outgoing"

หมายเหตุ: จริงๆวิธีแก้ไขกับปัญหานี้มีได้หลายแบบ แต่ที่ผู้เขียนได้ยกตัวอย่างมา เพื่อให้ผู้อ่านได้เข้าใจ Consept การทำงานของ Report Writer แบบต่างๆ ซึ่งไม่จำเป็นต้องเป็น Crystal Report อย่างเดียวครับ 😀


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.