vb报表分组

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在VB中使用动态分组报表

在使用VB自带的报表过程中,我遇到了处理动态分组报表的问题。一般要使用分组报表要在VB中建立一个DataEnvironment,并在其中建立数据库联接和命令对象,在命令对象中设置分组字段,最后将这些分组字段加入到报表中。但是这种方法只能适应静态的数据源,当遇到数据表中的字段不固定,或数据表不能预先知道的情况时,这种方法就无能为力了。经过查阅各种资料,发现我们可以通过使用Data Shaping来动态创建分组信息。下面就详细介绍一下如何动态创建分组信息,并应用于VB报表。

要使用Data Shaping,程序必须使用ActiveX Data Object (ADO)连接数据库,解决问题的关键是使用Data Shaping的驱动程序代替通常使用的各种OLE DB的驱动程序,它的用法跟使用其它驱动程序类似,对于已有的数据访问代码不用作任何修改,只是简单的修改一下连接代码就可以支持Data Shaping了。具体做法如下:

将连接参数中的

Provider设置成"MSDataShape" 即

ConnectionString = "Provider=MSDataShape;Data Provider=通常的驱动程序;Data Source=…;其它的参数"

然后就可以和平常一样进行数据连接和各种数据操作了。如此连接的数据源出了具有用普通方法的所有特性以外,同时具有了我们即将使用的Data Shaping功能,下面就可以建立自己的分组信息了:

将用于打开记录集的SQL语句写成如下形式:

SHAPE {select 字段1, 字段2, 字段3,…, 字段n from 现有的表} AS 新的名称1

COMPUTE新的名称1 AS新的名称2 BY 分组字段1, 分组字段2,…, 分组字段n

上面的语句中,需要注意的是分组字段必须同时在Select 中出现,否则运行时将报错。用该SQL语句打开的记录集中包含若干个字段,它们是:新的名称2、分组字段1-n。在使用时,将打开的记录集rs作为报表的DataSource,在报表的分组部分可以直接且只能使用

分组字段1-n以及各种统计函数,在正文中使用字段1-n时,应将对应编辑框的DataMenber 设置为”新的名称2”,具体请参考以下语句

MyReport.Sections("GroupHeader").Controls("Text1").DataField =”分组字段1”

MyReport.Sections("GroupFooter").Controls("Function1").DataMember = "新的名称2"

MyReport.Sections("GroupFooter").Controls("Function1").DataField = "字段1"

MyReport.Sections("PageContent").Controls("Text2").DataMember = "新的名称2"

MyReport.Sections("PageContent").Controls("Text2").DataField =”字段1”

按照以上的方法就可以对带有分组的报表进行动态数据绑定了,这对于那些操作临时表的情况十分有用,因为临时表是无法用设计器设计分组的。

关于Data Shaping的详细介绍可以去参考MSDN在线资源,在一般情况下我们可以用设计器去设计一个类似的结构,然后查看VB设计器生成的代码,这样就可以套用我们自己表了。

Dim cn As ADODB.Connection

Dim rs As ADODB.Recordset

Dim Sql, 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属性

RptGroup.Sections("Section6").Controls("text1").DataField = "编号"

'细节标头,其中“miCmd”是分组名称

RptGroup.Sections("Section1").Controls("text2").DataField = "编号"

RptGroup.Sections("Section1").Controls("text3").DataField = "名字"

RptGroup.Sections("Section1").Controls("text3").DataMember = "miCmd"

'查询表:

Sql = "SELECT * FROM tb "

'打开查询记录集

strSql = "SHAPE {" & Sql & " } " & _

"AS miCmd COMPUTE miCmd BY '编号' "

Set rs = New ADODB.Recordset

rs.Open strSql, cn, adOpenStatic, adLockReadOnly

Set Me.DataSource = rs

相关文档
最新文档