----在VisualBasic中制作報表,一般是用數據環境設計器(DataEnvironmentDesigner)與數據報表設計器(DataReportDesigner)相結合來實現的。上述方法通常應用於客戶/服務器(C/S)結構。下面,讓我們一起來探討一下DataReportDesigner在多層結構中的應用。
----一、前言
----多層應用開發之所以能夠成為程序開發的主流技術,是與其具有的數據訪問和事務處理能力緊密相關的。多層應用開發在邏輯上則分為三層:客戶(表現層),應用服務器(業務層)和數據庫(數據層)。客戶向服務器發請求,作為中間層的服務器接收請求提供相應的邏輯、性能和目錄服務,並最終通過服務器建立與數據庫的連接。多層應用開發中很重要的一點是將應用邏輯集中於服務器,這樣一個進程便可以為多個客戶服務,而不用再為每客戶都建立一個服務器進程。下文可作為表現層的一個例子。
----二、數據結構
----假設我們要打印兩項數據,其定義如下:
字段名數據類型數據長度
tidchar10
tnamechar20
----三、創建工程
----(1)在新建工程中選取“標准EXE”後按“確定”鍵,修改工程名為Rptprint,修改Form1的name屬性為frmreport。增加一個類模塊,修改Class1的name屬性為clsreport。如果在“工程”菜單中未發現“添加DataReport”的子菜單,則要進行以下操作,單擊“工程”菜單中的“部件”,選中“設計器”中的“DataReport”選項後單擊“確定”按鈕。此時應在“工程”菜單中發現“添加DataReport”的子菜單,單擊該子菜單添加一個DataReport到工程。
----(2)添加四個CommandButton控件(name屬性分別為Command1、Command2與Command3,Command4,caption屬性分別為“增加”、“預覽”、“打印“與“返回”)和兩個TextBox控件(name屬性分別為TxtID與TxtName)到frmreport窗體。
----(3)雙擊工程中的DataReport1打開設計器,添加兩個RptTextBox控件(名稱分別為Text1和Text2)到“細節(Section1)”分組中,修改Text1的DataField屬性為tid,Text2的DataField屬性為tname。
----(4)引用MicrosoftActiveXDataObjects2.0Library類庫,做完以上操作後保存工程。
----四、編寫程序
----(1)在clsreport類模塊輸入如下代碼:
OptionExplicit
PrivateRST_RPTAsADODB.Recordset
'定義一個記錄集變量
PrivateSubClass_Initialize()
SetRST_RPT=CreateObject("ADODB.Recordset")
'創建一個空的記錄集
WithRST_RPT
.Fields.Append"tid",adChar,10
.Fields.Append"tname",adChar,20
'往記錄集中添加字段(此例假設只有兩個,
如需要可增加多個字段)
.CursorLocation=adUseClient
'設置CursorLocation屬性為“客戶端游標”
EndWith
RST_RPT.Open
'打開記錄集
SetDataReport1.DataSource=RST_RPT
'設置DataReport1設計器的數據源為RST_RPT記錄集
EndSub
PrivateSubClass_Terminate()
IfNotRST_RPTIsNothingThen
RST_RPT.Close
'關閉記錄集
EndIf
SetRST_RPT=Nothing
'撤消對象
EndSub
PublicFunctionAddRecord(strdata
()AsString)AsBoolean
OnErrorGoToerrdo
'錯誤捕獲
WithRST_RPT
.AddNew
!tid=strdata(1)
!tname=strdata(2)
'給記錄集賦值
.Update
'更新修改
EndWith
AddRecord=True
'如果成功則返回“真”
ExitFunction
errdo:
'可根據需要對錯誤進行分類處理
'方法可查閱隨機文檔的“調試代碼和處理錯誤”部分
'此例省略
AddRecord=False
'如果失敗則返回“假”
SetRST_RPT=Nothing
'撤消對象
EndFunction
PublicFunctionPrint_Report()AsBoolean
OnErrorGoToerrdo
IfNotRST_RPTIsNothingThen
SetDataReport1.DataSource=RST_RPT
'重置數據源
EndIf
DataReport1.PrintReport
'直接打印
Print_Report=True
'如果成功則返回“真”
ExitFunction
errdo:
Print_Report=False
'如果失敗則返回“假”
EndFunction
PublicFunctionShow_Report()AsBoolean
OnErrorGoToerrdo
IfNotRST_RPTIsNothingThen
SetDataReport1.DataSource=RST_RPT
'重置數據源
EndIf
DataReport1.Show
'浏覽
Show_Report=True
'如果成功則返回“真”
ExitFunction
errdo:
Show_Report=False
'如果失敗則返回“假”
EndFunction
----(2)在frmreport窗體輸入如下代碼:
OptionExplicit
PrivateobjAsclsReport
'定義局部變量
PrivateSubCommand1_Click()
Dimb1AsBoolean
Dimsd(2)AsString
DimmgAsInteger
sd(1)=Trim(TextID.Text)
sd(2)=Trim(TextName.Text)
'把要打印的數據賦給sd數組,此例的數據來自文本框。
'在多層開發應用中數據源通常是通過業務層和數據層處理
'後返回的記錄集(如ADODB.Recordset),把記錄集
'賦給sd數組,即可打印。注意要保持記錄集的字段數
'與設計器的文本框數一致。
b1=obj.AddRecord(sd)'增加記錄
Ifb1=TrueThen
mg=MsgBox("增加記錄成功!",vbOKOnly,"打印消息")
Else
mg=MsgBox("增加記錄失敗!",vbOKOnly,"打印消息")
EndIf
EndSub
PrivateSubCommand2_Click()
Dimb1AsBoolean
DimmgAsInteger
b1=obj.Show_Report'浏覽記錄
IfNotb1Then
mg=MsgBox("浏覽操作失敗!",vbOKOnly,"打印消息")
EndIf
EndSub
PrivateSubCommand3_Click()
Dimb1AsBoolean
DimmgAsInteger
b1=obj.Print_Report'打印報表
IfNotb1Then
mg=MsgBox("打印操作失敗!",vbOKOnly,"打印消息")
EndIf
EndSub
PrivateSubCommand4_Click()
UnloadMe
'關閉窗口
EndSub
PrivateSubForm_Load()
Setobj=NewclsReport
'創建對象實例
EndSub
PrivateSubForm_Unload(CancelAsInteger)
Setobj=Nothing
'撤消對象
EndSub
----五、小結
----上例具有如下特點:(1)組織數據很靈活,既可以是本地數據也可以是記錄集或者倆者相結合。(2)程序運行速度很快,它比用VB生成Excel報表快得多。(3)易於移植,只要建立ActiveXDLL工程,加入clsReport和DataReport1模塊編譯成動態庫,即可被其他應用程序調用。建議:可修改clsReport類模塊的屬性把它直接作為DataReport1數據源,關於類模塊的詳細用法可查閱有關文檔。本例用VisualBasic6.0(專業版)編寫,在Windows95下調試通過。->