|
Visual Basic中如何實現動態報表是一個在眾多VB網站論壇上提問頻率很高的問題,在實際項目中, 作者也遇到這個問題, 經過一番深入研究,用一種簡單的方法在Visual Basic中實現了動態報表。
Visual Basic中制作報表的工具有很多,如Crystal報表編輯器、Datareport報表窗體、Printer對象以及象Vsview等一些第三方控件。但Crystal報表編輯器一般只能制作定制報表,Printer對象操縱起來非常復雜,第三方控件多數需要購買,費用不非。作者制作動態報表是通過Datareport窗體實現的,以下通過一個具體的例子說明是如何實現動態報表的。
假設在C盤dongtai目錄下存放一個Access數據庫stock.mdb,其中的"股票行情表"用來記錄股票行情,"股票行情表"的數據結構如1表所示:
表1 "股票行情表"數據結構
| 字段名稱 | ID | stockno | stockname | price | swing | maxprice | minprice | bargain |
| 數據類型 | 長整型 | 文本 | 文本 | 雙精度型 | 雙精度型 | 雙精度型 | 雙精度型 | 長整型 |
| 說 明 | 序號 | 股票代號 | 股票名稱 | 收盤價 | 漲跌 | 最高價 | 最低價 | 成交量 |
如果要設計這樣的一個報表,報表輸出字段由用戶自己決定,用Datareport窗體如何設計呢?下面一步一步地說明。
1. 熟悉Datareport窗體和數據報表控件
Datareport窗體是一個和普通窗體相似的窗體,最大的差別是該窗體上只能擺放數據報表控件,這種類型的控件只有六種,他們分別是:RptLabel,Rpt Text Box,RptImage,RptShape,RptLine,RptFunction。從名稱上基本可以識別他們的用途,RptLabel用來顯示非數據綁定的文本的標簽;通常用來制作報表的頁標題;Rpt Text Box顯示數據綁定的文本的內容,即顯示數據庫的字段的內容;RptImage顯示一個圖形,例如一個公司的商標;RptShape能夠畫出許多圖形,強調信息或增強視覺效果;RptLine能夠在報表中畫線,分割報表種不同的區域;RptFunction允許在報表標題或報表注腳區域擺放,它包含一個簡單的數學統計函數。Datareport窗體和數據報表控件如圖1所示。
圖1 Datareport窗體和數據報表控件
為了能夠輸出所有字段,必須在Datareport窗體不同的區域中擺放足夠數量的相關報表數據控件,本例最多字段為八個,所以在"頁標頭"區域(section2)擺放了八個Rptlabel控件、九條豎分割線和上下兩條橫線,在"細節"區域(section1)擺放了八個Rpt Text Box 控件、九條豎分割線和下面一條橫線,如圖1所示。同時為了以后的編碼方便,對各控件采用如下的命名方式:控件名稱為控件類型+區域號+序號,例如,"頁標頭"區域(section2)八個Rptlabel控件分別命名為label21、label22、label23……label28,細節"區域(section1)的八個Rpt Text Box 控件分別命名為Text11、Text12、Text13……Text18,各區域的豎分割線采用同樣的命名方式,但橫分割線以控件類型+區域號來命名,如"頁標頭"區域中的上下兩條橫線分別命名為Line2和Line_2,在后面的代碼里可以看出這種命名方式的好處。
Datareport窗體中最重要的三種數據控件是Rpt Text Box、Rptlabel和RptFunction,必須分別設置它們的屬性,Rpt Text Box最重要的屬性是datafield,該屬性指明了綁定記錄的字段名稱;Rptlabel最重要的屬性是Caption,該屬性指明要顯示的文本內容;RptFunction最重要的屬性是datafield和functiontype,前者指明要綁定且作統計的記錄的字段名稱,后者指明統計函數的類型。這三種控件有一共同屬性是Gangrow,該屬性值為True時,當顯示的內容超過控件的寬度時可以換行。Datareport窗體也有很多屬性,如LeftMargin、RightMargin 、TopMargin 、BottomMargin 、reportwidth 、DataSource 等,其中reportwidth 設置報表的紙面寬度(必須減去左右頁邊距的寬度),reportwidth 須與打印機設置的紙面大小相對應,DataSource設置Datareport窗體的數據源。需要說明的是Datareport窗體中的各個區域都是對象,如section1.section2等,他們也有很多的屬性,其中重點提出Keeptogther屬性,當Keeptogether為True時,如果某條記錄處在一頁的最下面,但又不能夠完全的打印出來時,可強制這條記錄換到下一頁輸出,從而保證數據的完整性。以上只是簡單的說明了Datareport窗體中涉及到的一些重要屬性,其它未加說明的屬性可在相關書籍和MSDN中查閱。