劉 輝,常婉綸,劉豫凡(.西安理工大學,陜西 西安7008;.西北工業(yè)大學 機電學院 陜西 西安 7007)
利用水晶報表動態(tài)綁定數(shù)據(jù)源實現(xiàn)動態(tài)交叉表的方法研究
劉輝1,常婉綸1,劉豫凡2
(1.西安理工大學,陜西西安710082;2.西北工業(yè)大學機電學院陜西西安710072)
為減少數(shù)據(jù)冗余,根據(jù)規(guī)范化理論設計的數(shù)據(jù)庫不能直接輸出分類匯總的結果,需要進行轉換生成交叉表,并利用水晶報表的Push模式實現(xiàn)對交叉表的顯示。在.NET和SQL Server環(huán)境下,探討了動態(tài)交叉表的生成和利用水晶報表動態(tài)綁定數(shù)據(jù)源顯示數(shù)據(jù)的方法,并給出了較為詳細的實現(xiàn)過程。
動態(tài)交叉表;水晶報表;Push模式;動態(tài)綁定
信息系統(tǒng)中都不能缺少報表,而交叉表是種常見的報表形式,它將源表中的數(shù)據(jù)分組匯總后,一組列在表的左側,另一組列在表的上部,從而形成一種分類匯總表格[1]。動態(tài)交叉表是按用戶呈現(xiàn)數(shù)據(jù)的要求,不僅對數(shù)據(jù)進行分類,同時還要根據(jù)表中數(shù)據(jù)的情況動態(tài)創(chuàng)建列,把數(shù)據(jù)行信息置換到表格列處并進行匯總。
水晶報表是一款商務智能軟件,主要用于設計產(chǎn)生報表,是業(yè)內(nèi)功能最強的報表系統(tǒng)[2],其出現(xiàn)的目的就是使計算機參與到辦公系統(tǒng)業(yè)務流程中。
以我校學生成績管理系統(tǒng)為例,為消除存儲異常,減少數(shù)據(jù)冗余,保證數(shù)據(jù)的完整性,按規(guī)范化設計理論設計的數(shù)據(jù)庫含多張表,其中與成績有關的3個表的關系模式學生信息表S(學號、姓名、性別、班號)、課程信息表C(課號、課名)、學生成績表SC(學號、課號、學期、成績)之間的關系圖如圖1所示。學生成績表中的數(shù)據(jù)形式如圖2所示。實際工作中需要打印的學生成績表如圖3所示。
圖1 3個表的關系圖
圖2 成績表中的數(shù)據(jù)
由此可見,數(shù)據(jù)庫中存儲的數(shù)據(jù),在某些應用中,需要生成動態(tài)交叉表,因不同班級不同學期學生學習的課程不一樣,生成的動態(tài)交叉表的列項的個數(shù)和名稱都是不固定的。經(jīng)驗表明,水晶報表雖然功能強大且使用方便,但它要求設計表格時所使用的表名以及列名與使用時必須一致。本文研究了水晶報表的Pull模式和Push模式[3],提出了在數(shù)據(jù)庫端生成一個表格列項固定的動態(tài)交叉表,利用Push模式動態(tài)綁定數(shù)據(jù)源把數(shù)據(jù)推送給水晶報表引擎的方法。
圖3 需打印的某班級學生成績單樣式
首先在數(shù)據(jù)庫服務器端完成列項名稱與個數(shù)固定的動態(tài)交叉表的生成。設每學期最多有8門課,實現(xiàn)方法如下:
(1)創(chuàng)建函數(shù)ufGetCourse,功能是篩選出某班對應學期的課程,并按順序編號。運行結果如圖4所示。
圖4 某班某學期開設的課程及順序編號
(2)創(chuàng)建存儲過程upCreateJCB,功能是按學號對應,把順序編號為1的4號課程成績放在Cj1列中,把順序編號為2的5號課程成績放在Cj2列中,以此類推,最后計算每個學生的總評分。運行結果如圖5所示。
圖5 生成的動態(tài)交叉表
應用程序的前臺界面在.NET平臺下進行水晶報表設計,采用Push模式在程序中動態(tài)加載數(shù)據(jù)源和報表,用動態(tài)傳參方式把表頭的cj1~cj8更換成對應的中文課程名,方法如下:
(1)建立解決方案。在解決方案資源管理器中添加“Crystal報表”模板。方法為:添加→新建項→Crystal報表→命名報表為MyCry.rpt→作為空白報表。
(2)在字段資源管理器中通過“報表專家”完成報表設計。方法為:數(shù)據(jù)庫字段→數(shù)據(jù)庫專家→創(chuàng)建新鏈接→OLE DB(ADO)→MicrosoftOLE DB Providerfor SQL Server→填寫鏈接數(shù)據(jù)庫的信息→選擇對應的數(shù)據(jù)庫→選擇存儲過程upCreateJCB→把涉及的字段拖拽到水晶報表細節(jié)欄中并填上表格線。
(3)在字段資源管理器中添加參數(shù)字段:班級名classname、學期TermNo、Cj1~Cj8,并把這些參數(shù)字段拖拽到水晶報表的頁眉欄處。
經(jīng)過上述過程設計的報表MyCry.rpt如圖6所示。
圖6 設計完成的水晶報表MyCry.rpt
(4)在窗體上放一個CrystalReportViewer控件并命名為crv,用C#編程動態(tài)加載數(shù)據(jù)源和報表。代碼如下:
本文提出了利用水晶報表顯示并打印動態(tài)交叉表的一種方法,圖3就是本校學籍管理系統(tǒng)中用本方法打印的成績匯總表,由于來源于真實數(shù)據(jù),故姓名處進行了處理。
[1]張賢斌,費樹岷.管理信息系統(tǒng)中動態(tài)交叉表的實現(xiàn)方式研究[J].計算機應用工程技術,2008,4(4):995-996.
[2]叢鳳俠,楊玉強.通用水晶報表自動生成技術研究[J].計算機技術與發(fā)展,2013,23(5):54-57.
[3]錢哨,李揮劍,李繼哲,等.C#WinForm實踐開發(fā)教程[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-),女,碩士,副教授,主要研究方向:軟件算法、數(shù)據(jù)庫、數(shù)據(jù)挖掘。