水晶报表调用存储过程的问题
前言:現在碰到了水晶報表調用存儲過程的問題,問題是這樣的:ERP軟件里有很多的數據表,有些報表的字段要從多個數據表里取數據,并且要對數據進行處理,來作為報表的字段,我看了些資料,說可以通過存儲過程來取數據和運算數據后直接插入到水晶報表里,注意報表有多個字段大多字段需要運算的,要怎樣做?
回復:
1、在項目中添加一個xsd,在設計界面中將存儲過程拖入設計界面
2、設計報表,將添加的xsd作為報表的數據源
3、在頁面代碼中添加以下代碼
SqlClient.SqlCommand ? cmd ? =new ? SqlClient.SqlCommand();
cmd.Connection ? = ? new ? SqlClient.SqlConnection( " ");
cmd.CommandType ? = ? CommandType.StoredProcedure;
cmd.CommandText ? = ? "spname ";
//cmd.Parameters.Add( "@p1 ");
//cmd.Parameters[ "@p1 "].Value ? = ? " "
//傳遞存儲程參數
SqlClient.SqlDataAdapter() ? pt ? = ? new ? ? SqlClient.SqlDataAdapter(cmd);
Dataset1 ? ds ? = ? new ? Dataset1(); ? //前面添加的強類型數據集
pt.Fill(ds, ? "spname ");
ReportDocument ? rpt ? = ? new ? ReportDocument();
rpt.Load(Server.MapPath( "CrystalReport1 "));
rpt.SetDataSource(ds)
this.CrystalReportViewer1.ReportSource ? = ? rpt?
詳解:
?????做報表要的只是一個結構.你可以用DATASET文件結構來做報表,然后再運行storeprocedure去FILL一個DATASET結構的實例,再rpt.setDataSource(DataSet),就行了..至于你在storeprocedure里做什么,根本跟報表沒啥關系.只要輸出一個結構相同的表就行了.
本示例操作 主要實現
a. ReportViewer關聯Report1.rdlc的簡單呈現
b. 對帶有報表參數的Report1.rdlc的呈現
c. 利用程式生成的DataSet 填充報表
d. 調用存儲過程 生成DataSet 填充報表
==========
簡單的呈現
==========
1. 打開VS2005,文件->新建->網站 選擇語言種類(C#)
2. 在該解決方案下 設計其已經生成的Default.aspx
3. 將工具箱-數據下的ReportViewer 拉入Default.aspx的設計界面
4. 在用鼠標選中ReportViewer1時 可以看到其右上角的 小三角 圖標
5. 用鼠標點擊該小三角 將展開 ReportViewer任務 快捷菜單
6. 由于本項目 目前還沒有做好的報表 所以 選擇 設計新報表
7. 點擊 設計新報表 后 將呈現報表Report1.rdlc的設計界面
8. 由于本項目 目前還沒有做好的網站數據源
?? 所以 此時要添加新數據源
? (如果沒有呈現“網站數據源”界面,可以點擊報表設計界面,
?? 此時上方菜單中多出現“數據”,“報表”等選項
?? 可以在“數據”菜單下,選擇“顯示數據源”)
9. 點擊“添加新數據源” 會出現“TableAdapter 配置向導”
10. 選擇數據連接(如連接到本機的Northwind數據庫),下一步
11. 選擇是否要將連接字符串保存到應用程序配置文件中,下一步
12. 選擇命令類型,此時 可以 點擊 取消 按鈕,退出向導
13. 全部保存
14. 選擇 視圖 菜單 下 “服務器資源管理器”,
??? 可以看到剛才所建立的數據連接,
??? 可以看到Northwind數據庫下的表,視圖,存儲過程,函數
15. 在解決方案的樹下 找到并打開App_Code文件夾下的DataSet1.xsd數據集
16. 可以看到 打開的數據集設計器 是空的,此時可以將“服務器資源管理器”
??? 下的Northwind的表或存儲過程等 拉入 數據集設計器
??? (如此時 拉入了Orders表 和 Sales by Year這個存儲過程)
17. 全部保存
18. 雙擊Report1.rdlc,打開報表設計界面
??? 將此時的報表設計工具箱中的 報表項 的? 表 拉入 報表設計界面
19. 選擇 “數據”菜單下的“顯示數據源”,
??? 可以在網站數據源下 看到 DataSet1 下的 兩個 表 Orders 和 Sales by Year
20. 此時選擇Orders下的任意字段 (如OrderID 和 CustomerID)
??? 拉到Report1.rdlc設計界面的表的“詳細資料”處 用于報表顯示
21. 全部保存
22. 回到Default.aspx的設計界面,為ReportViewer1 綁定報表
??? 選擇ReportViewer1顯示剛才設計好的Report1.rdlc
23. 全部保存,按F5或Ctrl+F5 運行,以查看初步效果
======================================
接下來要為Report1.rdlc添加一個報表參數
======================================
24. 回到報表Report1.rdlc的設計界面
??? 點擊 報表 菜單 下的“報表參數”
25. 在報表參數在設置框中 添加一個報表參數 進行相關設置 并 確定以保存
?? (如其參數名稱為rptParaA,類型為String)
26. 拉入一個文本框的報表項到Report1.rdlc的設計界面 以做為該報表的標題顯示
27. 選中并右鍵單擊該文本框,在彈出的菜單中選擇“表達式”,
??? 進入“編輯表達式”的對話框
28. 在“編輯表達式”的對話框中,選擇 參數,
??? 并雙擊剛才設置的rptParaA,使文本框的值=Parameters!rptParaA.Value
29. 保存對Report1.rdlc的修改
30. 因為新的Report1.rdlc報表的文本框需要有報表參數值的傳入
??? 所以要在ReportViewer1 對Report1.rdlc的呈現時
??? 對Default.aspx.cs的編輯
31. 在Default.aspx.cs加入引用
??? using Microsoft.Reporting.WebForms;???
??? 在Page_Load中加入如下代碼
????????ReportViewer1.LocalReport.SetParameters(new?ReportParameter[]?{?rptParaA?});
32.保存并運行 以查看效果
=========================================
接下來,需要對所要呈現的報表資料 進行定制
也就是通過設計DataSet
用符合需要的數據對報表進行資料綁定和呈現
=========================================
33.設置ReportViewer1的Visible為false
34.在Default.aspx的設計界面 加入一個按鈕Button1
?? 將通過此按鈕的Click事件 實現對數據庫的訪問 以及DataSet的數據填充
?? 和對ReportViewer1的資料綁定
35. Default.aspx.cs加入引用
??? using System.Data.SqlClient;
??? using Microsoft.Reporting.WebForms;
??? Button1_Click中的代碼示例如下?
????????SqlConnection?myConn?=?new?SqlConnection("Data?Source=192.168.0.36;Initial?Catalog=Northwind;User?ID=sa;Password=sa");????????SqlDataAdapter?myda?=?new?SqlDataAdapter("select?top?5?*?from?orders",?myConn);
????????DataSet?myds?=?new?DataSet();
????????myConn.Open();
????????myda.Fill(myds);
????????myConn.Close();
????????ReportViewer1.Visible?=?true;
????????ReportParameter?rptParaA?=?new?ReportParameter("rptParaA",?"測試報表參數");
????????ReportViewer1.LocalReport.SetParameters(new?ReportParameter[]?{?rptParaA?});
??
????????ReportDataSource?rds?=?new?ReportDataSource("DataSet1_Orders",?myds.Tables[0]);
????????ReportViewer1.LocalReport.DataSources.Clear();
????????ReportViewer1.LocalReport.DataSources.Add(rds);
????????ReportViewer1.LocalReport.Refresh();
?? 注意ReportDataSource rds = new ReportDataSource("DataSet1_Orders", myds.Tables[0]);
?????? 的"DataSet1_Orders"是與前臺html程序的
????????????<LocalReport?ReportPath="Report1.rdlc">
????????????????<DataSources>
????????????????????<rsweb:ReportDataSource?DataSourceId="ObjectDataSource1"?Name="DataSet1_Orders"?/>
????????????????</DataSources>
????????????</LocalReport>
????????</rsweb:ReportViewer>
?????? 中的<DataSources>的Name="DataSet1_Orders"是一致的
??? 可以通過對DataSet的填充時的sql語句等的定制 來得到所需要的數據 以便報表呈現
??? 需要注意的是由于ReportViewer1此時的關聯報表為Report1.rdlc,所以DataSet的Tables[0]中的結構
??? 一定要包含Report1.rdlc所呈現的字段,所以,這里的Sql語句為select top 5 * from orders
36.保存 運行 點擊Button1 以便 報表呈現
===============================================
如果 報表所要呈現的數據 來源于存儲過程
那么 在裝載DataSet時 使其數據來源于存儲過程即可
===============================================
37.右擊項目 添加新項 ,選擇 報表,向項目中加入Report2.rdlc,
?? 設置其呈現的數據來源為存儲過程 Sales by Year
?? 同樣的在Report2.rdlc的設計界面 加入“表”報表項
?? 并將網站數據源下的DataSet1下的Sales by Year表中的字段
?? 拉入報表項“表”在詳細數據中 進行顯示
38.如同Default.aspx 向項目中添加新的頁面Default2.aspx
?? 向Default2.aspx加入一個Button 和 ReportViewer1
?? 并設置ReportViewer1所要呈現的報表為Report2.rdlc
?? 設置ReportViewer1的Visible為false
?? 雙擊Button 進行其Click事件的編寫
?? 設置Default2.aspx為項目的起始頁
39.在Default2.aspx.cs加入引用
?? using System.Data.SqlClient;
?? using Microsoft.Reporting.WebForms;
40.Button1_Click的事件代碼示例如下
????{
????????SqlConnection?myConn?=?new?SqlConnection("Data?Source=192.168.0.36;Initial?Catalog=Northwind;User?ID=sa;Password=sa");
????????SqlDataAdapter?myda?=?new?SqlDataAdapter("Sales?by?Year",?myConn);
????????myda.SelectCommand.Parameters.AddWithValue("@Beginning_Date",?"1997-10-10");
????????myda.SelectCommand.Parameters.AddWithValue("@Ending_Date",?"2000-10-10");
????????myda.SelectCommand.CommandType?=?CommandType.StoredProcedure;
????????DataSet?myds?=?new?DataSet();
????????myConn.Open();
????????myda.Fill(myds);
????????myConn.Close();
????????ReportViewer1.Visible?=?true;
????????
????????ReportDataSource?rds?=?new?ReportDataSource("DataSet1_Sales_by_Year",?myds.Tables[0]);
????????ReportViewer1.LocalReport.DataSources.Clear();
????????ReportViewer1.LocalReport.DataSources.Add(rds);
????????ReportViewer1.LocalReport.Refresh();
????}
41.保存 運行 點擊按鈕 報表效果查看
轉載于:https://www.cnblogs.com/kingjiong/archive/2008/10/20/1315279.html
總結
以上是生活随笔為你收集整理的水晶报表调用存储过程的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老干妈蹄花怎么做?
- 下一篇: “饮食断膻腥”上一句是什么