หลาย ๆ ครั้งที่ท่านมีรายงานมากกว่า 1 ฉบับที่มีรูปร่างหน้าตาส่วนหัวกระดาษหรือท้ายกระดาษที่ต่างกัน แต่ส่วนของ Detail นั้นเหมือนกันอย่างกับแกะ และเจ้าส่วน Detail นี้ ดั๊นนนน เป็นเจ้า Detail ที่มีเงื่อนไขเยอะแยะ ยุบยับซับซ้อนซ่อนเงื่อน ถ้าจะให้สร้าง File เพื่อวาง Report Viewer เป็น 2 File หรือตามจำนวนรายงานก็ใช่ที่
จากการที่ประสบพบเจอมากับตัว ส่วนหัว ส่วนท้าย ดั๊นนน ไม่คล้ายไม่เหมือนเลย แต่ข้อมูลตรงกลางนั้น ต้องใช้ข้อมูลชุดเดียวกัน เหมือนกัน ทีนี้ถึงกับกุมขมับเลยว่าจะทำยังไงดี ได้คำปรึกษาแนะนำจากพี่ชายที่แสนดี @wachirawit-j มาช่วยชี้แจงแถลงไข ถึงต้องรีบจัดการเก็บข้อมูลไว้ เผื่อครั้งหน้าเจออีกแล้วลืมจะได้กลับมาอ่านซ้ำ ไปดูกันเล้ยยยยยย
ReportClass cr = new ReportClass();
ตัวแปร cr ที่ประกาศนี้ จะเป็นตัวแปรที่ไว้ใช้ในอนาคตทั้งไฟล์ เป็นตัวแปรที่เป็นตัวเก็บค่าว่า จะเป็น Crystal Report File ตัวไหนและใช้สำหรับกำหนดค่า FormulaField เพื่อใช้กับ Report File นั้น ๆ ตัวอย่าง
cr.DataDefinition.FormulaFields["ffType"].Text = "'Normal'";
Code ข้างต้นเป็นการกำหนดค่าให้กับ Formula Field ที่ชื่อว่า ffType ในฝั่ง Crystal Report โดยกำหนดให้มีค่าเท่ากับข้อความว่า “Normal” ซึ่งจะเห็นว่ามีการใช้ตัวแปร cr ในการดำเนินการ
Code ส่วนอื่น ๆ ที่มีการกำหนดค่าก็จะมีการเรียกตัวแปร cr นี้เหมือนกัน ซึ่ง cr จะเป็นตัวที่บอกว่าคือ Crystal Report File ไหน
private class CRModel
{
public RptNormal crNormal {get; set;}
public RptSpecial crSpecial {get; set;}
}
Code ข้างต้นเป็นการสร้าง Class ชื่อว่า CRModel มีสมาชิกภายใน Class 2 Report นั่นคือ RptNormal.rpt กำหนดให้ใช้ตัวแปร crNormal และ RptSpecial.rpt กำหนดให้ใช้ตัวแปร crSpecial
จากนั้นในส่วนของการตรวจสอบว่าจะใช้ Report ตัวไหนหรือการกำหนด report ให้กับ Reportsource เป็นดังนี้
if(rptType == "normal") //ตรวจสอบว่าเป็นรายงานประเภทปกติ?
{
crModel.crNormal = new RptNormal(); //กำหนด crNormal ให้เป็นรายงาน RptNormal
SetValue(crModel, rptType); //เรียก Method กำหนดค่าต่าง ๆ ในรายงาน
crystalReportViewer1.ReportSource = crModel.crNormal; //กำหนด Reportsource ให้มีค่าเป็น crNormal
}
else
{
crModel.crSpecial = new RptSpecial(); //กำหนด crNormal ให้เป็นรายงาน RptSpecial
SetValue(crModel, rptType); //เรียก Method กำหนดค่าต่าง ๆ ในรายงาน
crystalReportViewer1.ReportSource = crModel.crSpecial; //กำหนด Reportsource ให้มีค่าเป็น crSpecial
}
private void SetValue(CRModel objCR, string rptType)
{
if(rptType == "normal")
{
cr = objCR.crNormal
}
else
{
cr = objCR.crSpecial
}
#Region Code ส่วนกำหนดค่าให้กับ cr
cr.DataDefinition.FormulaFields["ff1"].Text = "'123'";
cr.DataDefinition.FormulaFields["ff2"].Text = "'456'";
#endRegion
}
เพียงเท่านี้ก็จะสามารถจัดการ Code ที่ File เดียวได้แล้ว เย้!
ถ้าผู้อ่านมีวิธีที่ดีกว่า สะดวกกว่า สามารถแนะนำได้นะคะ จะขอบคุณยิ่งเลยค่า ^/\^ และหวังว่าจะมีประโยชน์ต่อผู้อ่านไม่มากก็น้อยนะคะ จนกว่าจะพบกันใหม่ สวัสดีค่ะ 🙂