—-在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下调试通过。->