Crystal Report : Report หลายตัวหัวท้ายต่าง แต่ตรงกลาง Code เหมือนกัน จัดการอย่างไร (WinApp)

หลาย ๆ ครั้งที่ท่านมีรายงานมากกว่า 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 เดียวได้แล้ว เย้!

ถ้าผู้อ่านมีวิธีที่ดีกว่า สะดวกกว่า สามารถแนะนำได้นะคะ จะขอบคุณยิ่งเลยค่า ^/\^ และหวังว่าจะมีประโยชน์ต่อผู้อ่านไม่มากก็น้อยนะคะ จนกว่าจะพบกันใหม่ สวัสดีค่ะ 🙂