手頭上的一個項目,終顯雛形,其中遇到一些問題,經過多番努力,終于得以解決,主要是水晶報表方面的。因為是第一次用,總結的同時,也給後來可能用到水晶報表的人一些微弱的指引,是以如果總結的不好的話,請大家指正。
關于水晶報表的一些基本概念,如push和pull模式等如果想了解的話,自己百度搜尋下,或是找本書看就可以了。
這裡我主要是根據實際應用到的要求,來進行帶圖的詳細介紹,希望對新手有所幫助。
使用的是VS2008,在頁面中添加命名空間的引用,主要有以下幾個:
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;
下面先來看下,利用水晶報表做出來的效果圖,隻是實作功能,界面未經過美工處理,有點難看,多多包涵.

圖一
圖二
由于是統計報表,是以在應用中需要傳遞參數值,在實際應用中,我是利用了存儲過程來實作的。
Create proc PrintCJ
@cjbh varchar(50)
As
SELECT Cjdy_zb.DWMC, Cjdy_zb.ND,Cjdy_zb.JD, Cjdy_zb.QSDD, Cjdy_zb.JFJZRQ, Cjdy_zb.YJQJS, Cjdy_zb.YJQJZ, Cjdy_zb.SKDW, Cjdy_fb.QSSY, Cjdy_fb.YT, Cjdy_fb.DYGY,
Cjdy_fb.DEGY, Cjdy_fb.DSGY, Cjdy_fb.BCHJ FROM Cjdy_fb INNER JOIN Cjdy_zb ON Cjdy_fb.CJBH = Cjdy_zb.CJBH and Cjdy_zb.CJBH= @cjbh;
GO
下面截圖截圖一步一步來操作實作:
(1)、在項目中添加一個新檔案夾,如Report檔案夾,然後在該目錄下右鍵添加Crystal報表。
接下來,選擇“作為空白模闆”,點選“确定”。
右鍵資料庫字段,選擇“資料庫專家”
展開“建立新連接配接”,選擇“OLE DB(ADO)”,在彈出框中選擇“Microsoft OLE DB Provider for SQL Server”。
點選“下一步”,彈出連接配接資訊,按照實際情況,填寫内容。
點選“下一步”。
點選“完成”,這樣一個連接配接就配置成功了。
在上面的界面中,展開資料庫,選擇“存儲過程”PrintCJ,既上面建立的存儲過程,并将其添加到右邊。
在輸入參數值中将“設為空值”複選框反勾選,讓其成為一個離散值。
點選“确定”。
點選“确定”,在字段資料總管中可以看到如下資訊。
接下來就是在水晶報表的主體中根據需要,定制報表界面了。如下:
這些字段都是可以從“字段資料總管”中直接拖拽過來直接使用的,這其中也可以通過插入圖檔為其添加背景。
從查詢頁面将參數傳遞給上面的報表頁面,報表頁面通過傳遞的參數,動态的顯示報表。
比如查詢頁面查詢出結果後,通過一個按鈕将參數傳遞給報表頁面:
Page.RegisterStartupScript("reopen",String.Format("<script> window.open('Print2.aspx?cjbh={0}', '_blank','height=574,width=1014,top=20,left=10,resizable=yes,status=yes,toolbar=no,menubar=yes,location=no,location=no,directories=no,copyhistory=no') </script>", Server.UrlEncode(ViewState["cjbh"].ToString().Trim())));
在報表頁面的Page_Load事件中通過接收參數,并取資料綁定到Crystal報表中去。
protected void Page_Load(object sender, EventArgs e)
{
CrystalDecisions.Shared.ParameterValues pvs = new CrystalDecisions.Shared.ParameterValues();
CrystalDecisions.Shared.ParameterDiscreteValue pvuid = new CrystalDecisions.Shared.ParameterDiscreteValue();
CrystalDecisions.CrystalReports.Engine.ReportDocument rpt = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
string rptPath = Server.MapPath("../Report/CrystalReport4.rpt");
rpt.Load(rptPath);
pvuid.Value = Server.UrlDecode(Request.QueryString["cjbh"]);
pvs.Add(pvuid);
//這裡的字段名稱就是
rpt.DataDefinition.ParameterFields["@cjbh"].ApplyCurrentValues(pvs);
CrystalDecisions.Shared.TableLogOnInfo logOnInfo = new CrystalDecisions.Shared.TableLogOnInfo();
logOnInfo.ConnectionInfo.DatabaseName = "資料庫名稱";
logOnInfo.ConnectionInfo.ServerName = ConfigurationSettings.AppSettings["server"]; //資料庫伺服器名稱
logOnInfo.ConnectionInfo.UserID = "sa";
logOnInfo.ConnectionInfo.Password = "******";
rpt.Database.Tables["PrintCJ;1"].ApplyLogOnInfo(logOnInfo);//存儲過程在報表中的名稱
CrystalReportViewer1.ReportSource = rpt;
}
運作程式,就可以出如圖二的結果了。
以下介紹傳遞二個參數,帶彙總功能的報表效果,如圖一那樣。
方法跟前面很類似,先是根據實際情況,寫好存儲過程:
Create proc NYGGBB
@startTime datetime,
@endTime datetime
begin
SELECT YSXZDYMC, GSL, GDZC, NZWZZMJ, QSDJ, RKSL, PJGZ, ZJJE FROM Xxz_nyggys where JFRQ>=@startTime and JFRQ<=@endTime
end
設計好報表頁面
關于需要統計的字段,其實很簡單,你隻要在需要統計的字段上右鍵,選擇“插入”->“彙總”,然後将彙總字段拖至下方即可。
查詢頁面将參數傳遞至統計頁面:
Page.RegisterStartupScript("reopen",String.Format("<script> window.open('Print.aspx?sTime={0}&eTime={1}', '_blank','height=574,width=1014,top=20,left=10,resizable=yes,status=yes,toolbar=no,menubar=yes,location=no,location=no,directories=no,copyhistory=no') </script>", Server.UrlEncode(dt1.ToString().Trim()), Server.UrlEncode(dt2.ToString().Trim())));
統計頁面擷取傳遞參數,并進行統計:
{
//傳遞兩個參數,需要建立兩個ParameterValues對象
CrystalDecisions.Shared.ParameterValues pvs2 = new CrystalDecisions.Shared.ParameterValues();
CrystalDecisions.Shared.ParameterDiscreteValue pvuid2 = new CrystalDecisions.Shared.ParameterDiscreteValue();
string rptPath = Server.MapPath("../Report/CrystalReport3.rpt");
pvuid.Value = Server.UrlDecode(Request.QueryString["sTime"]); //起始時間
pvuid2.Value = Server.UrlDecode(Request.QueryString["eTime"]); //結束時間
pvs2.Add(pvuid2);
rpt.DataDefinition.ParameterFields["startTime"].ApplyCurrentValues(pvs);
rpt.DataDefinition.ParameterFields["endTime"].ApplyCurrentValues(pvs2);
logOnInfo.ConnectionInfo.DatabaseName = "資料庫名稱";
logOnInfo.ConnectionInfo.ServerName = ConfigurationSettings.AppSettings["server"];
logOnInfo.ConnectionInfo.Password = "****";
rpt.Database.Tables["CZGSBB;1"].ApplyLogOnInfo(logOnInfo);// 存儲過程在報表中的名稱
運作後,效果如圖一所示。
友情提示:
1、在使用自帶的水晶報表時,請注冊,否則隻能使用30次
水晶報表注冊碼
注冊号:6707437608
密碼:AAP5GKS0000GDE100DS