下载本文示例代码
p> 用户在使用数据库应用程序时经常要生成报表,利用Delphi 4的QReport 部件,可以帮助我们快速方便地生成报表。这里以一个设备管理报表为例说明如何用QReport部件与Query部件设计从多个数据表中生成报表。
一、 所用数据库
这里用到三个Foxpro数据表,DLBMK(设备大类编码)、SBXHK(设备型号及配置)、BMSBK(设备所在部门),存放在D:\SB目录下。其库结构如下:
(一) DLBMK
字段名称
字段类型
解释
1
DLBH N3
设备大类的编号
2
DLMC C20
设备大类的名称
(二)SBXHK
字段名称
字段类型
解释
1
XHBM N3
设备型号的编码
2
DLBH N3
同DLBMK中的DLBH字段
3
SBXH C30
设备型号
4
SBPZ C30
设备配置
5
SBSL N3
设备数量
(三)BMSBK
字段名称
字段类型
解释
1
BMMC C20
部门名称
2
XHBM N3
同SBXHK中的XHBM字段
3
SL N3
数量
利用这三个数据表,要生成一个只有电脑部有而其他部门没有的设备型号的情况。
二? 绦蛑械牟考?笆粜?/b>
程序中有两个窗体:主窗体mainForm与报表窗体repForm。主窗体mainForm中有两个TButton部件,设置如下:
部件 属性及属性值
PreviewBtn:TButton Caption:预览
PrintBtn: TButton Caption:打印
报表窗体repForm中的部件及属性设置如下:
部件 属性及属性值
Query1:
TQuery DatabaseName:d:\sb
Active:
True
Qrep1:
TQuickrep Dataset:query1
TitleBand1: TQRBand
BandType:rbTitle
HeadBand1: TQRBand
BandType:rbColumnHeader
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
DetailBand1: TQRBand
BandType:rbDetail
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
ChildBand1: TQRChildBand
ParentBand:DetailBand1
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
TitleLabel: TQRLabel
Caption:设备统计表
DlmcLabel: TQRLabel
Caption:类别
SbxhLabel: TQRLabel
Caption:型号
SbpzLabel: TQRLabel
Caption:配置
SbslLabel: TQRLabel
Caption:数量
DlmcDBText: TQRDBText
Dataset:Query1
Datafield: dlmc
SbxhDBText: TQRDBText
Dataset:Query1
Datafield: sbxh
SbpzDBText: TQRDBText
Dataset:Query1
Datafield: sbpz
SbslDBText: TQRDBtext
Dataset:Query1
Datafield: sbsl
Shape1~9: TQRShape
Shape:qrsVertline
Top:0
Width:1
Query1的SQL属性设置为:
select a.dlbh,a.dlmc,b.sbxh,b.sbpz,b.sbsl
from dlbmk a,sbxhk b
where a.dlbh=b.dlbh and b.xhbm not in
(select xhbm from bmsbk where trim(bmmc)$#@60;$#@62;’电脑部’)
order by a.dlbh
设置几个TQRband部件的DrawLeft、DrawRight、DrawTop、DrawBottom属性值为True,是为了打印表格边框及横线。利用TQRShape部件,是为了打印出表格竖线。DlmcDBText放置在DetailBand1上,其它几个TQRDBText部件放置在ChildBand1上,Shape1~3放置在HeadBand1上,Shape4~6放置在DetailBand1上,Shape7~9放置在ChildBand1上。
三、 为程序增加代码
1.mainForm窗体中的两个按钮事件
procedure TmainForm.PreviewBtnClick(Sender : TObject)
begin
repForm.Qrep1.Preview;
end;
procedure TmainFormPrintBtnClick(Sender : TObject)
begin
repForm.Qrep1.Print;
end;
2.HeadBand1、DetailBand1及ChildBand1的BeforePrint事件
procedure TrepForm.HeadBand1BeforePrint(Sender : TQRCustomBand;
Var PrintBand : Boolean)
Begin
Shape1.Height:=HeadBand1.Height;
Shape2.Height:=HeadBand1.Height;
Shape3.Height:=HeadBand1.Height;
End;
procedure TrepForm.DetailBand1BeforePrint(Sender : TQRCustomBand;
Var PrintBand : Boolean)
begin
PrintBand:=bh$#@60; $#@62;Query1[‘dlbh’];
if PrintBand then
begin
bh:=Query1[‘dlbh’];
Shape4.Height:=DetailBand1.Height;
Shape5.Height:=DetailBand1.Height;
Shape6.Height:=DetailBand1.Height;
end
end;
procedure TrepForm.ChildBand1BeforePrint(Sender : TQRCustomBand;
Var PrintBand : Boolean)
Begin
Shape7.Height:=ChildBand1.Height;
Shape8.Height:=ChildBand1.Height;
Shape9.Height:=ChildBand1.Height;
End;
bh应在变量定义部分定义:
Var bh : shortint=0;
几个TQRShape部件的高度(Height)与所在TQRBand 部件保持一致,使竖线打印得整齐。如果在设计阶段调整了TQRBand部件的高度,也不会出现竖线断线或过长的情况。
在DetailBand1的BeforePrint事件中用PrintBand进行控制,可使每个设备大类名称只需打印一次,而不是每个型号都对应打印一次大类名称。因为dlbh字段的值都大于0,bh初值设为0使它与任一记录的dlbh字段的值都不同,以确保第一个大类名称被打印。这样就生成了一个从多个数据表中提取数据,并带有表格线的数据报表。
注:本例工程文件为sbgl.dpr,原程序文件为main.pas和sbrep.pas,若要测试请将dlbmk.dbf、sbxhk.dbf、bmsbk.dbf三个文件放在d:\sb目录下。
p> 用户在使用数据库应用程序时经常要生成报表,利用Delphi 4的QReport 部件,可以帮助我们快速方便地生成报表。这里以一个设备管理报表为例说明如何用QReport部件与Query部件设计从多个数据表中生成报表。
一、 所用数据库
这里用到三个Foxpro数据表,DLBMK(设备大类编码)、SBXHK(设备型号及配置)、BMSBK(设备所在部门),存放在D:\SB目录下。其库结构如下:
(一) DLBMK
字段名称
字段类型
解释
1
DLBH N3
设备大类的编号
2
DLMC C20
设备大类的名称
(二)SBXHK
字段名称
字段类型
解释
1
XHBM N3
设备型号的编码
2
DLBH N3
同DLBMK中的DLBH字段
3
SBXH C30
设备型号
4
SBPZ C30
设备配置
5
SBSL N3
设备数量
(三)BMSBK
字段名称
字段类型
解释
1
BMMC C20
部门名称
2
XHBM N3
同SBXHK中的XHBM字段
3
SL N3
数量
利用这三个数据表,要生成一个只有电脑部有而其他部门没有的设备型号的情况。
二? 绦蛑械牟考?笆粜?/b>
程序中有两个窗体:主窗体mainForm与报表窗体repForm。主窗体mainForm中有两个TButton部件,设置如下:
部件 属性及属性值
PreviewBtn:TButton Caption:预览
PrintBtn: TButton Caption:打印
报表窗体repForm中的部件及属性设置如下:
部件 属性及属性值
Query1:
TQuery DatabaseName:d:\sb
Active:
True
Qrep1:
TQuickrep Dataset:query1
TitleBand1: TQRBand
BandType:rbTitle
HeadBand1: TQRBand
BandType:rbColumnHeader
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
DetailBand1: TQRBand
BandType:rbDetail
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
ChildBand1: TQRChildBand
ParentBand:DetailBand1
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
TitleLabel: TQRLabel
Caption:设备统计表
DlmcLabel: TQRLabel
Caption:类别
SbxhLabel: TQRLabel
Caption:型号
SbpzLabel: TQRLabel
Caption:配置
SbslLabel: TQRLabel
Caption:数量
DlmcDBText: TQRDBText
Dataset:Query1
Datafield: dlmc
SbxhDBText: TQRDBText
Dataset:Query1
Datafield: sbxh
SbpzDBText: TQRDBText
Dataset:Query1
Datafield: sbpz
SbslDBText: TQRDBtext
Dataset:Query1
Datafield: sbsl
Shape1~9: TQRShape
Shape:qrsVertline
Top:0
Width:1
Query1的SQL属性设置为:
select a.dlbh,a.dlmc,b.sbxh,b.sbpz,b.sbsl
from dlbmk a,sbxhk b
where a.dlbh=b.dlbh and b.xhbm not in
(select xhbm from bmsbk where trim(bmmc)$#@60;$#@62;’电脑部’)
order by a.dlbh
设置几个TQRband部件的DrawLeft、DrawRight、DrawTop、DrawBottom属性值为True,是为了打印表格边框及横线。利用TQRShape部件,是为了打印出表格竖线。DlmcDBText放置在DetailBand1上,其它几个TQRDBText部件放置在ChildBand1上,Shape1~3放置在HeadBand1上,Shape4~6放置在DetailBand1上,Shape7~9放置在ChildBand1上。
三、 为程序增加代码
1.mainForm窗体中的两个按钮事件
procedure TmainForm.PreviewBtnClick(Sender : TObject)
begin
repForm.Qrep1.Preview;
end;
procedure TmainFormPrintBtnClick(Sender : TObject)
begin
repForm.Qrep1.Print;
end;
2.HeadBand1、DetailBand1及ChildBand1的BeforePrint事件
procedure TrepForm.HeadBand1BeforePrint(Sender : TQRCustomBand;
Var PrintBand : Boolean)
Begin
Shape1.Height:=HeadBand1.Height;
Shape2.Height:=HeadBand1.Height;
Shape3.Height:=HeadBand1.Height;
End;
procedure TrepForm.DetailBand1BeforePrint(Sender : TQRCustomBand;
Var PrintBand : Boolean)
begin
PrintBand:=bh$#@60; $#@62;Query1[‘dlbh’];
if PrintBand then
begin
bh:=Query1[‘dlbh’];
Shape4.Height:=DetailBand1.Height;
Shape5.Height:=DetailBand1.Height;
Shape6.Height:=DetailBand1.Height;
end
end;
procedure TrepForm.ChildBand1BeforePrint(Sender : TQRCustomBand;
Var PrintBand : Boolean)
Begin
Shape7.Height:=ChildBand1.Height;
Shape8.Height:=ChildBand1.Height;
Shape9.Height:=ChildBand1.Height;
End;
bh应在变量定义部分定义:
Var bh : shortint=0;
几个TQRShape部件的高度(Height)与所在TQRBand 部件保持一致,使竖线打印得整齐。如果在设计阶段调整了TQRBand部件的高度,也不会出现竖线断线或过长的情况。
在DetailBand1的BeforePrint事件中用PrintBand进行控制,可使每个设备大类名称只需打印一次,而不是每个型号都对应打印一次大类名称。因为dlbh字段的值都大于0,bh初值设为0使它与任一记录的dlbh字段的值都不同,以确保第一个大类名称被打印。这样就生成了一个从多个数据表中提取数据,并带有表格线的数据报表。
注:本例工程文件为sbgl.dpr,原程序文件为main.pas和sbrep.pas,若要测试请将dlbmk.dbf、sbxhk.dbf、bmsbk.dbf三个文件放在d:\sb目录下。
下载本文示例代码
用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表用Delphi4的QReport部件生成报表
阅读(235) | 评论(0) | 转发(0) |