統計
一、引言
報表大家應該都知道是什么,簡單來說就是用表格、圖表等格式來動態顯示數據。現在web系統中很多需要使用到報表統計、打印功能等,將所需用到的數據綁定到指定的位置,然后分類匯總,這樣查看起來更清晰,管理人員分析數據也一目了然。今天就我之前所做的項目總結一下使用stimulsoft報表的經驗。
二、准備工作
首先,需要安裝Stimulsoft,我使用的版本是ultimate旗艦版本,當然這個軟件是需要收費的,如果大家只需學習的話,可以去官網下載免費試用版。下載完成后,如果項目所需數據庫是oracle,那么stimulsoft是連接不上免安裝客戶端綠色版的plsql的,需要安裝oracle客戶端(注:如果同時安裝了32位和64位Oracle客戶端,必須設置Oracle環境變量PATH只能指向64位客戶端安裝地址(默認會把32位和64位客戶端安裝地址都加上))。
2.1 使用oracle中表、視圖
其次,因為Stimulsoft報表設計器本身不自帶Oracle連接,所以需要以下步驟來添加oracle 的連接支持。
1.打開Stimulsoft報表安裝目錄/Adapters/Oracle.zip,解壓Oracle.zip,並且編譯解壓文件夾下面的Oralce項目,把編譯的Dll拷貝至Stimulsoft報表安裝目錄/bin目錄下面。(項目名稱Stimulsoft.Report.OracleClient,Dll名稱:Stimulsoft.Report.OracleClient.dll)
2。添加完該dll后打開stimulsoft設計器就能看到oracle連接了
3. 設置連接字符串,測試如果成功,Oracle就連接成功沒有問題。如果連接保錯請確認是否是64位操作系統安裝了64位客戶端,PATH地址是否設對
4.根據Oralce連接->新建數據源->New Query ,這時並不像Sql Server數據庫會自動加載數據表等信息,需要我們自定義sql查詢語句。
5.填寫sql查詢語句,建議不要點擊運行查詢構造器,如果要查詢結果可以點擊運行或者查詢結果。
6.點擊獲取所有列
7.最后綁定數據源,將每個值的表達式賦值,賦值內容為該數據源下所獲取到的列。
2.2 使用Oracle存儲過程
使用Oracle存儲過程的話,上面2.1的步驟就不需要了,如果是使用sqlserver存儲過程,那上面的步驟還是必不可需的,sqlserver忽略步驟。
首先新建數據源,不再是選擇Oracle連接,而是選擇Dataview,然后通過后台程序自定義數據源,將存儲過程返回到Dataview中,這種方法比較方便。
然后,與2.1步驟不同的是新增自定義列,因為沒有連接到數據庫中的表和視圖,所以那些字段列只能在數據源中自己新增,然后和2.1中步驟7一樣綁定列
最后保存,生成報表mrt文件
2.3 sqlserver文件轉為oracle
用vs等設計器打開后實則為xml文件,oracle和sqlserver的xml文件有所不同,如果原先是用sqlserver設計可以后期把它改成oracle設計,修改方法如下。
1.將所有連接類型為Stimulsoft.Report.Dictionary.StiOracleDatabase轉換為Stimulsoft.Report.Dictionary.StiSqlDatabase
2.將所有數據源類型為Stimulsoft.Report.Dictionary.StiOracleSource轉換為數據源類型為Stimulsoft.Report.Dictionary.StiSqlSource
3.另存為Report_Sql.mrt
4.最好打開設計文件預覽並檢查是否有SqlServer和Oracle表結構不匹配的情況(字段名稱不同等)
三、問題匯總
1. 能不能實現這種類型的報表?
可以先看下知識庫里面的Demo,其中也包含了官網Demo。
2. 能不能實現參數傳遞?
可以的。
1> 字典->添加變量(如myRowGuid)
2> 如果是需要使用stimulsoft自帶的變量交互區域,則設置變量的Request From User和Allow User Values屬性為true;如果不需要使用stimulsoft自帶的變量交互區域,因為可能樣式等與系統不匹配,則可以自己定義變量交互區域(查詢區域),只需設置Request From User和Allow User Values屬性為false。
3> 如何把變量值傳給報表變量?
ü 在報表使用時(加大括號)
如 select * from customers where RowGuid = {myRowGuid}
ü 在aspx頁面后台代碼賦值:
StiReport report = new StiReport();
rreport.Load("Report.mrt");
report.Compile();
//初始化值
report["myvariable"] = 123;//如果是字符串要加上單引號'123'或者Sql語
//句寫為'{myRowGuid}'
report.Render();
StiWebView1.Report = report;
3. 能否改數據庫連接?
可以的。
//清理數據庫
report.Dictionary.Databases.Clear();
//增加數據庫連接(Test為報表中定義的連接名稱,MyDataConnectionString為實際的字符串連接)
report.Dictionary.Databases.Add(new StiSqlDatabase("Test",
"MyDataConnectionString"));
4. 是否支持存儲過程和函數獲取數據源?
支持的。其中存儲過程可以傳參數、函數也可以傳參數(函數查詢文本如select * from dbo.func({VarA})
1> Sql Server存儲過程設置:
查詢文本:execute Pro {VarA}, {VarB} 類型選擇:Table
2> Oracle存儲過程設置鏈接地址:
利用微軟企業庫帶參數執行存儲過程,最后用動態游標查看輸出結果程序集
5. 能夠自定義數據源?
可以的。
Report.RegData(DataSet dataSet)、Report.RegData(DataTable dataTable)、Report.RegData(DataView dataView) 等等都可以給report自定義數據源。
但是對應的DataTable必須取個tableName,因為加載的時候以tableName來加載,如沒有tableName會報錯
例DataTable table = new DataTable("table");可以
但DataTable table = new DataTable();就會報錯
6. 為什么有些屬性看不到?
在屬性區域右擊可以選擇Basic、Standard、Professional(最全的)
7. 怎么查看代碼?
在代碼標簽下面查看。右擊選擇Show Auto Generated Code來查看自動生成的代碼,可以看到自定義的表達式等。
8. 如何做個性化開發?
1> 將report保存成.cs代碼,修改.cs代碼做個性化開發。保存.cs文件也可以是進行Debug查找錯誤。
2> 可以編寫組件的事件,做個性化開發。(點擊屬性->事件標簽)
一般遇到出錯無法找到錯誤原因時,可以保存成.cs文件進行Debug。
report的加載和屬性設置代碼可以參考Stimulsoft_Reports.Net_FAQ.En.pdf文檔
四、相關代碼
4.1 在aspx頁面中
1.首先需要在頁頭注冊一下stimulsoft,因為我用的是2014.3.0.0版本的設計器設計的,所以這里注冊也必須是這個版本,否則會報黃頁
<%@ Register Assembly="Stimulsoft.Report.Web, Version=2014.3.0.0, Culture=neutral, PublicKeyToken=ebe6666cba19647a" Namespace="Stimulsoft.Report.Web" TagPrefix="cc1" %>
2.其次在body中插入該控件,設置屬性
<cc1:StiWebViewer ID="StiWebViewer1" runat="server" Height="700px" Width="100%" BackColor="White" BorderColor="White" ToolBarBackColor="240, 240, 240" ScrollBarsMode="True" RenderMode="AjaxWithCache" />
4.2 在.cs中
//TODO: Oracle需要添加這兩段代碼加載報表,sql無需添加 StiConfig.Services.Add(new Stimulsoft.Report.Dictionary.StiOracleAdapterService());//數據源類型 StiConfig.Services.Add(new Stimulsoft.Report.Dictionary.StiOracleDatabase());//連接類型 string appDirectory = HttpContext.Current.Server.MapPath("");//獲取文件絕對路徑 StiReport report = new StiReport(); report.Load(appDirectory + "\\Report.mrt"); DataSet dsGw = b_wm.GetWzInfoCount(DateFromToEx.FromText, DateFromToEx.ToText, ddlYear.SelectedValue, "01");//從存儲過程獲取崗位培訓統計表 DataSet dsYy = b_wm.GetWzInfoCount(DateFromToEx.FromText, DateFromToEx.ToText, ddlYear.SelectedValue, "02");//從存儲過程獲取業余學校統計表 if (dsGw == null || dsYy == null) return; DataView dvGw = dsGw.Tables[0].DefaultView;//崗位培訓所有的數據 DataView dvYy = dsYy.Tables[0].DefaultView;//業余學校所有的數據 report.RegData("GWPXXX", dvGw);//自定義崗位培訓數據源 report.RegData("YYXXXX", dvYy);//自定義業余學校數據源 StiWebViewer1.Report = report;
如果不是系統不是用的oracle數據庫連接,那么無需添加數據源類型和連接類型,也就是開頭兩句不需要,反之除了添加stimulsoft的引用,還需添加Stimulsoft.Report.OracleClient的dll,否則會報找不到網絡路徑,找了很久才發現是這個錯誤。
存儲過程的代碼就不貼出來了,大意就是將所需要的參數傳入存儲過程中,通過一些條件插入臨時表中,然后設置動態游標,查看程序結果集。
整個頁面效果截圖如下,為了方便,我將它暫時縮小了
五、結語
今天大概就寫這么多,不知道對於stimulsoft我的理解對不對,如果有人感興趣可以和我探討探討。
作者:edisoner