Friday, May 25, 2012

การสร้าง Crystal Report กับ DataSet หรือ DataTable (VB.NET,C#) winform


การสร้าง 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 (เป้นตารางรายละเอียดลูกค้าใช้ยอดเงิน)

Crystal Report กับ DataSet หรือ DataTable


Crystal Report กับ DataSet หรือ DataTable


แต่หลัก ๆ จะใช้แค่ Table เดียวคือ audit เพื่อจะ Query ข้อมูลของลูกค้ามาโชว์ เหมือนในรูป

Crystal Report กับ DataSet หรือ DataTable


โครงสร้าง ตาราง และข้อมูล ของ 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 ตามโครงสร้าง



มาเริ่มกันเลย

Crystal Report กับ DataSet หรือ DataTable

สร้าง Form ดังรูป ซึ่งประกอบด้วย Control ของ Textbox , Button และ CrystalReportViewer


Crystal Report กับ DataSet หรือ DataTable

ให้คลิกขวาที่ Project -> Add -> New Item


Crystal Report กับ DataSet หรือ DataTable

เลือกสร้าง DataSet


Crystal Report กับ DataSet หรือ DataTable

คลิกขวาที่ Form ของ DataSet -> Add -> DataTable


Crystal Report กับ DataSet หรือ DataTable

จะได้ DataTable ขึ้นมาตัวหนึ่ง ให้คลิกขวาที่ DataTable เลือก Add -> Column เหมือนในรูป

สำหรับ Report นี้เราจะดึงข้อมูลจากตาราง audit มาแสดง จะต้องสร้าง DataTable ฟิวด์รองรับจำนวน DataSource ที่จะสร้าง ซึ่งตอนนี้มีอยู่ 4 ฟิวด์ คือ
- AuditID
- CustomerID
- Date
- Used



Crystal Report กับ DataSet หรือ DataTable

กำหนดชื่อฟิวด์


Crystal Report กับ DataSet หรือ DataTable

สร้างให้ครบทุกฟิวด์ เหมือนในรูป


Crystal Report กับ DataSet หรือ DataTable

เปลี่ยนชื่อ DataTable ใหม่ให้เป็น myDataTable จะได้จดทำง่ายหน่อย ถ้าเรียบร้อยแล้วให้ปิดหน้าจอนี้ไปได้เลย (ตอนนี้ได้สร้าง DataSet และ DataTable ชื่อ myDataTable ไว้แล้ว)


Crystal Report กับ DataSet หรือ DataTable

กลับมาที่ Project ให้คลิกขวาที่ Project -> Add -> New Item


Crystal Report กับ DataSet หรือ DataTable

เลือก Crystal Report ให้กำหนดชื่อให้เรียบร้อย


Crystal Report กับ DataSet หรือ DataTable

จะมีหน้าต่าง Pop ขึ้นให้เลือก Using the Report Wizard และ OK


Crystal Report กับ DataSet หรือ DataTable

อันนี้ให้เลือก Project Data-> ADO.NET DataSets -> myDataTable (ที่ได้สร้างไว้ในขั้นตอนการสร้าง DataSet และ DataTable)


Crystal Report กับ DataSet หรือ DataTable

เลือกฟิวด์ Fields ข้อมูลทีต้องการแสดงใน Report และคลิกที่ Finish เพื่อเสร็จสิ้นการออกแบบ แต่ถ้าหากต้องการกำหนดค่าอื่น ๆ ของ Report ลองคลิกที่ Next เพื่อปรับแต่ง Report


Crystal Report กับ DataSet หรือ DataTable

หน้าตา Design Report ที่สามารถปรับแต่งรายละเอียดอื่น ๆ ได้ตามความต้องการ


Crystal Report กับ DataSet หรือ DataTable

กลับมาที่หน้า 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.ObjectByVal 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

Crystal Report กับ DataSet หรือ DataTable

ทดสอบการรัน 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 : 
http://www.thaicreate.com/dotnet/crystal-report-dataset-datatable.html

1 comment:

  1. คือง เวลาที่ผมรันแล้ว ผมกรอกชื่อกับอีเมลล์แล้วกด enter เพื่อขึ้นบันทัดใหม่ ผมต้องการให้ ตัวเลขในช่อง customer มันเพิ่มขึ้นเอง อย่างเช่น
    customer id
    1 กรอกแล้ว enter
    2 ...

    (ซึ่งตัวเลขในช่อง customer ผมอยากให้มันเพิ่มเอง ผมต้องทำยังไงคับ)

    ReplyDelete