廣州市機(jī)電高級(jí)技工學(xué)校 余楷鑫
廣州輕工職業(yè)學(xué)校 劉魁元
水晶報(bào)表是開發(fā)數(shù)據(jù)報(bào)表的利器,在.NET平臺(tái)做過報(bào)表開發(fā)的程序員,一定都對(duì)水晶報(bào)表強(qiáng)大的報(bào)表設(shè)計(jì)功能留下深刻的印象。運(yùn)用水晶報(bào)表進(jìn)行開發(fā),能夠大大簡化數(shù)據(jù)報(bào)表開發(fā)的難度,減少開發(fā)的工作量,其良好的接口功能,使得程序員在開發(fā)與維護(hù)過程中,往往能夠取得事半功倍的效果。水晶報(bào)表在應(yīng)用時(shí)分兩種方法,分別是拉模式(PULL)、推模式(PUSH)。下面將介紹水晶報(bào)表的這兩種模式。
水晶報(bào)表的拉模式是指直接從數(shù)據(jù)庫獲取數(shù)據(jù),利用水晶報(bào)表的接口來實(shí)現(xiàn)報(bào)表展示,基本上不用手動(dòng)編寫代碼。該種模式只需要調(diào)整模版就可以設(shè)計(jì)好水晶報(bào)表,與數(shù)據(jù)的連接和執(zhí)行SQL命令都是交水晶報(bào)表來完成,其表現(xiàn)如圖1所示。拉模式適用于不需要對(duì)數(shù)據(jù)庫(或數(shù)據(jù)文件)中的數(shù)據(jù)進(jìn)行額外的處理(如數(shù)值計(jì)算等)的情況,其優(yōu)點(diǎn)是設(shè)計(jì)時(shí)非常方便,可以隨時(shí)對(duì)設(shè)計(jì)的情況進(jìn)行預(yù)覽,但在應(yīng)用程序部署時(shí)則比較繁瑣(如需要設(shè)定數(shù)據(jù)庫連接的數(shù)據(jù)源及驅(qū)動(dòng))。
在拉模式下,只要按照?qǐng)?bào)表專家的向?qū)聿僮?,水晶?bào)表直接根據(jù)指定的驅(qū)動(dòng)連接數(shù)據(jù)庫然后組裝這些數(shù)據(jù),不需要開發(fā)人員編寫代碼。但是其缺點(diǎn)也是顯而易見的,用拉模式設(shè)計(jì)的水晶報(bào)表在運(yùn)行環(huán)境或者數(shù)據(jù)庫變動(dòng)時(shí),其調(diào)整比較麻煩。另外在設(shè)計(jì)與實(shí)現(xiàn)上,拉模式的靈活性不足也是存在的一個(gè)問題,作為程序員,該模式是不被喜歡的,所以本文并不推薦使用水晶報(bào)表的拉模式。
水晶報(bào)表的推模式也是需要獲取數(shù)據(jù)庫里的數(shù)據(jù)后在設(shè)計(jì)好的模板中展示出來,所不同的是推模式能夠靈活的按照程序員的設(shè)想實(shí)現(xiàn)復(fù)雜的水晶報(bào)表,而且在維護(hù)上更加的便利,一定程度上降低了與數(shù)據(jù)庫的耦合度。其表現(xiàn)形式如圖2所示。在推模式中編程組裝的Dataset里的SQL語句中的字段要與水晶報(bào)表里的SQL語句字段一致。
圖1
圖2
在水晶報(bào)表的推模式實(shí)現(xiàn)上,開發(fā)人員要編寫相應(yīng)的查詢代碼與報(bào)表中的字段相匹配,并且代碼中的數(shù)據(jù)庫表也要跟水晶報(bào)表中的保持一致,不然水晶報(bào)表便顯示不出數(shù)據(jù),筆者在這一點(diǎn)上曾經(jīng)吃過虧,調(diào)試了很久才發(fā)現(xiàn)這一疏漏。在簡單的水晶報(bào)表實(shí)現(xiàn)上,相信有過這方面開發(fā)的人都有一定了解,但是涉及到多數(shù)據(jù)表展示在同一張打印報(bào)表上時(shí),未必就有人知道了,本文接下來將介紹如何解決多報(bào)表打印這一問題。
通過以上分析,程序員在設(shè)計(jì)開發(fā)水晶報(bào)表的時(shí)候,以推模式來實(shí)現(xiàn)更加的符合實(shí)際項(xiàng)目的要求,筆者將通過一個(gè)學(xué)生學(xué)籍報(bào)表來介紹水晶報(bào)表推模式的實(shí)現(xiàn)步驟。
(1)實(shí)現(xiàn)的工具采用Visual Studio 2008,數(shù)據(jù)庫選擇SQL Server 2005,水晶報(bào)表則為Visual Studio 2008自帶的10.5版本。
(2)在項(xiàng)目底下新建一個(gè)StuReport.aspx的頁面,在該頁面中放置查詢條件,并在工具箱的報(bào)表欄中拖入CrystalReportViewer和CrystalReportSource控件到頁面中,前臺(tái)主要代碼如下:
如果是多個(gè)數(shù)據(jù)源的話,仿照上面將數(shù)據(jù)庫中的數(shù)據(jù)讀取到dataset中,這里需要注意的地方是Fill數(shù)據(jù)集的時(shí)候表名要和水晶報(bào)表中的保持一致。如果數(shù)據(jù)報(bào)表中需要顯示圖片的話,必須將圖片轉(zhuǎn)化為二進(jìn)制流的形式,因?yàn)関s 2008集成的水晶報(bào)表10.5只支持二進(jìn)制流的形式。
(3)在同一目錄下新建一個(gè)student.xsd的頁面,創(chuàng)建數(shù)據(jù)庫字段的映射,該頁面是利用xsd標(biāo)記語言建立的。實(shí)際上,xsd可以認(rèn)為是一個(gè)數(shù)據(jù)中介,介于報(bào)表模板與數(shù)據(jù)之間。建成數(shù)據(jù)集,有三個(gè)數(shù)據(jù)庫表,分別為STU_V_StuInfo、STU_V_Family、STU_T_ConductReview,這三個(gè)表的表名對(duì)應(yīng)上面提到的dataset填充名。
(4)接下來便是設(shè)計(jì)水晶報(bào)表頁面,首先便是綁定上面所示的數(shù)據(jù)源xsd文件,點(diǎn)擊字段資源管理器—數(shù)據(jù)庫字段,右鍵點(diǎn)擊數(shù)據(jù)庫專家。在數(shù)據(jù)庫文件中選擇我們創(chuàng)建的student.xsd文件。
設(shè)計(jì)數(shù)據(jù)報(bào)表:因?yàn)槭嵌鄶?shù)據(jù)源展示到同一數(shù)據(jù)報(bào)表中,所以需要插入子報(bào)表。學(xué)生信息模塊為主報(bào)表,家庭成員模塊和操行評(píng)定模塊為子報(bào)表。
點(diǎn)擊主報(bào)表,右鍵—插入--子報(bào)表,選擇鏈接標(biāo)簽,這里需要注意的地方是:主報(bào)表與子報(bào)表必須通過學(xué)生ID進(jìn)行關(guān)聯(lián),這樣才能使報(bào)表讀到的學(xué)生信息是同一個(gè)學(xué)生ID的信息。子報(bào)表中的字段設(shè)置方法與主報(bào)表一樣。
設(shè)計(jì)完報(bào)表,我們就可以運(yùn)行我們所設(shè)計(jì)的報(bào)表界面。
學(xué)校學(xué)生學(xué)籍打印是學(xué)校學(xué)生管理系統(tǒng)的一項(xiàng)重要功能,運(yùn)用水晶報(bào)表來進(jìn)行學(xué)籍打印,能夠大大減少學(xué)籍管理員的工作量。本文利用水晶報(bào)表來解決這一問題,希望能給大家提供借鑒與參考。
[1]滕永富,孫振龍,田麗軍,薛仁政.基于Web的研究生管理信息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].齊齊哈爾大學(xué)學(xué)報(bào)(自然科學(xué)版),2010(03).
[2]李濤,屈展.基于.NET的Web動(dòng)態(tài)報(bào)表研究與實(shí)現(xiàn)[J].科技資訊,2008(03).
[3]雷筱珍.水晶報(bào)表數(shù)據(jù)來源之.NET對(duì)象應(yīng)用技巧[J].福建電腦,2010(11).
[4]張龍強(qiáng).一種.NET下報(bào)表打印的方法與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2010(19).
[5]石俊萍.基于C#水晶報(bào)表數(shù)據(jù)源動(dòng)態(tài)綁定的實(shí)現(xiàn)[J].電腦與電信,2009(05).
[6]洪穎.基于.net平臺(tái)下不同模式水晶報(bào)表的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)與信息技術(shù),2009(12).
[7]莫麗萍.基于.NETB/S模式中水晶報(bào)表打印與套打的實(shí)現(xiàn)[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2008(11).