การสร้าง Crystal Report กับ DataSet หรือ DataTable (VB.NET,C#) บทความนี้ Advanced ขึ้นมาอีกนิดสำหรับการสร้าง Report ของ Crystal Report กับ DataSet หรือ DataTable ของ .NET Framework เพราะแทนที่เราจะใช้ Wizard Connection ของ Crystal Report ในการ Connect กับ Database แต่เราจะใช้วิธีการสร้าง DataSource ขึ้นมาเองบน .NET Framework ด้วยภาษา VB.NET หรือ C# ผ่าน DataSet และ DataTable วิธีนี้มีประโยชน์ตรงที่เราสามารถจัดการกับ DataSet หรือ DataSource ให้ได้ตรงกับความต้องการแล้ว ค่อยโยนค่าให้กับ DataSource ของ Crystal Report เพื่อทำการแสดงผล Report ออกมา เป็นวิธีหนึ่งที่ช่วยให้การจัดการรัน Result ได้ง่ายยิ่งขึ้น หรือถ้าใครถนัดกับการเขียนผ่าน Formula ของ Crystal Report ก็สามารถทำได้เช่นเดียวกัน Basic สร้าง Crystal Report บน Visual Studio (VB.NET , C#) Step by Step สำหรับตัวอย่างนี้จะใช้ Table 2 ตัว คือ - customer (เป็นตารางเก็บข้อมูล) - audit (เป้นตารางรายละเอียดลูกค้าใช้ยอดเงิน) แต่หลัก ๆ จะใช้แค่ Table เดียวคือ audit เพื่อจะ Query ข้อมูลของลูกค้ามาโชว์ เหมือนในรูป โครงสร้าง ตาราง และข้อมูล ของ SQL Server สำหรับทดสอบ customer 01. USE [mydatabase] 02. GO 03. /****** Object : Table [dbo].[customer] Script Date : 03/13/2012 13:42:18 ******/ 04. SET ANSI_NULLS ON 05. GO 06. SET QUOTED_IDENTIFIER ON 07. GO 08. SET ANSI_PADDING ON 09. GO 10. CREATE TABLE [dbo].[customer]( 11. [CustomerID] [varchar](4) NOT NULL, 12. [Name] [varchar](50) NULL, 13. [Email] [varchar](50) NULL, 14. [CountryCode] [varchar](2) NULL, 15. [Budget] [float] NULL, 16. [Used] [float] NULL, 17. CONSTRAINT [PK_customer] PRIMARY KEY CLUSTERED 18. ( 19. [CustomerID] ASC 20. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 21. ) ON [PRIMARY] 22. 23. INSERT INTO customer VALUES ( 'C001', 'Win Weerachai', 'win.weerachai@thaicreate.com', 'TH', 1000000, 600000); 24. INSERT INTO customer VALUES ( 'C002', 'John Smith', 'john.smith@thaicreate.com', 'EN', 2000000, 800000); 25. INSERT INTO customer VALUES ( 'C003', 'Jame Born', 'jame.born@thaicreate.com', 'US', 3000000, 600000); 26. INSERT INTO customer VALUES ( 'C004', 'Chalee Angel', 'chalee.angel@thaicreate.com', 'US', 4000000, 100000); 27. 28. GO 29. SET ANSI_PADDING OFF audit 01. USE [mydatabase] 02. GO 03. /****** Object : Table [dbo].[audit] Script Date : 03/13/2012 13:45:08 ******/ 04. SET ANSI_NULLS ON 05. GO 06. SET QUOTED_IDENTIFIER ON 07. GO 08. SET ANSI_PADDING ON 09. GO 10. CREATE TABLE [dbo].[audit]( 11. [AuditID] [varchar](4) NOT NULL, 12. [CustomerID] [varchar](4) NULL, 13. [ Date ] [datetime] NULL, 14. [Used] [float] NULL, 15. CONSTRAINT [PK_audit] PRIMARY KEY CLUSTERED 16. ( 17. [AuditID] ASC 18. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 19. ) ON [PRIMARY] 20. 21. INSERT INTO audit VALUES (1, 'C001', '2008-08-01', 100000); 22. INSERT INTO audit VALUES (2, 'C001', '2008-08-05', 200000); 23. INSERT INTO audit VALUES (3, 'C001', '2008-08-10', 300000); 24. INSERT INTO audit VALUES (4, 'C002', '2008-08-02', 400000); 25. INSERT INTO audit VALUES (5, 'C002', '2008-08-07', 100000); 26. INSERT INTO audit VALUES (6, 'C002', '2008-08-15', 300000); 27. INSERT INTO audit VALUES (7, 'C003', '2008-08-20', 400000); 28. INSERT INTO audit VALUES (8, 'C003', '2008-08-25', 200000); 29. INSERT INTO audit VALUES (9, 'C004', '2008-07-04', 100000); 30. INSERT INTO audit VALUES (10, 'C005', '2008-07-04', 200000); 31. 32. GO 33. SET ANSI_PADDING OFF นำ Query ไปรันหรือสร้าง Database ตามโครงสร้าง มาเริ่มกันเลย สร้าง Form ดังรูป ซึ่งประกอบด้วย Control ของ Textbox , Button และ CrystalReportViewer ให้คลิกขวาที่ Project -> Add -> New Item เลือกสร้าง DataSet คลิกขวาที่ Form ของ DataSet -> Add -> DataTable จะได้ DataTable ขึ้นมาตัวหนึ่ง ให้คลิกขวาที่ DataTable เลือก Add -> Column เหมือนในรูป สำหรับ Report นี้เราจะดึงข้อมูลจากตาราง audit มาแสดง จะต้องสร้าง DataTable ฟิวด์รองรับจำนวน DataSource ที่จะสร้าง ซึ่งตอนนี้มีอยู่ 4 ฟิวด์ คือ - AuditID - CustomerID - Date - Used กำหนดชื่อฟิวด์ สร้างให้ครบทุกฟิวด์ เหมือนในรูป เปลี่ยนชื่อ DataTable ใหม่ให้เป็น myDataTable จะได้จดทำง่ายหน่อย ถ้าเรียบร้อยแล้วให้ปิดหน้าจอนี้ไปได้เลย (ตอนนี้ได้สร้าง DataSet และ DataTable ชื่อ myDataTable ไว้แล้ว) กลับมาที่ Project ให้คลิกขวาที่ Project -> Add -> New Item เลือก Crystal Report ให้กำหนดชื่อให้เรียบร้อย จะมีหน้าต่าง Pop ขึ้นให้เลือก Using the Report Wizard และ OK อันนี้ให้เลือก Project Data-> ADO.NET DataSets -> myDataTable (ที่ได้สร้างไว้ในขั้นตอนการสร้าง DataSet และ DataTable) เลือกฟิวด์ Fields ข้อมูลทีต้องการแสดงใน Report และคลิกที่ Finish เพื่อเสร็จสิ้นการออกแบบ แต่ถ้าหากต้องการกำหนดค่าอื่น ๆ ของ Report ลองคลิกที่ Next เพื่อปรับแต่ง Report หน้าตา Design Report ที่สามารถปรับแต่งรายละเอียดอื่น ๆ ได้ตามความต้องการ กลับมาที่หน้า Windows Form จากนั้นให้ Click ที่ Button เพื่อสร้าง Event ในการโหลด Report โดยใส่คำสั่งดังนี้ Code VB.NET 01. Imports CrystalDecisions.CrystalReports.Engine 02. Imports System.Data.SqlClient 03. Public Class frmReport 04. 05. Private Sub btnReport_Click( ByVal sender As System. Object , ByVal e As System.EventArgs) Handles btnReport.Click 06. Dim objConn As New SqlConnection 07. Dim objCmd As New SqlCommand 08. Dim dtAdapter As New SqlDataAdapter 09. 10. Dim ds As New DataSet 11. Dim dt As DataTable 12. Dim strConnString, strSQL As String 13. 14. strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase;Max Pool Size=400;Connect Timeout=600;" 15. strSQL = "SELECT * FROM audit WHERE CustomerID = '" & Me .txtCustomerID.Text & "' " 16. 17. objConn.ConnectionString = strConnString 18. With objCmd 19. .Connection = objConn 20. .CommandText = strSQL 21. .CommandType = CommandType.Text 22. End With 23. dtAdapter.SelectCommand = objCmd 24. 25. dtAdapter.Fill(ds, "myDataTable" ) 26. dt = ds.Tables(0) 27. 28. dtAdapter = Nothing 29. objConn.Close() 30. objConn = Nothing 31. 32. Dim rpt As New ReportDocument() 33. Dim directory As String = My.Application.Info.DirectoryPath 34. 'rpt.Load(directory & "\myCrystalReport1.rpt") 35. rpt.Load( "C:\DemoCrystalReport2\DemoCrystalReport2\myCrystalReport1.rpt" ) 36. rpt.SetDataSource(dt) 37. Me .CrystalReportViewer1.ReportSource = rpt 38. Me .CrystalReportViewer1.Refresh() 39. 40. End Sub 41. 42. End Class Code C# 01. using Microsoft.VisualBasic; 02. using System; 03. using System.Collections; 04. using System.Collections.Generic; 05. using System.Data; 06. using System.Diagnostics; 07. using CrystalDecisions.CrystalReports.Engine; 08. using System.Data.SqlClient; 09. public class frmReport 10. { 11. 12. private void btnReport_Click(System.Object sender, System.EventArgs e) 13. { 14. SqlConnection objConn = new SqlConnection(); 15. SqlCommand objCmd = new SqlCommand(); 16. SqlDataAdapter dtAdapter = new SqlDataAdapter(); 17. 18. DataSet ds = new DataSet(); 19. DataTable dt = null ; 20. string strConnString = null ; 21. string strSQL = null ; 22. 23. strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase;Max Pool Size=400;Connect Timeout=600;" ; 24. strSQL = "SELECT * FROM audit WHERE CustomerID = '" + this .txtCustomerID.Text + "' " ; 25. 26. objConn.ConnectionString = strConnString; 27. var _with1 = objCmd; 28. _with1.Connection = objConn; 29. _with1.CommandText = strSQL; 30. _with1.CommandType = CommandType.Text; 31. dtAdapter.SelectCommand = objCmd; 32. 33. dtAdapter.Fill(ds, "myDataTable" ); 34. dt = ds.Tables[0]; 35. 36. dtAdapter = null ; 37. objConn.Close(); 38. objConn = null ; 39. 40. ReportDocument rpt = new ReportDocument(); 41. string directory = My.Application.Info.DirectoryPath; 42. //rpt.Load(directory & "\\myCrystalReport1.rpt") 43. rpt.Load( "C:\\DemoCrystalReport2\\DemoCrystalReport2\\myCrystalReport1.rpt" ); 44. rpt.SetDataSource(dt); 45. this .CrystalReportViewer1.ReportSource = rpt; 46. this .CrystalReportViewer1.Refresh(); 47. 48. } 49. 50. } หลังจากวาง Code เรียบร้อยแล้ว ลองกดที่ Run เพื่อดูผลลัพธ์ของ Report ทดสอบการรัน Report จะได้ผลเหมือนในรูป จากตัวอย่างจะเห็นว่ามีการใช้ ADO.NET ในการ Connect กับฐานข้อมูล SQL Server Database ผ่าน Connection String และมีการสร้าง DataSet ผ่าน Query SELECT * FROM audit WHERE CustomerID = '" + this.txtCustomerID.Text + "' เพื่อรับค่าจาก Textbox จากนั้นจะมีการ Fill ข้อมูลให้กับ DataTable ชื่อ myDataTable (ซึ่งเราได้สร้างไว้ในขั้นตอนการออกแบบ Crystal Report) ซึ่ง Data ที่เรา Query จะต้อง Map และพอดีกับจำนวนฟิวด์ที่ได้ออกแบบไว้ใน Crystal Reportจากนั้นเมื่อได้ DataTable ก็จะโยนค่า DataSource ด้วยคำสั่ง rpt.SetDataSource(dt) และ Report ก็จะแสดงข้อมูลตามที่ได้ Query ไว้ Download Code!! ref : |
Friday, May 25, 2012
การสร้าง Crystal Report กับ DataSet หรือ DataTable (VB.NET,C#) winform
Labels:
C# Winapp,
Crystal Reports
Subscribe to:
Post Comments (Atom)
คือง เวลาที่ผมรันแล้ว ผมกรอกชื่อกับอีเมลล์แล้วกด enter เพื่อขึ้นบันทัดใหม่ ผมต้องการให้ ตัวเลขในช่อง customer มันเพิ่มขึ้นเอง อย่างเช่น
ReplyDeletecustomer id
1 กรอกแล้ว enter
2 ...
(ซึ่งตัวเลขในช่อง customer ผมอยากให้มันเพิ่มเอง ผมต้องทำยังไงคับ)