首页 > 编程 > Delphi > 正文

用Delphi4的QReport部件生成报表

2019-11-17 05:07:02
字体:
来源:转载
供稿:网友
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目录下。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选