วันนี้ได้ไปช่วยพี่ที่ทำงานมา ซึ่งตัวรายงานมี Layout ดังนี้ (ขอเบลอรูปนิดนึง 55)
โดยโจทย์มีอยู่ว่า ชื่อของรายงาน @ReportName(หมายเลข 1 ในรูป) ขึ้นอยู่ผลรวม(SUM) ของ field #SumNetAmountGrandTotal(หมายเลข 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 ในรูป) ถูกทำงานก่อนที่ระบบหาค่า #SumNetAmountGrandTotal(หมายเลข 2 ในรูป) ที่ถูกรวม (SUM) ก่อนอีก ?
รู้สาเหตุแล้ว แก้ปัญหาอย่างไร ?
เมื่อเข้าใจการทำงานของ Report ที่ทำงานจากบนลงล่างแบบ printer ดังนั้น วิธีแก้ คือ ต้องหาผลรวม(SUM) field #SumNetAmountGrandTotal ก่อนเข้าเงื่อนไข โดยแก้ไข 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.