14
Hướng dẫn tạo báo cáo động Crystal Report với Store Procedure C# Vs 2005 Có lẽ vì khá ức chế do các nguồn thong tin hiếm hoi, hoặc không ai rãnh mà hướng dẫn cụ thể. Nên mình xin hướng dẫn chi tiết việc tạo crystal report với store procedure, như các bạn biết, store nó cũng có dạng: không truyền tham số nào ( cách này report quá dễ ), cách 2 là có truyền tham số để lọc ra các giá trị ( tui sẽ hướng dẫn lien qua phần này) . Ngoài ra crystal report có các cách khác nhau để truyền tham số , có người dùng: parameter field ( đa số các thông tin hướng dẫn toàn cái này) , có người dùng formula Field ( ít ai hướng dẫn cái này) và xin thong báo tui chỉ hướng dẫn formula vì nó nằm trong cái tui tìm hiểu. Còn đây sẽ là Dạng mình muốn làm, yêu cầu như sau : Tôi có danh sách các hóa đơn thanh toán, tôi muốn lọc ra các Hóa đơn chưa đóng tiền từ ngày 20/11/2000 đến ngày 20/11/2010 . Hết ! Thiết kế giao diện : + 2 cái datetimepicker +2 button ( cái button Lập báo cáo là để tôi lưu báo cáo này xuống CSDL, ko dính gì crystal nên khỏi quan tâm) + 1 crystalreportViewer. + mấy cái label đừng quan tâm. Hình như sau :

hướng dẫn tạo báo cáo động

  • Upload
    mrpham2

  • View
    458

  • Download
    5

Embed Size (px)

Citation preview

Hướng dẫn tạo báo cáo động Crystal Report với Store Procedure C# Vs 2005

Có lẽ vì khá ức chế do các nguồn thong tin hiếm hoi, hoặc không ai rãnh mà hướng dẫn cụ thể. Nên mình xin hướng dẫn chi tiết việc tạo crystal report với store procedure, như các bạn biết, store nó cũng có dạng: không truyền tham số nào ( cách này report quá dễ ), cách 2 là có truyền tham số để lọc ra các giá trị ( tui sẽ hướng dẫn lien qua phần này) . Ngoài ra crystal report có các cách khác nhau để truyền tham số , có người dùng: parameter field ( đa số các thông tin hướng dẫn toàn cái này) , có người dùng formula Field ( ít ai hướng dẫn cái này) và xin thong báo tui chỉ hướng dẫn formula vì nó nằm trong cái tui tìm hiểu.

Còn đây sẽ là Dạng mình muốn làm, yêu cầu như sau : Tôi có danh sách các hóa đơn thanh toán, tôi muốn lọc ra các Hóa đơn chưa đóng tiền từ ngày 20/11/2000 đến ngày 20/11/2010 . Hết !Thiết kế giao diện :+ 2 cái datetimepicker+2 button ( cái button Lập báo cáo là để tôi lưu báo cáo này xuống CSDL, ko dính gì crystal nên khỏi quan tâm)+ 1 crystalreportViewer.+ mấy cái label đừng quan tâm.Hình như sau :

Sau đây tôi sẽ demo trình tự các bước thực hiện :Bước 1 : - Tạo 1 database có tên là “HoaDonThanhToan”, 1 bảng chứa thông tin. Ví dụ “tblHoaDonThanhToan” như hình sau

Bước 2:Tạo kết nối server trong VS2005, cái này chắc khỏi chỉ cho đỡ mất công nhỉ, ai không biết có thể tìm chỗ nào đó hướng dẫn . Hình mình kết nối sever explorer là đây

Bước 3:Thiết kế cái form y như cái hình yêu cầu ( Lưu ý chỉ có những ai có cài crystal report thì trong toolbox mới hiện tool crystal report thôi nhé, ko thì 1 là coi trong đĩa có ko, 2 là tự down về )

Bước 4: thiết kế store procedure , tao mới 1 store trong SQL hay VS2005 đều được

ALTER PROCEDURE dbo.StoredProcedure2

@TuNgay datetime,@DenNgay datetime

AS/* SET NOCOUNT ON */

/* DECLARE @TuNgay datetimeDECLARE @DenNgay datetime*/SELECT HoaDonThanhToan.SoHoaDon, HoaDonThanhToan.MSTKV,

HoaDonThanhToan.DaThanhToan, HoaDonThanhToan.HanChotFROM HoaDonThanhToan WHERE (HoaDonThanhToan.DaThanhToan = 0) and (HoaDonThanhToan.HanChot <= @DenNgay) and (HoaDonThanhToan.HanChot >= @TuNgay)

RETURN

Đừng có mà copy luôn cả cái “ALTER PROCEDURE dbo.StoredProcedure2” nhé vì cái này chỉ dùng cho stored đã được tạo, copy chừa ra cái này dùm kẻo nói mình chỉ saiSau khi xong rồi thích thì cứ execute chạy thử ngay trong VS2005

Bước 5: thiết kế DataSet, thôi chắc chỉ luôn để khỏi ai thắc mắc, sẵn cho những ai mới làm quen luôn

Sau đó chọn DataSet

Kế tiếp ta add store mới tạo vào trong DataSet này

Chọn Next >> chọn Use existing Stored Procedures >> chọn select combox >> chọn cái stored mình mới tạo

Rồi chọn Next >> Next >>> Finish. Đến đây ta đã có dataset chứa store trong đó có các bảng mà ta muốn hiện rồi

Bước 6: Tạo Crystal report

Của tôi là BaoCaoTienPhat.rpt ( ai đặt tên gì thì nhớ lấy )Sau khi ta nhấn nút “Add”, chọn như hình sau :

Tiếp theo ta sẽ add dữ liệu store của chúng ta vào như sau :

OK, đến bước này ta cần nghỉ ngơi nghe tôi giải thích tí cho rõ, đến đây Stored của chúng ta đã được add vào Crystal Report, nếu chúng ta ko cần truyền tham số thì cứ việc kéo các Field vào trong Section3 Detail

Nhưng trường hợp chúng ta cần phải truyền tham số từ dateTimePicker mà chúng ta đã thiết kế thì chúng ta ko làm trực tiếp dc với cách này, mà chúng ta phải làm gián tiếp, sau đó viết code thì mới được. Như đã nói có các cách như dùng Biến ảo thuộc: Parameter Field hoặc Formula Fields như hình trên bên trái các bạn thấy, ở đây tôi dùng Formula ( tùy người, có người cho là Parameter dễ, còn tôi thì Formula dể xài ). OK, tiếp tục tôi sẽ new các biến trong Formula Field bằng cách Right_click lên Formula Field >> chọn New, ( khuyến cáo các bạn đang tìm hiểu nên đặt theo cách tôi, về sau ai rành thì cứ đổi tự do ), ở đây tôi đặt là F1, F2, F3, F4, ứng với 4 cái Field trong Stored mà ta tạo ( Hình ở trên là do phần của tôi nó có liên quan 2 table nên có tới 7 field , cũng ko quan trọng lắm nếu các bạn hiểu rõ nãy giờ mình đang làm gì ). Khi new các bạn cứ chọn Use Editor hoặc Use Expert tùy, ko quan trọng. Sau đó kéo các field trong Formula Field vào trong Section3 Detail các bạn sẽ thấy như hình trên. Xong, trước khi các bạn tiếp, các bạn vào Section2 ( Page Header ) , click trái vào F1 >>> qua Properties >> Name nó là Text1, tương tự F2:Text2, F3:Text3, vì sao tôi nói các bạn để ý cái này, bởi vì lát viết code chúng ta sẽ đổi chúng thành các Name tương ứng với các field thuộc Store, ví dụ: Text1=SoHoaDon, Text2= MSTKV.

Hoàn tất Crystal, giờ chúng ta qua Form thiết kế ở bươc 3 .Bước Cuối cùng:

Chúng ta sẽ chỉ có nhiêu đây code thôi

BaoCaoTP.StoredProcedure2DataTable baocao; private void bttHienThi_Click(object sender, EventArgs e) { BaoCaoTienPhat document = new BaoCaoTienPhat(); baocao = new BaoCaoTPTableAdapters.StoredProcedure2TableAdapter().GetData(dateTuNgay.Value, dateDenNgay.Value); document.SetDataSource((DataTable)baocao); for (int i = 0; i < baocao.Columns.Count; i++) { document.DataDefinition.FormulaFields[i].Text = string.Format("{{StoredProcedure2.{0}}}", baocao.Columns[i].ColumnName); ((CrystalDecisions.CrystalReports.Engine.TextObject)document.ReportDefinition.ReportObjects[string.Format("Text{0}", i + 1)]).Text = baocao.Columns[i].ColumnName; } crystalReportViewer1.ReportSource = document; }

Nhìn rối nhỉ, đừng lo tôi sẽ giải thích chi tiết luônĐầu tiên chúng ta sẽ cần lấy dữ liệu từ Dataset chứa Store mà chúng ta tạoBaoCaoTP.StoredProcedure2DataTable baocao;baocao = new BaoCaoTPTableAdapters.StoredProcedure2TableAdapter().GetData(dateTuNgay.Value, dateDenNgay.Value);// Cái này sẽ lọc ra dữ liệu dựa vào 2 cái dateTimePicker chúng ta thiết kế ở trên rồi lấy dữ liệu gán vào baocao

document.SetDataSource((DataTable)baocao); // Thiết lập DataSoucre cho report của chúng ta từ cái baocaoGiới thiệu tí về string. Format luônstring.Format("Text{0}", 1) // khi xuất ra chúng ta sẽ có Text1string.Format("Text{0}", 2) // khi xuất ra chúng ta sẽ có Text2

((CrystalDecisions.CrystalReports.Engine.TextObject)document.ReportDefinition.ReportObjects[string.Format("Text{0}", i + 1)]).Text = baocao.Columns[i].ColumnName; // Cái này khó giải thích , chắc ai giỏi lên MSDN sẽ rõ các lớp đối tượng này, nói chung ở đây chúng ta sẽ thay đổi tiêu đề các field Section2 Header F1,F2,F3 dựa vào baocao.Columns[i].ColumnName ( SoHoaDon, MSTKV,DaThanhToan, HanChot)

document.DataDefinition.FormulaFields[i].Text = string.Format("{{StoredProcedure2.{0}}}", baocao.Columns[i].ColumnName);/// Điền tất cả các dữ liệu thuộc trường nào đó vào Field [i], chắc phải giải thích rõ tí chỗ này, các bạn để ý "{{StoredProcedure2.{0}}}" giả sử i=1 nếu xuất ra messagebox.show ta sẽ có kết quả {StoredProcedure2.SoHoaDon}nghĩa là khi ta lọc ra ta có các SoHoaDon như 1,2,3,4… theo 1 hàng dọc ( cột ) sau đó gán cái cột này vào Formula Field thứ [i], ứng với @F1,@F2,@F3…

Ví dụ đơn giản như document.DataDefinition.FormulaFields[0].Text = “ABC” thì trong report ngay chỗ @F1 sẽ có 1 chuỗi ABC ( cứ tạo 1 project Test rồi thử code sẽ rõ ).

Cuối cùng gán document nãy giờ ta làm vào crystalreportViewer trên Form là xong

crystalReportViewer1.ReportSource = document;

Công việc bây giờ là buil dự án của chúng ta lên và chạy chúng. Bắt đầu chạy thôi. Hãy thưởng thức thành quả mình vừa làm ra.

23h28 rồi, tốn 2h ngồi viết cái này cũng mong cho ai đang cần có thể tìm được ánh sang nơi cuối chân trời. Chúc ngủ ngọn everybody !