VB数据报表data report.docx
- 文档编号:8869844
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:93.42KB
VB数据报表data report.docx
《VB数据报表data report.docx》由会员分享,可在线阅读,更多相关《VB数据报表data report.docx(14页珍藏版)》请在冰豆网上搜索。
VB数据报表datareport
vb6中用datareport做报表
我不是vb熟练工,最近刚刚用vb做完一个程序,其中控制部分没费太大周折,倒是报表部分颇让我费了一翻脑筋。
在网上找了半天,也没找到关于vb6的datareport的详细介绍,于是想借鉴"前辈"们的经验,用crystalreport或excel,感觉也不省劲,于是决定回头再去"啃"datareport,别说,还真让有所收获,下面就简单的介绍一下我的体会,希望对大家能有所帮助。
首先介绍一下datareport对象的几个常用属性。
一是datasource,用于设置一个数据源,通过该数据源,数据使用者被绑定到一个数据库;二是datamember,从datasource提供的几个数据成员中设置一个特定的数据成员;三是leftmargin、rightmargin、topmargin、bottommargin等,用于指定报表的左右上下的页边距;四是sections,即datareport的报表标头、页标头、细节、页脚注、报表脚注5个区域,如果加上分组(可以有多层分组),则增加一对区域,即分组标头、分组脚注。
其中datasource一般是一个数据环境或是adodb.connection类型的变量,而datamember则对应数据环境中的command或是adodb.recordset类型的变量,推荐使用数据环境及command,页边界大家肯定都很清楚,下面我主要介绍以下sections,这也是datareport的精髓所在。
sections是一个集合,您可以为每一个section指定名称,也可以用其缺省的索引,从上到下依次为1、2…。
每个section均有height和visible属性,您可以在一定条件下使一个section不可见。
在section中可以放置各种报表控件,其中rptlabel、rptimage、rptshape和rptline可以放在任意的section中,用于输出各种文字、图形及表格线;rpttextbox只能放在细节中,一般用于绑定输出datamemeber提供的数据字段;rptfunction只能被放置在分组注脚中,用于输出使用各种内置函数计算出的合计、最大值、最小值、平均值、记数等等。
上述报表控件中常用公共属性有用于控制位置及高度宽度的top、left、height、width和控制可见性的visible;其中rpttextbox还有datafield、datamember、dataformat及font属性;其他属性不再多说。
然后介绍一下我的使用经验。
一是对想控制的报表控件按类型有规律的命名;二是用rptshape的矩形框做表格线框,比用rptline画框省事多了,只有斜线才使用rptline;三是报表标题及报表中的表头文字、日期及页码用rptlabel,其中caption属性支持转义字符,%d为长格式日期,%d为短格式日期,%p为总页数,%p为当前页码;四是对固定报表在设计窗口直接将报表控件摆放到位,对于活报表,应首先考虑报表最大的情形,将足够的控件分别放置在不同区域,位置大小可以不必深究,然后在报表输出前用vba代码对所有控件的属性进行调整,包括位置、高度、宽度、字体、对齐方式、显示格式、可见性等等,相应的对section也应根据情况调整其高度和可见性。
最后用一个实例模板来说明其使用方法。
连接数据库
with数据环境.rscommand名
if.state=adstateopenthen.close
.source=sql语句
.open打开想输出的数据库数据项以便输出
endwith
with报表名
.datasource=数据环境
.datamember=command名这两行也可固定设好而不必每次设置
设置页表头部分(rpttlabel…为报表控件名)
.sections
(2).controls("rptlabelpage").caption="共%p页第%p页"
.sections
(2).controls("rptlabeldate").caption="打印日期:
%d"
.sections(3).controls("rptlabel1").left=…
…
设置细节部分(rptshapex、rpttextboxx为报表控件名)
.sections(3).controls("rptshape1").left=…
.sections(3).controls("rptshape1").top=…
.sections(3).controls("rptshape1").height=…
.sections(3).controls("rptshape1").width=…
.sections(3).controls("rpttextbox1").datamember=command名
.sections(3).controls("rpttextbox1").datafield=字段1
.sections(3).controls("rpttextbox1").font.name=…
…
.sections(3).controls("rptshapen").visible=false
.sections(3).controls("rpttextboxn").visible=false
…
.sections(3).height=计算出的或固定的细节高度
动态调整报表标题(rptlabeltitle为报表标签控件名)
.sections
(2).controls("rptlabeltitle").left=…
…
.sections
(2).controls("rptlabeltitle").alignment=…
…
调整完毕后
.show或.printreport
endwith
这样做的优点是报表设计时简单,调整方便、随意,只需更改一点代码,而不必为了一点点的修改而费神的在设计窗口调整半天。
急
------------------------------------------------------------------------------------
原因找到了,灵感来自“vbman2003 ”的赋值!
处理办法:
原来报表窗体中的DataSource选中的是“DE”,现在去掉,改用赋值的方法:
Set myRpt.DataSource = DE。
测试结果:
内存再也没递增了,而且查询出报表速度奇快!
------------------------------------------------------------------------------------
好象看过MSDN,,一般情况下rpt关闭后会自动释放报表对象。
我想你的情况可能是二个,一是用了DE,不过这个只是推测,因为没有用过这个,或者是用法上有问题。
二是你是在窗体相关事件中设置和绑定报表数据源的,个人认为更恰当的用法应该是放在DataReport_Initialize事件中。
个人看法,不一定正确,只供参考。
------------------------------------------------------------------------------------
好建议!
估计出报表的速度会大大提高。
我把代码交给搭档研究,还望多多指教!
------------------------------------------------------------------------------------
你这个CRAXDDRT.Application 释放了么
还有这个 CRAXDDRT.Report
------------------------------------------------------------------------------------
不要用DE,改用ADO吧,测试了一下,用ADO返回10000多条数据,反复打开,内存始终在404-407M之间(同时运行其它程序)。
示例代码如下:
:
窗体上:
Private Sub cmdRptGroup_Click()
Dim rpt As New RptGroup
'显示分组报表
rpt.Show
End Sub
报表代码:
Option Explicit
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Private Sub DataReport_Initialize()
Dim Sql As String, strSql As String
'连接数据库(Access)
Set cn = New ADODB.Connection
With cn
.Provider = "MSDataShape.1" '一定要这句
.Open "Data Provider=Microsoft.Jet.OLEDB.4.0 ;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
End With
'设置RptTextBox控件属性
'分组标头,注意不要设置其DataMember属性
Me.Sections("Section6").Controls("text1").DataField = "gp"
'细节标头,其中“miCmd”是分组名称
Me.Sections("Section1").Controls("text2").DataField = "iName"
Me.Sections("Section1").Controls("text2").DataMember = "miCmd"
Me.Sections("Section1").Controls("text3").DataField = "iCode"
Me.Sections("Section1").Controls("text3").DataMember = "miCmd"
Me.Sections("Section1").Controls("text4").DataField = "gp"
'RptGroup.Sections("Section7").Controls("text5").DataMember = "miCmd"
Me.Sections("Section7").Controls("text5").DataField = "iCode" '分组合计
'查询表:
Sql = "SELECT * FROM tb "
'打开查询记录集
strSql = "SHAPE {" & Sql & " } " & _
"AS miCmd COMPUTE sum(miCmd.iCode) as iCode,miCmd BY 'gp' "
Set rs = New ADODB.Recordset
rs.Open strSql, cn, adOpenStatic, adLockReadOnly
Set Me.DataSource = rs
End Sub
Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
If rs.State = adStateOpen Then rs.Close
If cn.State = adStateOpen Then cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
------------------------------------------------------------------------------------
..................
myRpt.Caption = strDRPName
myRpt.Show 1
Set myRpt = Nothing
Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
Set drpGas_Money = Nothing
DE.CT.Close
Set DE = Nothing
End Sub
代码修改后测试结果:
第一次运行预览报表内存PF使用率924MB
第二次 973MB
第三次 0.99GB
关闭程序(VB工程还开着)PF使用率降到826MB
毫无进展啊!
国庆期间的疑难问题啊!
------------------------------------------------------------------------------------
dim rpt as new drpGas_Money
...................................
rpt.show 1
set rpt=nothing
------------------------------------------------------------------------------------
报表的数据环境=nothing
报表窗口drpGas_Money也关闭了
内存还是释放不掉。
每运行一次增加约50M内存消耗,end后才释放。
------------------------------------------------------------------------------------
dim rpt as new drpGas_Money
...................................
rpt.show
set rpt=nothing
在drpGas_Money的Form_Terminate里面把你定义的所有object都=nothing
诸如此类
CRAXDDRT.Application
CRAXDDRT.report
ADODB.Connection
------------------------------------------------------------------------------------
内存还是没有释放!
------------------------------------------------------------------------------------
1、生成EXE问题依旧。
(是用户先发现内存溢出的)
2、
dim rpt as new drpGas_Money
...................................
rpt.show
Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
Set drpGas_Money = Nothing
Set DE = Nothing
End Sub
------------------------------------------------------------------------------------
这样试试:
先
dim rpt as new drpGas_Money
rpt.show
再在datareport_initialize()事件中绑定数据
最后在DataReport_QueryClose中释放报表对象
------------------------------------------------------------------------------------
试一下NEW:
dim rpt as new drpGas_Money
rpt.show
关闭报表时释放对象
Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
Set drpGas_Money = Nothing
End sub
手边没有VB,测试不了。
。
。
------------------------------------------------------------------------------------
你生成EXE后看看有没这样的情况.......
------------------------------------------------------------------------------------
Set DE = Nothing
DE.CT.ConnectionString = strCnn
DE.Commands("gas_money").CommandText = "SELECT * FROM ChargeArre WHERE ........"
strDRPName = "普通用户管道燃气抄度报表" & Rep_pay
drpGas_Money.Sections
(2).Controls("LTD_Name").Caption = Bran_ch
drpGas_Money.Sections
(2).Controls("Report_Name").Caption =strDRPName
drpGas_Money.Caption = strDRPName
drpGas_Money.Show
监测结果:
从“drpGas_Money.Sections
(2).Controls("LTD_Name").Caption = Bran_ch
”开始内存占有率开始升高,到“drpGas_Money.Show”达到本次最高。
关闭报表窗口drpGas_Money后内存占有率没降低,如果再次查询预览,内存占有率继续升高,.........多次之后内存溢出!
郁闷啊,找不到解决办法。
现在暂时只能让用户每次预览报表的时候都监控内存占有率,快到的时候退出软件再进入。
------------------------------------------------------------------------------------
用了数据环境?
这个就不清楚了,DataReport很少使用,用的时候都是用ADO连接,不用DE,而且数据量不是很大,没有发现楼主的问题
------------------------------------------------------------------------------------
测试结果:
set data environment=nothing (数据环境)
set myRpt_money=nothing (报表)
已占用的内存没有减少,继续打开报表内存依旧在递增(XP任务管理器中的PF使用率显示结果)
看来要从VB清理内存着手了。
------------------------------------------------------------------------------------
在所有有关的 事件里面
Set youRptName = Nothing
------------------------------------------------------------------------------------
没遇见过这样的情况,试试:
Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
Set youRptName = Nothing
End Sub
------------------------------------------------------------------------------------
考虑把rs关闭掉,再释放掉。
------------------------------------------------------------------------------------
使用DataReport打印查询结果-vb教程
点击:
发布日期:
2007-4-1915:
35:
21 进入论坛
P>
如果我们想把查询结果打印出来,那么我们经常用到DataReport,在这里我说的是直接用记录集rs给DataReport设数据源。
为了快速将查询结果中的字段加入到DataReport,我们先来建一个DataEnvironment1,设置好DataEnvironment1中的Connection1的连接,然后在DataEnvironment1中的Connection1中右键添加子命令Command1,在Command1上右键,属性,选择SQL语句,将我们的查询语句写进去,确定,完毕后就可以看到我们希望显示的字段了。
如果需要,可以添加多个子命令。
然后新建一个DataReport1,点住DataEnvironment1中的Command1不放,直接拖到DataReport1中的细节区,然后再根据需要调整各字段位置就行了。
注意要将细节区中的各个textbox的DataMember置空。
然后在程序里面写代码就可以了。
如DimrsdrAsNewADODB.Recordset
Setrsdr=Conn.Execute(sqlall)
Setdrqueryall.DataSource=rsdr
drqueryall.Show
VisualBasic通用报表设计小结
·2005-10-0810:
39:
32·来源:
天极网
[文章导读]本文对vb设计报表的方法作了一个小结,大家都知道,在VB平台下制作报表大致有两种选择:
使用VB自带的DataReport控件和借助第三方软件。
其中第三方软件比较著名的就是MSExcel和Seagate公司的Cr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB数据报表data report VB 数据 报表 data