Tạo báo cáo dùng control ReportViewer với C#


Giới thiệu

Trong các ứng dụng với cơ sở dữ liệu (CSDL), việc đưa ra các báo cáo là việc làm cần cần thiết để giúp các nhà quản lý, người sử dụng đưa ra các thống kê và in ấn khi cần, ví dụ như báo cáo doanh thu theo tuần, theo quý, hoặc báo cáo sinh viên trong một lớp, sinh viên đỗ, trượt, v.v.

Với .NET bạn có thể tạo báo cáo cho các ứng dụng với CSDL một cách dễ dàng, trong bài trước tôi đã giới thiệu bài viết tạo báo cáo sử dụng Crystal Report (CR). Crystal Report đã là một component từ khi Visual Studio ra đời năm 2012.Trong các phiên bản từ VS2008 trở về trước, bạn có thể thêm nó vào thanh Toolbox để phát triển ứng dụng của mình. CR được cung cấp bởi SAP. Từ phiên bản VS2010, SAP chưa có sản phẩm tích hợp CRvới VS2010, bạn muốn sử dụng CR cho phát triển ứng dụng của bạn, bạn chỉ có thể sử dụng bản beta của họ. Bạn có thể download và về cài đặt. Bạn có thể tham khảo thêm tại đây.

Trong bài viết này tôi giới thiệu cách sử dụng control ReportViewer, được tích hợp sẵn trong các phiên bản Visual Studio.


Chuẩn bị

  • Cơ sở dữ liệu và báo cáo chúng ta định xây dựng. Trong ví dụ này chúng ta sử dụng lại CSDL Quản lý bán hàng bài trước, cấu trúc bảng như sau: tblMatHang( MaSP nchar(5), TenSP nvarchar(30), NgaySX Date, NgayHH Date, DonVi nvarchar(10), DonGia Float , GhiChu nvarchar(200))
  • Yêu cầu: tạo báo cáo các sản phẩm có ngày sản xuất lớn hơn một ngày nào đó do người sử dụng nhập vào trên giao diện.

Các bước báo cáo

  1. Tạo mới Project sử dụng template, ngôn ngữ C# và tạo CSDL giống như bài trước hoặc download mã nguồn bài trước rồi phát triển thêm phần báo cáo
  2. Kích chuột phải vào tên Project trong cửa sổ Solution Explorer > Add > New Item …, một cửa sổ hiện ra bạn chọn kiểu Windows Form, đặt tên phần Name: frmBaoCao
  3. Mở Form frmBaoCao, rồi tìm tới control ReportViewer trên ToolBox. Nếu bạn không nhìn thấy ToolBox, bạn có thể vào menu View > ToolBox. Rồi kéo control ReportViewer vào frmBaoCao

Kéo control ReportViewer vào Form

  1. Thiết kế Form báo cáo như sau:
    Giao diện form báo cáo

    Phần giao diện Loại control Các thuộc tính
    Cửa sổ chính Form Name = frmBaoCao
    Text = Báo cáo sản phẩm
    (1) GroupBox Text = Điều kiện cho báo cáo
    Dock = Top
    Label Text = Ngày sản xuất lớn hơn
    DateTimePicker Name = dtpNgaySX
    Format = Short
    Button Name = btnBaoCao
    Text = &Tạo báo cáo
    (2) GroupBox Text = Hiển thị cho báo cáo
    Dock = Fill
    ReportViewer Name = rpvBaoCao
    Dock = Hiển thị báo cáo

    Sau khi bạn đã thêm ReportViewer vào Form, bạn sẽ nhìn thấy ở góc trên bên phải có một biểu tượng mũi tên màu đen, bạn kích chuột vào đó nó sẽ bật ra cửa sổ có tên ReportViewer Tasks để cho phép bạn lựa chọn một báo cáo mà bạn đã thiết kế.

    • Nếu bạn muốn hiển thị một báo cáo đã được lưu trữ ở một máy chủ bạn có thể chọn <Server Report> trong mục Choose Report, sau đó điền vào hai thuộc tính Report Server UrlReport Path. Report Server Url là địa chỉ trỏ tới report server, Report Path là đường dẫn đầy đủ mà report trả về.
    • Nếu bạn muốn hiển thị một báo cáo ở local, bạn có thể kích vào tuỳ chọn Design a new report để bắt đầu thiết kế report của bạn hoặc chọn một report đã tồn tại trong Project. Trong bài này chúng ta sẽ tập trung phần thiết kế báo cáo ở local.
  2. Thiết kế tạo mẫu báo cáo, đây là bước chúng ta sẽ thiết kế báo cáo hiển thị những nội dung thông tin gì ở phần thân báo cáo(Body), tiêu đề báo cáo (Header Report), phần đuôi của báo cáo (Footer Report).
    • Kích chuột phải vào tên Project ở cửa sổ Solution Explorer > Add > New Item … trong cửa sổ hiển ra bên trái chọn Reporting, sau đó bên phải chọn Report hoặc Report Wizard, đặt tên cho báo cáo ở phần Name = rptSanPham.rdlc xem hình dưới.Chọn kiểu báo cáo
    • Kích đúp vào rptSanPham.rdlc trong Solution Explorer. Bạn sẽ thấy bên góc bên trái có một cửa sổ Report Data, bạn kích vào New > DataSet… để chọn dữ liệu cho thiết kế báo cáo.Thiết kế DataSet cho Report
    • Các cửa sổ hiển thị lên, bạn chọn nguồn dữ liệu, các bảng sẽ dùng cho thiết kế báo cáo …Chọn nguồn dữ liệu
    • Sau khi chọn song nguồn dữ liêu, trong trường hợp này ta chỉ chọn bảng tblMatHangCấu hình DataSet cho Report
    • Kích chuột phải vào vùng cửa sổ làm việc của rptSanPham.rdlc, rồi chọn các đối tượng hiển thị trong phần thân báo cáo báo cáo như Table, Matrix, Chart, Image … Ngoài ra bạn cũng có thể thêm phần Page HeaderPage Footer để tạo tiêu đề và cho báo cáoChọn các đối tượng cho báo cáo
    • Giả sử phần thân báo cáo tôi sử dụng một Table để hiển thị dữ liệu dưới dạng bảng. Bên cửa sổ trái của Report Data bạn kéo các cột MaSP, TenSP, NgaySX, … vào phần Data và sau đó bạn có thể chỉnh sửa lại phần Header cho có dấu tiếng việt. Sau thiết kế tôi có kết quả như sau:Kết quả thiết kế báo cáo
    • Sau khi hoàn thành việc thiết kế báo cáo, bạn chọn vào file rptSanPham.rdlc trong cửa sổ Solution Explorer, rồi chọn vào cửa sổ Properties và thay đổi thuộc tính Copy to Output Directory = Copy if newerThay đổi copy to report
    • Quay lại Form frmBaoCao kích vào nút Tạo báo cáo để viết sự kiện Click cho nút này.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using Microsoft.Reporting.WinForms;

namespace QLBanHang
{
    public partial class frmBaoCao : Form
    {
        public frmBaoCao()
        {
            InitializeComponent();
        }

        private void btnBaoCao_Click(object sender, EventArgs e)
        {
            //Khai báo câu lệnh SQL
            String sql = "Select * from tblMatHang Where NgaySX >='" + dtpNgaySX.Value.ToString() + "'" ;
            SqlConnection con = new SqlConnection();
            //Truyền vào chuỗi kết nối tới cơ sở dữ liệu
            //Gọi Application.StartupPath để lấy đường dẫn tới thư mục chứa file chạy chương trình 
            con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\QLBanHang.mdf;Integrated Security=True;User Instance=True";
            SqlDataAdapter adp = new SqlDataAdapter(sql, con);
            DataSet ds = new DataSet();
            adp.Fill(ds);

            //Khai báo chế độ xử lý báo cáo, trong trường hợp này lấy báo cáo ở local
            rpvBaoCao.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
            //Đường dẫn báo cáo
            rpvBaoCao.LocalReport.ReportPath = "rptSanPham.rdlc";
            //Nếu có dữ liệu
            if (ds.Tables[0].Rows.Count > 0)
            {
                //Tạo nguồn dữ liệu cho báo cáo
                ReportDataSource rds = new ReportDataSource();
                rds.Name = "tblMatHang";
                rds.Value = ds.Tables[0];
                //Xóa dữ liệu của báo cáo cũ trong trường hợp người dùng thực hiện câu truy vấn khác
                rpvBaoCao.LocalReport.DataSources.Clear();
                //Add dữ liệu vào báo cáo
                rpvBaoCao.LocalReport.DataSources.Add(rds);
                //Refresh lại báo cáo
                rpvBaoCao.RefreshReport();
            }
        }
    }
}

Download mã nguồn phần báo cáo tại đây.


Chú ý: Trong một Project có nhiều Form, bạn muốn form nào chạy đầy tiên thì bạn có thể kích và file Program.cs và thay đổi tên Form muốn chạy trước ở phần Application.Run(…)

Có thể bạn sẽ thích…

14 phản hồi

  1. Nguyễn Trí Nhân viết:

    Xin code quản lý bán hàng. Cám ơn thầy nhiều.

    • Phan Tiến viết:

      Hi Em,
      Mục tiêu của bài quản lý bán hàng để bạn nghiên cứu một bài toán thực tế, và viết chương trình theo hướng dẫn để các bạn làm quen. Trong quá trình làm có thể các em sẽ gặp các lỗi và sẽ tự sửa nó hoặc đặt câu hỏi mình sẽ gợi ý. Mình không cho các bạn code vì sợ các bạn sẽ chẳng chịu làm gì cả, rồi cũng chẳng biết gì.

  2. Cao Kỳ viết:

    chào thầy. sao e làm nó load lên ko được ạ. cảm ơn thầy

    • Phan Tiến viết:

      Trong cái hình thứ 4 từ trên xuống có phần chú ý đặt tên là tblMatHang, em có thể đặt tên gì cũng được, nhưng khi viết trong code phần ReportDataSource phải truyền đúng tên bảng mà em đã đặt tên.

  3. Hải Nguyễn viết:

    Chào thầy
    Thầy cho em hỏi là để làm một cái report hóa đơn bán hàng có kích thước bằng với lại khổ giấy cuộn như cái hóa đơn mua hàng ở siêu thị thì mình làm như thế nào ạ

    • Phan Tiến viết:

      – Em thiết kế dữ liêụ tương ứng với khổ giấy em muốn in ví dụ như A5, A4, A3 …
      – Sau đó em có thể dùng đoạn code sau để thiết lập mặc định khổ giây in ra

      System.Drawing.Printing.PageSettings pg=new System.Drawing.Printing.PageSettings();
      pg.Margins.Top = 0;
      pg.Margins.Bottom = 0;
      pg.Margins.Left = 0;
      pg.Margins.Right = 0;
      System.Drawing.Printing.PaperSize size = new PaperSize();
      size.RawKind = (int)PaperKind.A5;
      pg.PaperSize = size;
      reportViewer1.SetPageSettings(pg);
      this.reportViewer1.RefreshReport();

      • Hải Nguyễn viết:

        Chào thầy,
        Dạ thầy cho em hỏi là khổ giấy mình thường dùng để in hóa đơn tính tiền như ở siêu thị là khổ giấy gì và làm sao để chiều dài của khổ giấy vừa đủ với dữ liệu mình cần in mà không bị phân trang ạ

        • Phan Tiến viết:

          Nhưng máy in hoá đơn ở siêu thị thường dùng khổ giấy K80 tức chiều rộng của hóa đơn in ra có kích thước 80mm. Ngoài khổ này còn các máy in mini ở các quán cafe có thể dùng khổ giấy nhỏ hơn là K57 (57mm) em nhé.

  4. Hà Thủ viết:

    Cho hỏi tạo title và summary trong reportview C# 2010 bằng cách nào ?. Cám ơn.

  5. Tuấn viết:

    Thưa thầy, đã là quản lý bán hàng nhưng em chưa thấy phần bán hàng sẽ code và hoạt động ra sao ? .Mong thầy chỉ giúp.

    • Phan Tiến viết:

      Đây chỉ là một phần nhỏ trong một chương trình quản lý. Em cần lắp ghép vào để tạo thành một chương tình hoàn chỉnh. Về quản lý bán hàng em sẽ cần phải quản lý quá trình nhập xuất hàng ngày để lưu vào phần mềm đi kèm với hoá đơn tương ứng. Việc lập trình phần mềm quản lý bán hàng cũng nhưng các mô hình quản lý khác đều có một cách thức tương tự nhau thôi em.

  6. Trương Việt viết:

    bạn cho mình hỏi mình dùng report viewer theo dạng list, làm sao để mình hiển thị trong 1 tờ giấy A4 sẽ hiển thị được 4 list, 2 list ở trên và 2 list ở dưới rồi mới nhảy sang trang khác, hiện tại mình chỉ làm được list nhảy theo hàng dọc chứ không chạy theo hàng ngang được, bạn giúp mình nhé, cảm ơn bạn

Bình luận

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *