劉 輝,常婉綸,劉豫凡(.西安理工大學,陜西 西安7008;.西北工業大學 機電學院 陜西 西安 7007)
利用水晶報表動態綁定數據源實現動態交叉表的方法研究
劉輝1,常婉綸1,劉豫凡2
(1.西安理工大學,陜西西安710082;2.西北工業大學機電學院陜西西安710072)
為減少數據冗余,根據規范化理論設計的數據庫不能直接輸出分類匯總的結果,需要進行轉換生成交叉表,并利用水晶報表的Push模式實現對交叉表的顯示。在.NET和SQL Server環境下,探討了動態交叉表的生成和利用水晶報表動態綁定數據源顯示數據的方法,并給出了較為詳細的實現過程。
動態交叉表;水晶報表;Push模式;動態綁定
信息系統中都不能缺少報表,而交叉表是種常見的報表形式,它將源表中的數據分組匯總后,一組列在表的左側,另一組列在表的上部,從而形成一種分類匯總表格[1]。動態交叉表是按用戶呈現數據的要求,不僅對數據進行分類,同時還要根據表中數據的情況動態創建列,把數據行信息置換到表格列處并進行匯總。
水晶報表是一款商務智能軟件,主要用于設計產生報表,是業內功能最強的報表系統[2],其出現的目的就是使計算機參與到辦公系統業務流程中。
以我校學生成績管理系統為例,為消除存儲異常,減少數據冗余,保證數據的完整性,按規范化設計理論設計的數據庫含多張表,其中與成績有關的3個表的關系模式學生信息表S(學號、姓名、性別、班號)、課程信息表C(課號、課名)、學生成績表SC(學號、課號、學期、成績)之間的關系圖如圖1所示。學生成績表中的數據形式如圖2所示。實際工作中需要打印的學生成績表如圖3所示。

圖1 3個表的關系圖

圖2 成績表中的數據
由此可見,數據庫中存儲的數據,在某些應用中,需要生成動態交叉表,因不同班級不同學期學生學習的課程不一樣,生成的動態交叉表的列項的個數和名稱都是不固定的。經驗表明,水晶報表雖然功能強大且使用方便,但它要求設計表格時所使用的表名以及列名與使用時必須一致。本文研究了水晶報表的Pull模式和Push模式[3],提出了在數據庫端生成一個表格列項固定的動態交叉表,利用Push模式動態綁定數據源把數據推送給水晶報表引擎的方法。

圖3 需打印的某班級學生成績單樣式
首先在數據庫服務器端完成列項名稱與個數固定的動態交叉表的生成。設每學期最多有8門課,實現方法如下:
(1)創建函數ufGetCourse,功能是篩選出某班對應學期的課程,并按順序編號。運行結果如圖4所示。


圖4 某班某學期開設的課程及順序編號
(2)創建存儲過程upCreateJCB,功能是按學號對應,把順序編號為1的4號課程成績放在Cj1列中,把順序編號為2的5號課程成績放在Cj2列中,以此類推,最后計算每個學生的總評分。運行結果如圖5所示。



圖5 生成的動態交叉表
應用程序的前臺界面在.NET平臺下進行水晶報表設計,采用Push模式在程序中動態加載數據源和報表,用動態傳參方式把表頭的cj1~cj8更換成對應的中文課程名,方法如下:
(1)建立解決方案。在解決方案資源管理器中添加“Crystal報表”模板。方法為:添加→新建項→Crystal報表→命名報表為MyCry.rpt→作為空白報表。
(2)在字段資源管理器中通過“報表專家”完成報表設計。方法為:數據庫字段→數據庫專家→創建新鏈接→OLE DB(ADO)→MicrosoftOLE DB Providerfor SQL Server→填寫鏈接數據庫的信息→選擇對應的數據庫→選擇存儲過程upCreateJCB→把涉及的字段拖拽到水晶報表細節欄中并填上表格線。
(3)在字段資源管理器中添加參數字段:班級名classname、學期TermNo、Cj1~Cj8,并把這些參數字段拖拽到水晶報表的頁眉欄處。
經過上述過程設計的報表MyCry.rpt如圖6所示。

圖6 設計完成的水晶報表MyCry.rpt
(4)在窗體上放一個CrystalReportViewer控件并命名為crv,用C#編程動態加載數據源和報表。代碼如下:


本文提出了利用水晶報表顯示并打印動態交叉表的一種方法,圖3就是本校學籍管理系統中用本方法打印的成績匯總表,由于來源于真實數據,故姓名處進行了處理。
[1]張賢斌,費樹岷.管理信息系統中動態交叉表的實現方式研究[J].計算機應用工程技術,2008,4(4):995-996.
[2]叢鳳俠,楊玉強.通用水晶報表自動生成技術研究[J].計算機技術與發展,2013,23(5):54-57.
[3]錢哨,李揮劍,李繼哲,等.C#WinForm實踐開發教程[M].北京:中國水利水電出版社,2010.
Using crystal reports dynamic binding data source for complex dynamic crosstab method research
Liu Hui1,Chang Wanlun1,Liu Yufan2
(1.Xi′an University of Technology,Xi′an 710082,China;2.School of Mechanical Engineering,Northwestern Polytechnical University,Xi′an 710072,China)
To reduce data redundancy,it is impossible to output a subtotaled report based on a database design which follows the strict design paradigm.To do it,transforming data to cross-table and rendering them via push model in crystal reports is needed.Based on.NET and SQL server environment,this paper explores and studies the technique about generating dynamic crosstable and the method about dynamic binding the data source to display data,as well as gives a more detailed implementation process.
dynamic crosstab;crystal reports;Push mode;dynamic binding
TP312
A
1674-7720(2015)10-0084-03
2015-01-17)
劉輝(1965-),女,碩士,副教授,主要研究方向:軟件算法、數據庫、數據挖掘。