張 華,張素莉,朱春嬈
(1.長春工程學(xué)院計算機技術(shù)與工程學(xué)院;2.圖書館,長春130012)
高校學(xué)生信息管理系統(tǒng)(以下簡稱本系統(tǒng))是面向招生辦、財務(wù)處、教務(wù)處、院系、學(xué)生處等多種用戶的公共數(shù)據(jù)平臺,在本系統(tǒng)中要實現(xiàn)各院系專業(yè)報表、各專業(yè)班級報表、各班級學(xué)生名單報表、學(xué)生繳費信息報表、學(xué)生獎懲信息報表、學(xué)生錄取通知書等相關(guān)報表功能,各種報表生成后還需要打印、導(dǎo)出、統(tǒng)計、翻頁等功能,在本來就較為龐大的管理系統(tǒng)中實現(xiàn)如此多的報表功能,我們必須考慮一種性能較高的報表工具,因為本系統(tǒng)基于.NET開發(fā),因此采用.NET環(huán)境內(nèi)置的水晶報表。水晶報表操作相比較于其他的報表實現(xiàn)方式較為容易,且能靈活地實現(xiàn)系統(tǒng)要求的各種功能,提高工作效率,使報表設(shè)計更專業(yè)。
條形碼中最為常用的有Code39碼和Code128碼,學(xué)校的掃描槍識別39碼,故在系統(tǒng)中使用了39碼。Code 39碼是Intermec公司于1975年推出的一維條碼,39碼是一種可供使用者雙向掃瞄的分散式條碼,即如果使用者把39碼倒著讀取也是得到相同的結(jié)果,且39碼支持?jǐn)?shù)字,編碼規(guī)則簡單、誤碼率低、所能表示字符個數(shù)多,因此39碼在各個領(lǐng)域有著極為廣泛的應(yīng)用。39碼僅有2種單元寬度——分別為寬單元和窄單元,寬單元這寬度為窄單元的1~3倍,一般多選用2倍、2.5倍或3倍。39碼的每一個條碼字符由9個單元組成,其中有3個寬單元,其余是窄單元,因此稱為39碼,其構(gòu)成元素為:起始碼+資料碼+終止碼,其中起始碼與終止碼均為*字符,如圖1所示,在系統(tǒng)中條形碼用來標(biāo)識新生錄取通知書中的通知書編號,供新生報道時各院系掃描,完成新生報道。
圖1 Code39碼表示的條形碼
水晶報表(Crystal Reports)是世界領(lǐng)先的用于創(chuàng)建交互式報表的軟件包,支持大多數(shù)流行的開發(fā)語言,可以創(chuàng)建簡單的報表,也可以創(chuàng)建專業(yè)的、復(fù)雜的報表,它可以從任何數(shù)據(jù)源生成所需要的報表,就如Microsoft Office Visio一樣,可以繪制不同行業(yè)(如建筑、工藝、電氣等)的圖形(如流程圖、業(yè)務(wù)邏輯圖、工程圖等),創(chuàng)建出的報表可以方便地實現(xiàn)分頁、下載及導(dǎo)出為各種其他格式。水晶報表在1993年成為 Visual Studio(簡稱 VS)的一部分,在VS2003、VS2005、VS2008的開發(fā)環(huán)境中都默認(rèn)自帶水晶報表,而在VS2010的開發(fā)環(huán)境中默認(rèn)沒有水晶報表,開發(fā)人員在使用時,需要先到SAP官方網(wǎng)站下載特定的安裝文件進行安裝后才可以使用。水晶報表的數(shù)據(jù)訪問模式分為PULL模式(拉模式)和PUSH模式(推模式)。PULL模式是驅(qū)動程序會自動連接至數(shù)據(jù)庫并根據(jù)需要來提取數(shù)據(jù),開發(fā)人員不需要另外編寫代碼;PUSH模式下,開發(fā)人員必須自行編寫代碼來連接至數(shù)據(jù)庫,創(chuàng)建SQL命令填充數(shù)據(jù)集對象,并將該對象傳送給報表。PUSH模式下,開發(fā)人員對數(shù)據(jù)源擁有更多的自主權(quán)和控制權(quán),并可以使用包括ADO.NET在內(nèi)的各種數(shù)據(jù)源。在本系統(tǒng)中,使用PUSH模式操作水晶報表。
在基于.NET的Web應(yīng)用程序設(shè)計中,通常有2種方法保存圖片數(shù)據(jù)信息:一種是直接把圖片文件轉(zhuǎn)換成字節(jié)數(shù)組保存在數(shù)據(jù)庫,如SQL Server中;另一種是在圖片上傳時將圖片保留原擴展名,但重命名為一個永遠不重復(fù)的隨機流水號從而形成圖片的一個新名稱,將此新名稱保存至數(shù)據(jù)庫中,而圖片文件本身保存至Web應(yīng)用程序的某個特定目錄下。在本系統(tǒng)中圖片信息主要指新生的照片。
水晶報表中不識別擴展名為GIF格式的圖片,所以學(xué)生照片盡量采用JPG或PNG格式,本系統(tǒng)中從全國高考錄取系統(tǒng)中導(dǎo)出的學(xué)生照片均為JPG格式。如果使用第1種方法保存圖片信息,在水晶報表中連接至數(shù)據(jù)源DataSet后,可以將數(shù)據(jù)源中的學(xué)生照片字段直接拖至報表界面,即可正確顯示學(xué)生照片。在本系統(tǒng)中為了減小數(shù)據(jù)庫的占用空間,照片信息使用第2種方式保存,這也使得不能像第1種方式一樣簡便地使水晶報表呈現(xiàn)學(xué)生照片,中間需要一個轉(zhuǎn)換過程,具體如下:
(1)在創(chuàng)建數(shù)據(jù)源DataSet架構(gòu)時,照片字段必須設(shè)置為System.Byte[]類型。
(2)在使用DataAdapter對象填充DataSet時,照片字段要經(jīng)由如下方法進行轉(zhuǎn)換,將原來字符串格式的照片名結(jié)合相應(yīng)路徑后轉(zhuǎn)換成字節(jié)數(shù)組。
(3)將轉(zhuǎn)換成功的照片字段直接拖拽至報表界面中,即可正確顯示學(xué)生照片,實現(xiàn)效果如圖4。
水晶報表可以接收Web應(yīng)用程序傳遞的參數(shù),報表可以根據(jù)接收到的參數(shù)值在數(shù)據(jù)源中進行數(shù)據(jù)篩選,從而顯示滿足參數(shù)條件的記錄集。如顯示某專業(yè)下的班級記錄,數(shù)據(jù)源中包含所有的班級記錄,報表要根據(jù)傳遞的專業(yè)信息動態(tài)顯示此專業(yè)下的班級記錄,這需要在報表文件和調(diào)用報表的代碼中同時定義參數(shù)字段專業(yè),2處所定義的參數(shù)數(shù)據(jù)類型和名稱要嚴(yán)格保持一致,具體過程如下:
(1)在報表文件中新建參數(shù)字段MajorID,并編輯此參數(shù)字段,使數(shù)據(jù)源中的專業(yè)字段(假設(shè)為MID)的值等于此參數(shù)字段,如圖2所示。
圖2 參數(shù)字段的設(shè)置
(2)在調(diào)用報表的代碼中設(shè)置相同的參數(shù)字段MajorID,并為其賦值,具體代碼如下:
本系統(tǒng)如果使用ASP或JSP實現(xiàn),新生錄取通知書的設(shè)計及制作都會非常復(fù)雜,而在.NET中,因為內(nèi)置了水晶報表,實現(xiàn)起來相對較為容易,但因為此報表中包含學(xué)生照片及掃描槍所要識別的通知書編號條形碼,都屬于較為復(fù)雜的報表應(yīng)用,所以此報表的實現(xiàn)也是本系統(tǒng)的一個難點。通知書編號在數(shù)據(jù)庫中以普通字符串的格式保存,需要先將此字符串前后加“*”字符,然后按照Code39碼的字符與條碼的轉(zhuǎn)換依據(jù),將普通的字符串轉(zhuǎn)換成條碼字符串,再借助于.NET中的GDI+轉(zhuǎn)換成圖像,最后生成對應(yīng)的字節(jié)數(shù)組。在這個過程中,Code39碼的轉(zhuǎn)換依據(jù)是固定的,使用GDI+轉(zhuǎn)換成圖像的具體過程如下:
報表設(shè)計界面如圖3。
圖3 新生錄取通知書報表設(shè)計界面
網(wǎng)頁運行時,為了能夠正確顯示出條形碼,計算機必須先安裝C39P72D1Tt.TTF字體到系統(tǒng)字體文件夾(C:\WINDOWS\Fonts)中,具體顯示界面如圖4所示。
圖4 新生錄取通知書報表顯示界面
系統(tǒng)在學(xué)校內(nèi)全面公測時,各院系分別使用各自的賬號登錄系統(tǒng)測試學(xué)生信息打印及導(dǎo)出功能時出現(xiàn)了此問題,經(jīng)過作者的反復(fù)研究及測試,發(fā)現(xiàn)出現(xiàn)此問題有2個原因:
(1)自身編碼的問題
在編碼過程中,使用完CrystalDecisions.Crys-talReports.Engine.ReportDocument報表文檔對象后沒有及時關(guān)閉并釋放,解決方法是在處理報表頁面加上以下代碼:
(2)操作系統(tǒng)默認(rèn)打開的報表數(shù)量有限
操作系統(tǒng)默認(rèn)打開的報表數(shù)量是有限制的,如果很多用戶同時應(yīng)用報表功能,可能會出現(xiàn)如上問題,這需要在注冊表中增加操作系統(tǒng)默認(rèn)打開的報表數(shù)量,具體方法如下:點擊“開始”,在運行中輸入“regedit”打開注冊表編輯器,修改PrintJobLimit的值,完成后重啟電腦,使修改生效。
第1處:HKEY_LOCAL_MACHINE;SOFTWARE;Crystal Decisions;10.0;Report ApplicationServer;InprocServer;PrintJobLimit把 它 的 值100修改為一個足夠大的數(shù)目。
第2處:HKEY_LOCAL_MACHINE;SOFTWARE;Crystal Decisions;10.0;Report ApplicationServer;Server;PrintJobLimit修改為把它的值76修改為一個足夠大的數(shù)目。
此問題出現(xiàn)在作者編碼過程中,由于作者的電腦上安裝了多個VS版本,導(dǎo)致在VS2010中報表使用出現(xiàn)問題。具體表現(xiàn)為:VS2010中的水晶報表單獨安裝成功后,會在VS的工具欄中出現(xiàn)【報表設(shè)計】一欄,里面有3個控件,當(dāng)把這3個控件任意一個拖拽到頁面上時,控件會報錯,顯示“未將對象引用設(shè)置到對象實例”,運行頁面,則會出現(xiàn)如下提示:類 型 “CrystalDecisions.Web.CrystalReport-Viewer”同時存在于“c:\Windows\assembly\GAC_MSIL\CrystalDecisions.Web\13.0.2000.0_692fbea5521e1304\CrystalDecisions.Web.dll”和“c:\Windows\assembly\GAC_MSIL\CrystalDecisions.Web\10.5.3700.0_692fbea5521e1304\CrystalDecisions.Web.dll”中,這是因為 VS2010中水晶報表V13與VS2008中水晶報表V10版本沖突,導(dǎo)致程序在編譯時無法正確定位到正確版本的DLL文件,在VS2010中,所有的DLL文件都應(yīng)該使用V13,具體解決方法如下:
(1)先檢查web.config文件中關(guān)于程序集的引用,是否為V13版本
(2)在項目根目錄下添加Bin文件夾,將C:\Program Files\SAP BusinessObjects\Crystal Reports for.NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet文件夾中的5個DLL文件復(fù)制到當(dāng)前項目的Bin文件夾中:
(3)最后將VS工具箱中“報表設(shè)計”選項卡下用到的控件拖拽到Web頁面中,切換到HTML視圖,將頁面頭部關(guān)于水晶報表的引用代碼,由版本10修改為版本13:
設(shè)計不同業(yè)務(wù)邏輯所需的報表時,可能會遇到不同的問題,以上是作者在本系統(tǒng)中遇到的典型問題,其他小問題此處不再贅述。
應(yīng)用水晶報表實現(xiàn)了高校學(xué)生信息管理系統(tǒng)中的各種報表設(shè)計,系統(tǒng)運行3年來報表顯示穩(wěn)定、準(zhǔn)確、即時、高效,避免了之前各用戶在傳遞和共享資料時的煩瑣、不及時和不準(zhǔn)確等問題,并且提供了報表查看的多樣化,既可以在線查看、也可以導(dǎo)出PDF、Excel等電子版,還可以打印紙質(zhì)版,進一步促進了高校的信息化管理。
[1]李航,陳志國,沈建.基于.NET的報表實現(xiàn)技術(shù)的分析[J].軟件導(dǎo)刊,2008,7(1):50-53.
[2]甘光生..NET環(huán)境下使用水晶報表系統(tǒng)設(shè)計與實現(xiàn)WEB報表[J].電腦知識與技術(shù),2005(30):60-62.
[3]林小龍,吳奕甫,羅光紅..NET環(huán)境中內(nèi)置的水晶報表的生成和發(fā)布[J].信息技術(shù),2010(10):149-151.