vs2005中水晶報表實現<br />【說明】<br />水晶報表在應用時分兩種方法,分別是拉模式(PULL)、推模式(PUSH)。拉模式:在水晶報表產生時的資料來源是從水晶報表檔案中的SQL語句從資料庫中提取的,在編程時不用重寫SQL語句,但要加上登入資訊(具體方法,後面介紹)。推模式:在水晶報表產生時的資料來源,是用編程時重寫水晶報表中SQL語句而產生的dataset對像。也就是說,推模式是用dataset組裝水晶報表。<br />水晶報表元件介紹。水晶報表在VS2005中有兩種組件,在WEB項目是分別是CrystalReportSource,CrystalReportViewer。在FORM項目裡是分別是crystalReport,CrystalReportViewer。<br />CrystalReportSource,crystalReport是水晶報表的資料提供者;CrystalReportViewer是水晶報表的瀏覽器。另外還要介紹一下水的報表的檔案是以rpt為副檔名的檔案,該檔案可以用VS2005產生。<br />下面分別介紹具體操作方法:<br />拉模式(PULL):<br />在拉模式中如要在水晶報表中的SQL語句加上條件參數時要用{?參數名}方式給出。例:“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是參數名<br />以下例子中所用到的水晶報表檔案中使用的SQL語句是“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是參數名。<br />【WEB方式下】<br />using CrystalDecisions.Shared;<br />using CrystalDecisions.CrystalReports.Engine;<br /> /// <summary><br /> ///功能:拉模式提取水晶報表<br /> /// </summary><br /> /// <param name="sender"> </param><br /> /// <param name="e"> </param><br /> protected void Button_pull_Click(object sender, EventArgs e)<br />{<br />// CrystalReport.rpt是水晶報表檔案的名稱;CrystalReportSource1是從工具箱加到頁面上的水晶報表資料來源對像。<br /> CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));<br />// SetDatabaseLogon 拉模式中必須用這個方法來設定登入資訊,參數一:使用者名稱;參數二:密碼;參數三:伺服器;參數四:資料庫名<br /> CrystalReportSource1.ReportDocument.SetDatabaseLogon("sa", "123456", @"SYWZSWL/SQLEXPRESS", "Test");<br />//給水晶報表傳參數,參數一:是參數名,參數二:參數值;<br /> CrystalReportSource1.ReportDocument.SetParameterValue("Title", "這是一個測試報表");<br /> CrystalReportSource1.ReportDocument.SetParameterValue("Parm", "1");<br />//綁定水晶報表資料來源。<br /> CrystalReportSource1.DataBind();<br />// CrystalReportViewer1是水晶報表瀏覽器,下面是給該瀏覽器賦上對像<br /> CrystalReportViewer1.ReportSource = CrystalReportSource1;<br /> CrystalReportViewer1.DataBind();<br /> }<br />【FORM方式下】<br />//在FORM方式下代碼同WEB方式,用crystalReport控制項換掉了CrystalReportSource;用crystalReportViewer換掉了CrystalReportViewer;這兩個控制項都可以在工具箱裡找到。同時在編程時去掉DataBind()方法。<br /> private void Form1_Load(object sender, EventArgs e)<br /> {<br /> crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");<br /> crystalReport1.SetDatabaseLogon("sa", "123456", @"SYWZSWL/SQLEXPRESS", "Test");<br /> crystalReport1.SetParameterValue("Title", "這是一個測試報表");<br /> crystalReport1.SetParameterValue("Parm", "1");<br /> crystalReportViewer1.ReportSource = crystalReport1;<br /> } </p><p>推模式(PUSH):<br />在推模式中編程組裝的Dataset裡的SQL語句中的欄位要與水晶報表裡的SQL語句欄位一致。簡單的說,推模式中的水晶報表是個模板,把在設計器裡報表的格式設好後,再組裝DataSet就可以產生報表了。 </p><p>【WEB方式下】<br />using CrystalDecisions.Shared;<br />using CrystalDecisions.CrystalReports.Engine;<br />using System.Data.SqlClient;<br /> protected void Button_push_Click(object sender, EventArgs e)<br /> {<br /> string sql = "Select T1, T2, T3 FROM T where T1=''a''";<br /> string DBConfig_sql =@"Data Source=SYWZSWL/SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";<br /> DataSet ds = new DataSet();<br /> SqlConnection sqlCon = new SqlConnection(DBConfig_sql);<br /> SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);<br /> SqlDataAdapter sqlAd = new SqlDataAdapter();<br /> sqlAd.SelectCommand = sqlCmd;<br /> sqlAd.Fill(ds, "sql");<br /> CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));<br /> //注意此處必需指明Dataset中的表的名稱,否則會提示“您請求的報表需要更多資訊.”<br />CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables["sql"]);<br />//{?}中的參數可以不用賦值,即使賦了值也不起作用。<br /> // CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");<br /> CrystalReportSource1.ReportDocument.ParameterFields["Title"].CurrentValues.AddValue("這時推模式的報表範例!");<br /> CrystalReportSource1.DataBind();<br /> CrystalReportViewer1.ReportSource = CrystalReportSource1;<br /> CrystalReportViewer1.DataBind();<br /> }<br />【FORM方式下】<br />private void Form1_Load(object sender, EventArgs e)<br /> {<br /> //推模式<br /> string sql = "Select T1, T2, T3 FROM T where T1=''a''";<br /> string DBConfig_sql = @"Data Source=SYWZSWL/SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";<br /> DataSet ds = new DataSet();<br /> SqlConnection sqlCon = new SqlConnection(DBConfig_sql);<br /> SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);<br /> SqlDataAdapter sqlAd = new SqlDataAdapter();<br /> sqlAd.SelectCommand = sqlCmd;<br /> sqlAd.Fill(ds, "sql");<br /> crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");<br /> crystalReport1.SetDataSource(ds.Tables["sql"]);<br />//{?}中的參數可以不用賦值,即使賦了值也不起作用。<br /> // CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");<br /> crystalReport1.ParameterFields["Title"].CurrentValues.AddValue("這時推模式的報表範例!");<br /> crystalReportViewer1.ReportSource = crystalReport1<br />報表的資料來源已經不是報表範本使用拉模式獲得了,是推模式的一種實現<br />這樣實現的好處是這裡的sql是由頁面輸入條件動態構造出的,可以實現按條件的動態查詢。不使用強型別dataset,用datatable非常方便。<br />這種方式和以前用pb構造動態datawindow的方式一樣,我使用起來覺的還是很順手的。<br />容易實現的優點從安全性上看就變成了缺點,頁面輸入拼裝sql,安全性不高。<br />如果涉及多個表,sql很長構造麻煩的情況,使用第二種可能不是很方便。那麼在第一種方法下能否實現where條件的動態變化呢<br />這時可以使用公式篩選記錄的方法實現:<br />ReportDocument.DataDefinition.RecordSelectionFormula = "{**}= " textBox1.Text ;<br />篩選條件也可以根據頁面輸入動態構造<br />我的理解是資料從資料庫中拉來後再使用過濾條件進行過濾的方式,效能會不好控制。<br />當然也可以使用CrystalReportViewer控制過濾,比如<br />crystalReportViewer1.SelectionFormula = "{**}= " textBox1.Text;<br />但是按照展示層和基礎商務邏輯分開的原則,用ReportDocument更加自然。在vs2005的協助中有完整的協助和樣本。<br />要按照使用環境限制,適當選擇實現方式。<br />去年有個多維報表的項目用sqlserver2005的reportservice做的,現在來看水晶報表也完全可以,而且水晶報表也能實現切片和切入的效果。建立交叉表,兩個資料在兩個維度變化。尤其是資料來源非sqlserver2005的情況下,還是非常好的選擇。<br />技巧:<br />1.非交叉表實現儲存格合并,網上的意見都是無法實現,後來在一個網站上看到了實現方法,雖然不自然,但是效果可以出來,需要合并的儲存格都設定為組,並在“節專家”,選擇你的組頁首,右邊“公用”中選中“延伸到後續節”。設定對象格式,上邊框為單線。<br />在設計時預覽都沒有問題,但是嵌入網頁運行後,不知道為什麼線都丟失了。沒辦法,再插入線,在設計時預覽線條會粗些,但是運行時剛好。<br />這是野路子的實現。<br />