在利用VB开发MIS系统的过程中,经常需要制作动态统计报表。本文就如何实现动态数据源下的分组交叉统计报表进行阐述,并结合实例给出编程指导。
在VB6.0的数据环境设计器中,我们可以利用“添加命令”一项来连接报表所需的数据源,同时利用“添加命令”属性中的分组与合计功能设计分组交叉统计报表的数据源,至此我们可以设计简单的数据存在于单一表静态数据源下分组交叉报表,对于数据存在多表的复杂的动态数据源下的分组交叉报表来说,仍实现不了,实现该功能的关键在于构造一个符合动态数据源要求的中间表。下面以一管理系统中工程成本统计报表的实例来说明如何实现动态数据源下的分组交叉统计报表。
一、报表要求与分析
该报表要求列出在指定的时间段内实施的各项工程所耗器材明细、数量、费用,并且计算各项工程的成本,最终计算所有工程的累计成本。
需求分析后可知该报表是个典型的动态数据源下分组统计报表,分组项为工程名称,要求对每个分组进行子汇总和对所有分组进行总汇总。由于在该系统中的出库单和出库单明细分别存放在不同的表中,因此必须根据报表的要求预先构造一个成本统计中间表,命名为EquipMentCost。相关表结构如图1。
通过对表OutBill和OutBillDetail的分析,发现两者通过关键字OutBill 相联,下面通过SQL语句生成中间表EquipmentCost,语句如下:
Insert into EquipmentCost
(Project,Name,Standard,Type,Num,Cost)
select a.project as 'Project', b.name as 'Name',b.standard as 'Standard', b.type as 'Type',b.num as 'Num', b.numb.price as 'Cost' from Outbill a left join OutbillDetail b on (a.outbill=b.outbill)
where a.OutDate>=date1 and a.OutDate<=date2
date1 和 date2 变量用来指定时间,注意插入前要先清空该中间表的所有数据。
二、利用数据环境设计器生成工程成本报表的初始模板
打开一个数据环境设计器,在其属性表单中设置其名称属性为EnvCatv,并添加一个数据库连接到当前库Catv,连接名称为CatvConn。在当前库连接下单击右键,选择“添加命令”选项,创建一个命令,命名为CmdCost,在该命令的属性页的“通用”选项页上设置SQL语句如下:
Select from EquipmentCost
单击“应用”按钮察看效果。
随后对该命令进行分组,右键单击该命令,选择“属性”选项,在属性页的“分组”选项页中,将Project(工程名称)字段设置为分组字段,分组名称为GroupCost,单击“应用”按钮观看效果。
接着对该命令进行子汇总,右键单击该命令,选择“属性”页的“汇总”选项页,将Num(器材数量)、Cost(器材成本)设置为子汇总字段,分别命名为“合计1”、“合计2”,汇总名称为GrantTotal,该名称为总汇总所共用。在程序中显示报表前,必须对该名称对应的记录集RsGrantTotal进行刷新,否则数据报表不能反映统计中间表的最新内容。单击“应用”按钮观看效果。
最后对该命令进行总汇总,右键单击该命令,选择“属性”页的“汇总”选项页,将“合计1”、“合计2”设置为总汇总字段,分别命名为“总计1”、“总计2”,单击“应用”按钮观看效果。
按照上面的步骤,我们在当前连接CatvConn下建立了一个包含汇总的分组命令,接着建立一个数据报表设计器命名为RptCost,将该分组子命令拖到数据报表的“细节”段内,释放后,调节各个字段的大小和位置,其中,子汇总字段和总汇总字段还应该分别另建分组节,总汇总字段所处的节应位于最上层。
三、在程序中填充统计中间表,更新数据报表并显示
设计一个打印模块如下:
Public Sub Print_EquipMentCost(Byval Date1 as Date, Byval Date2 as Date)
'清空虚拟表
Dim SSQL as string
Dim Cmd As New ADODB.Command
SSql = "Delete From EquipmentCost"
Cmd.ActiveConnection = gConn
'数据库连接变量,读者可以建立自己的数据库连接变量
Cmd.CommandType = adCmdText
Cmd.CommandText = SSql
Cmd.Execute
'将统计明细添加到虚拟表中
ssql="Insert into EquipmentCost"&&" (Project,Name,Standard,Type,Num,Cost)"&&" select a.project as 'Project',b.name as 'Name',"&&"b.standard as 'Standard', b.type as 'Type',"&&"b.num as 'Num',b.num*b.price as 'Cost'"&&"from Outbill a left join OutbillDetail b on(a.outbill=b.outbill)"&&" where a.OutDate>=" && Date1 && " and a.OutDate<=" && Date2
Cmd.ActiveConnection = gConn
Cmd.CommandType = adCmdText
Cmd.CommandText = SSql
Cmd.Execute
'刷新数据报表,使其显示最新查询记录
Set RptCost.DataSource = EnvCatv
'数据环境名称
EnvCatv.rsGrandTotal.Requery 'rsGrantTotal 为分组子命令记录集名称
'显示数据报表
RptCost.Show
End Sub
本程序在VB6.0、MS-SQL Server下运行成功。
出库单表名为OutBill,结构如下:
字段名
字段含义
类型
长度
OutBill
出库单号
Varchar
10
OutDate
出库日期
SmallDate
LLMan
领料人
Varchar
12
DepartMent
部门
Varchar
12
Operator
经手人
VarChar
12
Project
对应工程
VarChar
50
出库单明细表名为OutBillDetail,结构如下:
字段名
字段含义
类型
长度
OutBill
出库单号
Varchar
10
EmName
器材名称
Varchar
12
EmStandard
器材规格
Varchar
12
EmType
器材型号
Varchar
12
Amount
数量
Int
Price
单价
smallmoney
成本统计中间表名为EquipMentCost,结构如下:
字段名
字段含义
类型
长度
Project
工程名称
Varchar
50
Name
器材名称
Varchar
12
Standard
器材规格
Varchar
12
Type
器材型号
Varchar
12
Num
器材用量
Int
Cost
器材成本
smallmoney