Tải Crystal Report

Trong các phiên bản Visual Studio thường có kèm theo công cụ Crystal Report để tạo các báo cáo (report) cho ứng dụng. Tuy nhiên, kể từ Visual 2010 thì công cụ Crystal Report đã bị xoá. Nếu chúng ta muốn dùng Crystal Report thì chúng ta phải tải nó về và cài đặt.

Một cách phổ biến là dùng Google để tìm kiếm Crystal Report tương ứng với phiên bản Visual Studio. Ví dụ tôi đang dùng Visual Studio 2012 thì trong Google tôi sẽ gõ từ khoá tìm kiếm và sẽ chọn dòng liên kết đầu tiên (ô đỏ):

Khi nhấp vào dòng liên kết đầu tiên (ô đỏ) sẽ đến trang chứa liên kết đến nơi để tải Crystal Report:

Nhấp vào dòng liên kết (ô đỏ) để tải Crystal Report:

Cài đặt tập tin exe bằng cách nhấp đôi chuột trái vào tập tin vừa tải về:

Tạo một dự án Windows Form (VS 2012)

Chúng ta sẽ tạo một dự án Windows Form (dùng VB) như sau:

  1. Mở Visual Studio và chọn File > New > Project > Windows Form Application
  2. Đặt tên cho dự án là Report_Wins và nhấn OK.

Tôi sẽ minh hoạ với cơ sở dữ liệu (SQL Server) ngocminhtran với bảng Genre có lược đồ và dữ liệu như sau:

Lược đồ

Dữ liệu

Tạo một report đơn giản

Đầu tiên chúng ta sẽ tạo một tập tin XSD như một nguồn dữ liệu rỗng để chúng ta có thể dùng với các kiểu dữ liệu. Cách tạo XSD như sau:

  • Tạo tập tin XSD bằng cách nhấn chuột phải vào Report_Wins chọn Add > Add New Item > DataSet

  • Nhấn nút Add một màn hình rỗng xuất hiện:

  • Thêm một bảng dữ liệu rỗng (data table) vào tập tin XSD vừa tạo bằng cách nhấp chuột phải vào vùng trống màu xám và chọn Add > Datatable:

  • Một bảng dữ liệu tên DataTable1 được thêm vào màn hình:

  • DataTable1 được thêm vào tập tin XSD. Bây giờ chúng ta sẽ tạo các cột cho bảng DataTable1 và lưu ý rằng, các cột nên đặt tên theo đúng tên và kiểu dữ liệu của các cột trong bảng Genre ở trên và những cột được thêm trong bảng DataTable1 sẽ xuất hiện trong report. Để thêm cột Id (kiểu int) vào bảng DataTable1 ta nhấp chuột phải vào DataTable1 chọn Add > Column:

  • Gõ tên cột là Id. Nhấp chuột phải vào bên trái cột Id và chọn Properties:

  • Trong hộp thoại Properties chúng ta tìm đến DataType và chọn kiểu dữ liệu tương ứng (mặc định là kiểu System.String). Trong bảng Genre, cột Id có kiểu int và tương đương System.Int32 trong .NET Framework:

  • Tương tự tạo cột Name

  • Tạo cột SortOrder:

  • Id là khoá chính trong bảng Genre nên trong DataTable1 chúng ta cũng thiết lập nó làm khoá chính bằng cách nhấp chuột phải vào Id và chọn Set Primary Key:

  • Kết quả:

  • Lưu tất cả và đóng tập tin XSD.
  • Bây giờ chúng ta thêm Crystal Report bằng cách kích chuột phải vào Report_Wins trong cửa sổ Solution Explorer chọn Add > Add New Item > Crystal Report :

  • Khi nhấn nút Add để thêm Crystal Report sẽ xuất hiện hộp thoại Crystal Report Gallery như sau:

  • Nhấp OK sẽ xuất hiện hộp thoại và chúng ta sẽ chọn Project Data > ADO.NET DataSets > MyDataSample > DataTable1 như hình sau:

  • Nhấn vào nút > để thêm bảng DataTable1 vào khung Selected Tables bên phải:

  • Nhấn Finish sẽ xuất hiện màn hình như sau:

  • Các vùng trong một báo cáo:
    • Section1 (Report Header): các trường (hay cột) đặt trong vùng này được in một lần ở ngay đầu báo cáo.
    • Section2 (Page Header): các trường (hay cột) đặt trong vùng này được in tại đầu của mỗi trang mới.
    • Section3 (Details) : các trường (hay cột) đặt trong vùng này được in với mỗi hàng (hay bản ghi) mới.
    • Section4 (Report Footer)): các trường (hay cột) đặt trong vùng này được in một lần ở ngay cuối báo cáo.
    • Section5 (Page Footer) : các trường (hay cột) đặt trong vùng này được in ở ngay cuối mỗi trang mới.
  • Trong cửa sổ Field Explorer tìm đến Database Fields và mở rộng sẽ thấy DataTable1 và các cột vừa tạo:

  • Chọn và kéo lần lượt từng cột trong DataTable1 đặt sang vùng Section3 (Details) của report:

  • Như vậy report đã được thiết kế xong. Bây giờ chúng ta sẽ lấy dữ liệu từ database và kết buộc (bind) nó đến dataset và kết buộc dataset đến khung nhìn report (CrystalReportViewer).
  • Trong thanh Toolbox tại mục Reporting chọn CrystalReportViewer kéo và thả vào Form1

  • Kết quả:

  • Nhấp đôi chuột vào Form1 để đến khung viết code của sự kiện Form1_Load và viết mã như sau:

Mã VB


Imports System.Data.SqlClient

Imports CrystalDecisions.CrystalReports.Engine

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Dim rptDoc As ReportDocument = New ReportDocument()

Dim ds As MyDataSample = New MyDataSample() ' tập tin .xsd

Dim dt As DataTable = New DataTable()

' Đặt tên cho DataTable

dt.TableName = "Crystal Report Example"

dt = getAllGeres() 'Gọi phương thức getAllGenres

ds.Tables(0).Merge(dt)

' Lấy đường dẫn tập tin crystal report (CrystalReport.rpt)

Dim reportPath As String = Application.StartupPath & "\" & "CrystalReport.rpt"

rptDoc.Load(reportPath)

'gán dataset đến report viewer

rptDoc.SetDataSource(ds)

CrystalReportViewer1.ReportSource = rptDoc

CrystalReportViewer1.DisplayToolbar = True

End Sub

Public Function getAllGeres() As DataTable

Dim connectionString As String

connectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=ngocminhtran;Integrated Security=True;"

Dim Con As SqlConnection = New SqlConnection(connectionString)

Dim cmd As SqlCommand = New SqlCommand()

Dim ds As DataSet = Nothing

Dim adapter As SqlDataAdapter

Try

Con.Open()

cmd.CommandText = "SELECT * FROM Genre"

cmd.CommandType = CommandType.Text

cmd.Connection = Con

ds = New DataSet()

adapter = New SqlDataAdapter(cmd)

adapter.Fill(ds, "Genre")

Catch ex As Exception

Throw New Exception(ex.Message)

Finally

cmd.Dispose()

If Con.State <> ConnectionState.Closed Then

Con.Close()

End If

End Try

Return ds.Tables(0)

End Function

End Class

Mã C#


using System.Data.SqlClient;

using CrystalDecisions.CrystalReports.Engine;

public class Form1

{

private void Form1_Load(object sender, EventArgs e)

{

ReportDocument rptDoc = new ReportDocument();

// tập tin .xsd

MyDataSample ds = new MyDataSample();

DataTable dt = new DataTable();

// Đặt tên cho DataTable

dt.TableName = "Crystal Report Example";

dt = getAllGeres();//Gọi phương thức getAllGenres

ds.Tables[0].Merge(dt);

// Lấy đường dẫn tập tin crystal report (CrystalReport.rpt)

string reportPath = Application.StartupPath + "\\" +"CrystalReport.rpt";

rptDoc.Load(reportPath);

//gán dataset đến report viewer

rptDoc.SetDataSource(ds);

CrystalReportViewer1.ReportSource = rptDoc;

CrystalReportViewer1.DisplayToolbar = true;

}

public DataTable getAllGeres()

{

string connectionString = null;

connectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=ngocminhtran;Integrated Security=True;";

SqlConnection Con = new SqlConnection(connectionString);

SqlCommand cmd = new SqlCommand();

DataSet ds = null;

SqlDataAdapter adapter = default(SqlDataAdapter);

try {

Con.Open();

cmd.CommandText = "SELECT * FROM Genre";

cmd.CommandType = CommandType.Text;

cmd.Connection = Con;

ds = new DataSet();

adapter = new SqlDataAdapter(cmd);

adapter.Fill(ds, "Genre");

} catch (Exception ex) {

throw new Exception(ex.Message);

} finally {

cmd.Dispose();

if (Con.State != ConnectionState.Closed) {

Con.Close();

}

}

return ds.Tables(0);

}

}

  • Lưu và thực thi ứng dụng. Kết quả sẽ phát sinh một ngoại lệ như sau:

  • Xử lý ngoại lệ này bằng cách mở tập tin App.config và bổ sung đoạn mã sau trong phần tử <configuration>:

  • Lưu và thực thi lại ứng dụng:

Lời kết

Bài viết này chỉ minh hoạ tạo một report đơn giản trong ứng dụng Winform. Có nhiều kiểu report và các cách tạo khác nhau có thể xem thêm bài viết: