การพัฒนาแอพพลิเคชันในปัจจุบัน ส่วนใหญ่จะเกี่ยวข้องกับข้อมูลเสียเป็นส่วนใหญ่ และสิ่งหนึ่งที่นักพัฒนาหลีหนีไม่พ้นนั่นคือ การนำเอาข้อมูลที่เก็บไว้ในระบบกลับไปใช้งานต่อในรูปแบบ ของรายงานต่างๆ และหนึ่งในเครื่องมือที่ใช้ในการออกแบบรายงาน ที่เหล่านักพัฒนามือเก๋าทั้งหลายต่างต้องเคยสัมผัสกันมาบ้างบนถนนแห่งความเป็นกรรมกรซอฟต์แวร์ นั่นคือ Crystal Report ซึ่งเป็นแอพพลิเคชันที่ช่วยให้นักพัฒนาสามารถออกแบบรายงานได้อย่างง่ายๆ เพียงเรากำหนดแหล่งข้อมูล(DataSource)ให้มัน จากนั้นเราเพียงนำ DatabaseFields ไปวางบนฟอร์มรายงาน และจัดรูปแบบฟอร์มตามความต้องการ
และเป็นโชคดีของเหล่านักพัฒนาที่ใช้เครื่องมือ VS2008 เช่นกัน ที่ไม่จำเป็นต้องติดตั้งโปรแกรม Crystal Report เพิ่มเติมลงบนเครื่องเนื่องจากไมโครซอฟท์ได้ใส่ไว้ในเครื่องมือดังกล่าวให้เรียบร้อยแล้ว ซึ่งเป็น Crystal Report ตัวเล็กที่ไมโครซอฟท์ใส่ไว้ในชุดเครื่อง Visual Studio ซึ่งเวอร์ชั่นปัจจุบันใน VS2008 เป็นเวอร์ชั่น Crystal Reports 10.5 ซึ่งมีชื่อเรียกว่า Crystal Reports Basic for Visual Studio 2008 แม้จะเป็นเพียง Crystal Reports แบบพื้นๆ (Basic) แต่เราก็สามารถใช้ออกแบบรายงานได้ดีในระดับมืออาชีพ เรียกได้ว่ารายงานพื้นฐานทั่วไป เช่นรายงานในรูปแบบ รายการ, กราฟ, CrossTab หรือ รายงาน MstaterDetail แบบ ใช้ SubReport ก็สามารถใช้งานได้เช่นกัน ท่านผู้อ่านสามารถเทียบเคียงฟีเจอร์ระหว่าง Crystal Reports 2008 และ Crystal Reports Basic for Visual Studio 2008 ได้ที่นี่ครับ: {Crystal Reports for Visual Studio Comparison}
และในบทความนี้เราลองไปใช้งานเจ้า Crystal Reports Basic for Visual Studio 2008 ในการออกแบบรายงาน SubReport ผ่าน DataSet กันครับ และรูปที่ 1 จะเป็นหน้าจอรายงานเป้าประสงค์ของเราในครั้งนี้ครับ
รูปที่ 1 หน้าจอรายงาน SubReport
เมื่อเราได้ทราบเป้าประสงค์แล้ว เราไปดูขั้นตอนการพัฒนาแอพพลิเคชันกันเลยครับ
ขั้นตอนการพัฒนาแอพพลิเคชัน
- ขั้นตอนที่ หนึ่ง: สร้างโปรเจ็กต์
- ขั้นตอนที่ สอง: สร้าง DataSet
- ขั้นตอนที่ สาม: สร้างรายงานจาก Crystal Report
- ขั้นตอนที่ สี่: สร้างรายงานย่อย
- ขั้นตอนที่ ห้า: สร้าง Parameter Fields
- ขั้นตอนที่ หก: ออกแบบหน้าจอดูรายงาน (ReportViewer)
- ขั้นตอนที่ เจ็ด: ใส่โค้ดดึงรายงาน
- ขั้นตอนที่ แปด: ทดสอบพิมพ์รายงาน
ขั้นตอนที่ หนึ่ง: สร้างโปรเจ็กต์
- หยิบเครื่องมือ VS2008 ขึ้นมา
- คลิกเมาส์ลงบน File => New Project…
- ในหน้าจอ New Project เลือกภาษา C# เทมเพลตเป็น ASP.NET Web Application
จากนั้นเราไปเพิ่มไอเทม DataSet เพื่อใช้ในการออกแบบรายงาน
ขั้นตอนที่ สอง: สร้าง DataSet
คลิกขวาบนโปรเจ็กต์ => เลือกเมนู Add New Item…
ในหน้าต่าง Add New Item => เลือกไอเทม DataSet ดังรูป
รูปที่ 2 ไอเทม DataSet
ในหน้าจอออกแบบ DataSet คลิก Server Explorer จะแสดงหน้าต่าง Server Explorer ให้คลิก Connect to DataBase
รูปที่ 3 หน้าจอ Server Explorer
ในหน้าต่าง Add Connection
ช่อง Data source: เลือกเป็น Microsoft SQL Server (SqlClient)
Server name:=ใส่ชื่อ Server ในที่นี้ชื่อ Server ผมใช้เป็น .SQLEXPRESS2008
Log on to the server: ให้เลือก Use SQL Serevr Authentication จากนั้นให้ป้อน User name และ Password ลงไป และติ๊กเลือก Save my password เพื่อระบบบันทึก password ไว้ในไฟล์ web.config
Connect to database: ให้เลือกชื่อ Database ในที่นี้ผมใช้ Northwind จากนั้นคลิกปุ่ม OK
รูปที่ 4 หน้าต่าง Add Connection
เมื่อเราทำการเชื่อมต่อ Server เรียบร้อยแล้วในหน้าต่าง Server Explorer ให้คลิกไปที่ชื่อ Connection ที่เราได้ไปเมื่อสักครู่ จากนั้นคลิกไปที่โหนด Table แล้วทำการลาก Table Categories และ Products ไปวางบน พื้นที่ออกแบ DataSet ดังรูป ขั้นตอนการสร้าง DataSet เป็นอันเรียบร้อย
รูปที่ 5
ขั้นตอนที่ สาม: สร้างรายงานจาก Crystal Report
คลิกขวาบนโปรเจ็กต์ => เลือกเมนู Add New Item…
ในหน้าต่าง Add New Item => เลือกไอเทม Crystal Report ดังรูป
รูปที่ 6 ไอเทม Crystal Report
เลือก Using the Report Wizard
DataSource ให้เลือก Project Data > ADO.NET DataSets > Categories
เลือก Field ที่ต้องการ แล้วคลิก Next > Next > Next > Finish การผูกแหล่งข้อมูลให้ Main report เป็นอันเรียบร้อย
รูปที่ 7 Report Wizard
ขั้นตอนที่ สี่: สร้างรายงานย่อย
คลิกเมาส์ขวาบน Section3(Detail a)=> Insert Section Below เราจะได้ DetailSection(Detail b)
คลกเมาส์ขวาใน DetailSection(Detail b) เลือกเมนู Insert => Subreport และวาง Subreport ลงไป
คลกเมาส์ขวาใน DetailSection(Detail b) เลือกเมนู Insert => Subreport และวาง Subreport ลงไป
รูปที่ 8 สร้างรายงานย่อย
ในหน้าต่าง Insert Sub report ให้เลือก Create a subreport with the Report Wizard ในช่อง New report name: ให้ป้อนชื่อ subreport
ในบทความนี้ใช้ชื่อ product จากนั้นคลิกปุ่ม Report Wizard
DataSource ให้เลือก Products > Next จากนั้นเลือก Field ที่ต้องการ => Next > Next > Next > Finish การผูกแหล่งข้อมูลให้ Subreport เป็นอันเรียบร้อย
ในบทความนี้ใช้ชื่อ product จากนั้นคลิกปุ่ม Report Wizard
DataSource ให้เลือก Products > Next จากนั้นเลือก Field ที่ต้องการ => Next > Next > Next > Finish การผูกแหล่งข้อมูลให้ Subreport เป็นอันเรียบร้อย
รูปที่ 9 SubReport with the Report Wizard
เมื่อเราทำการผูกข้อมูลให้ Subreport เป็นที่เรียบร้อยแล้ว ต่อไปเป็นการใส่ Link ให้กับ Subreport โดย MainReport และ SubReport Link กันโดยใช้ Field ที่เป็น FK (Foreign Key Relationships) ให้คลิกที่แทบ LINK
หมายเลข 1 ให้เลือก Field CategoryID
หมายเลข 2 คลิกปุ่ม OK การใส่ LINK ให้ Subreport เป็นอันเรียบร้อย
หมายเลข 2 คลิกปุ่ม OK การใส่ LINK ให้ Subreport เป็นอันเรียบร้อย
หมายเลข 3 ให้เพิ่ม Text Object เพื่อใส่ป้ายชื่อใน MainReport ว่า Main Report
หมายเลข 4 เราไม่ต้องแสดงพื้อนที่ในส่วนของ ReportFooterSetion2(Report Footer b) ให้คลิกเมาส์ขวาบน Section ดังกล่าวแล้วเลือก Suppress(No Drill-Down) จากนั้นเราใส่ Text Object เพื่อแสดงป้ายชื่อ ว่า Sub Report
หมายเลข 4 เราไม่ต้องแสดงพื้อนที่ในส่วนของ ReportFooterSetion2(Report Footer b) ให้คลิกเมาส์ขวาบน Section ดังกล่าวแล้วเลือก Suppress(No Drill-Down) จากนั้นเราใส่ Text Object เพื่อแสดงป้ายชื่อ ว่า Sub Report
รูปที่ 10 สร้าง LINK ให้ SubReport
หน้าจอเมื่อเราทำการออกแบบรายงานเรียบร้อย MainReport จะอยู่ใน Section3 (Detail a) และ Subreport จะอยู่ใน DetailSection1(Detail b) ดังรูป
รูปที่ 11 หน้าจอรายงานที่ออกแบบเรียบร้อย
ขั้นตอนที่ ห้า: สร้าง Parameter Fields
ให้เราทำการเพิ่ม Parameter Fields เข้าไปบน MainReport และ Subreport เราจะใช้เป็นส่วนของหัวรายงาน เช่น
parameter ใน Main report เราจะผ่านค่าไปแสดงเป็น รายงานสินค้าตาม ประเภทเภทสินค้า
parameter ใน Subreport เราจะผ่านค่าไปแสดงเป็น รายงานสินค้า โดยเราผ่าค่าจากการใส่โค้ด ซึ่งจะกล่าวในหัวข้อถัดไป
parameter ใน Subreport เราจะผ่านค่าไปแสดงเป็น รายงานสินค้า โดยเราผ่าค่าจากการใส่โค้ด ซึ่งจะกล่าวในหัวข้อถัดไป
พูดถึงการสร้าง Parameter Fields ทำได้ง่ายเพียงคลิกเมาส์ไปที่ หน้าต่าง Field Explorer คลิกเมาส์ขวาบน Parameter Fields=>New
จากนั้นตั้งชื่อ Paramter เลือกประเภทข้อมูลที่เราจะส่งให้ Parameter ดังรูป
รูปที่ 12 สร้าง Parameter Fields
จากนั้นการนำเอา Parameter ไปแสดงในรายงาน โดยการคลิก แล้วลากไปวางในรายงาน
รูปที่ 13 วาง Parameter Fields ใน MainReport
ให้ทำการเพิ่ม Parameter ใน Subreport
รูปที่ 14 วาง Parameter Fields ใน SubReport
การปรับ Format ของ Parameter field หรือ Database fields ทำโดยการคลิกเมาส์ขวาบน Field obj ดังกล่าว จากนั้นเลือกเมนู Format Object ในหน้าต่าง Format Editor ให้ไปที่แทบ Font เราก็สามารถปรับ font , Style, หรือ Color ได้ และมีตัวอย่างในขณะเรากำลังแก้ไขในช่อง Sample cและเรายังสามารถ ใส่ Script formula เพื่อให้ปรับ font ตามเงื่อไขของเราจาก ปุ่ม X*2
รูปที่ 15 ปรับ Format ของ Parameter field
จากที่กล่าวมาขั้นต้นเป็นการกล่าวถึงขั้นตอนการออกแบบรายงาน ซึ่งเมื่อเราออกแบบรายงานเรียบร้อยแล้วเรายังไม่สามารถนำไปใช้งานได้ทันที เราต้องไปสร้างหน้าจอสำหรับแสดงรายงานให้ผู้ใช้งานด้วย และด้วยขั้นตอนการออกแบบรายงานมีหลายขั้นตอนดังกล่าว จึงเป็นเรื่องน่าเบื่อสำหรับนักพัฒนาหลายๆ ท่าน
ขั้นตอนที่ หก: ออกแบบหน้าจอดูรายงาน (ReportViewer)
การแสดงรายงานของ Crystal Report จะใช้คอนโทรลที่ชื่อว่า CrsyatlReportViewer ให้เราทำการลากคอนโทรลดังกล่าวไปวางในบนDefault.aspx แล้วทำการลาก TextBox 2 อัน ปุ่ม Button 1 ปุ่ม วางดังรูป จากนั้นไปใส่โค้ดเพื่อดึงข้อมูลไปพิมมพ์ออกรายงานเลยครับ
รูปที่ 16 ออกแบบหน้าจอดูรายงาน
ขั้นตอนที่ เจ็ด: ใส่โค้ดดึงรายงาน
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;
public partial class _Default : System.Web.UI.Page{protected override void OnInitComplete(EventArgs e){if (this.Session["ReportSource"] != null)CrystalReportViewer1.ReportSource = this.Session["ReportSource"];base.OnInitComplete(e);
}protected void Page_Load(object sender, EventArgs e){}protected void btFind_Click(object sender, EventArgs e){string strConn = WebConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;string sql = "";
if (txtCategory.Text != "" && txtProducts.Text != "")
sql = " SELECT * FROM Categories Where CategoryName Like '%" + txtCategory.Text.Trim() + "%'; " +" SELECT * FROM Products Where ProductName like '%" + txtProducts.Text.Trim() + "%';";else if (txtCategory.Text != "")sql = " SELECT * FROM Categories Where CategoryName Like '%" + txtCategory.Text.Trim() + "%'; " +" SELECT * FROM Products Where CategoryID in (SELECT CategoryID FROM Categories "+
" Where CategoryName Like '%" + txtCategory.Text.Trim() + "%');";else if (txtProducts.Text != "")sql = " SELECT * FROM Categories Where CategoryID in (SELECT CategoryID FROM Products "+
" Where ProductName like '%" + txtProducts.Text.Trim() + "%'); " +" SELECT * FROM Products Where ProductName like '%" + txtProducts.Text.Trim() + "%'";else
sql = " SELECT * FROM Categories; " +
" SELECT * FROM Products; ";
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(strConn);
conn.Open();System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds);if (ds.Tables[0].Rows.Count > 0)
{CrystalDecisions.CrystalReports.Engine.ReportDocument rpt =new CrystalDecisions.CrystalReports.Engine.ReportDocument();
rpt.Load(Server.MapPath("CrystalReport.rpt"));
rpt.SetDatabaseLogon("sa", "enabler", ".\SQLEXPRESS2008", "Northwind");//โหลดข้อมูล Table Products {ds.Tables[1]} เข้า SubReport
rpt.Subreports[0].Database.Tables[0].SetDataSource(ds.Tables[1].DefaultView);//โหลดข้อมูล Table Categories {ds.Tables[0]} เข้า MainReport
rpt.SetDataSource(ds.Tables[0].DefaultView);//กำหนด Parameter บน MainReport
rpt.SetParameterValue("pmMain", "รายงานสินค้าตาม ประเภทเภทสินค้า");//กำหนด Parameter บน Subreport
rpt.SetParameterValue("pmSub", "รายงานสินค้า", "product");//เก็บ ReportSource บน Session
this.Session["ReportSource"] = rpt;CrystalReportViewer1.ReportSource =(CrystalDecisions.CrystalReports.Engine.ReportDocument)this.Session["ReportSource"];}}}
ขั้นตอนที่ แปด: ทดสอบพิมพ์รายงาน
เงื่อนไขการออกรายงาน เราสามารถกรองรายการสินค้าที่ต้องการพิมพ์รายงานโดยพิมพ์เงื่อนไขดังกล่าวลงไปบน TextBox Category และ Product ได้ ดังรูป
รูปที่ 17 ทดสอบพิมพ์รายงาน
การพิมพ์รายงานออกเครื่องพิมพ์จะไม่พิมพ์ผ่าน บราวเซอร์ แต่ Crystal report จะ Export ข้อมูลไปเป็น PDF เพื่อให้รูปแบบไม่ผิดเพี้ยงเมื่อถูกพิมพ์ออกจากเครื่องพิมพ์ ทำได้โดยการคลิกปุ่ม Print บน Toolbar จะมีหน้า Print the Report ให้เลือก All แล้วกดปุ่ม OK
รูปที่ 18 Export ข้อมูลไปเป็น PDF
เมื่อรายงานถูก Export เป็น PDF เป็นที่เรียบร้อยเราสามารรถกดเมื่อ Print บน Toolbar ของ Acrobat เพื่อพิมพ์รายงานออกเครื่องพิมพ์
รูปที่ 19 พิมพ์รายงานออกเครื่องพิมพ์
เป็นอย่างไรบ้างครับ สำหรับการออกแบบรายงานด้วย Crystal Reports Basic for Visual Studio 2008 บน VS2008 ใช้ได้ดีไม่แพ้ Crystal Report ตัวเต็มใช่ใหมครับ ให้โชคดีสุขีในวันปีใหม่ 2552 ขอให้โชคดีกันทุกๆ ท่านครับ
แหล่งข้อมูลอ้างอิง:
- Adding a Subreport to the Original Report: http://msdn.microsoft.com/en-us/library/ms227520(VS.80).aspx
- Crystal Reports for Visual Studio Comparison: http://www.businessobjects.com/product/catalog/crystalreports_visualstudio/comparison.asp
- New Features in Crystal Reports Basic for Visual Studio 2008: http://msdn.microsoft.com/en-us/library/bb669068.aspx
No comments:
Post a Comment