======================================================
注:本文源代码点此下载
======================================================
用delphi编写特殊报表
广西省 韦明
---- 我用delphi为某单位编写信息管理系统时,财务要求工资统计等报表每一页的最后一行都应有合计。用delphi提供的tquidkrep部件的hassummary边条制作时是每一个报表的最后一页才有合计,不符合财务要求。虽然不用tquidkrep部件重头开始编程编写报表打印可以做到每页有合计,但工作量极大。能不能用qreport面板下提供的部件完成呢?本人仔细分析了qreport面板下的各功能强大的部件,完全可以做到。具体如下:
---- 1、 数据表manpay.db的结构为:
manname员工名
justclass台班
justtotal工资
waitclass台班
waittotal工资
repair修理工资
jobpay计件工资
total合计
---- 2、 新建一表单form1,在其上放一个ttable部件,其tablename设为manpay.db;
---- 3、 在表单form1上放tquidkrep部件quidkrep1,设置quidkrep1的bands属性值为:haspagefooter,hasdetail,hascolumnheader;此时在quidkrep1上有三个边条分别为:pageheaderband1,detailband1,columeheaderband1。象上表一样设置好报表结构,如:在pageheaderband1边条上放一个tqrlabel部件,设其caption属性为‘员工工资表’; 以此类推,在columeheaderband1放相应数量tqrlabel部件,并按报表列的标题的要求进行列标题的而设置相应的tqrlabel部件的caption属性。在detailband1边条上放八个tqrlabel部件,其name属性分别为rlb1, rlb2, rlb3, rlb4, rlb5, rlb6, rlb7, rlb8。设置quidkrep1的dataset为空;
---- 4、 在表单form1上放tqrsubdetail部件qrsubdetail,在qrsubdetail上放九个tqrlabel部件,其中一个tqrlabel部件的caption属性设为'合计',其中五个的name属性分别为:rsl1,rsl2, rsl3, rsl4, rsl5。另外三个的caption属性分别为:‘制表:’‘审核:’‘审批:’;
---- 5、 报表的线条用tqrshape部件,在此略。设置好的报表应如上表一样。
---- 6、 编程:
---- 一、双击quickrep1的onneeddata事件,输入如下代码:
procedure tform1.quickrep1needdata(sender: tobject;
var moredata: boolean);
begin
moredata:=true;//允许打印记录边条
with tabel1 do
begin
if not eof then
begin
rlb1.caption:=fieldbyname('fixingname').asstring;
rlb2.caption:=fieldbyname('justclass').asstring;
rlb3.caption:=fieldbyname('justtotal').asstring;
rlb4.caption:=fieldbyname('waitclass').asstring;
rlb5.caption:=fieldbyname('waittotal').asstring;
rlb6.caption:=fieldbyname('repair').asstring;
rlb7.caption:=fieldbyname('jobpay').asstring;
rlb8.caption:=fieldbyname('total').asstring;
fjusttotal:= fjusttotal +fieldbyname('justtotal').asfloat;
fwaittotal:= fwaittotal +fieldbyname('waittotal').asfloat;
frepair:= frepair +fieldbyname('repair').asfloat;
fjobpay:= fjobpay +fieldbyname('jobpay').asfloat;
ftotal:=ftotal+fieldbyname('total').asfloat;
end
else
begin
//设定每页打印13行,最后一页不够13行时用空行代替。
打印行数可根据//实际情况要求设定。
if fnum
---- 二、双击qrsubdetail1的onafterprint事件,输入如下代码:
procedure tform1.qrsubdetail1afterprint(sender: tqrcustomband;
bandprinted: boolean);
begin
if fnum=14 then
begin
if not table1.eof then
begin
form1.quickrep1.newcolumn;//建立新页
fnum:=1;
end;
end;
end;
---- 三、双击qrsubdetail1的onbeforeprint事件,输入如下代码:
procedure tform1.qrsubdetail1beforeprint(sender: tqrcustomband;
var printband: boolean);
begin
if fnum=14 then
begin
rsl1.caption:=floattostr(fjusttotal);
rsl2.caption:=floattostr(fwaittotal);
rsl3.caption:=floattostr(frepair);
rsl4.caption:=floattostr(fjobpay);
rsl5.caption:=floattostr(ftotal);
printband:=true;//打印明细边条
fjusttotal:=0;
fwaittotal:=0;
frepair:=0;
fjobpay:=0;
ftotal:=0;
end else printband:=false; //不打印明细边条
end;
---- 四、双击form1的on create事件,输入如下代码:
procedure tform1.formcreate(sender: tobject);
begin
fnum:=1;
fjusttotal:=0;
fwaittotal:=0;
frepair:=0;
fjobpay:=0;
ftotal:=0;
end;
在form1中的private下增加如下声明:
fnum: integer;//每页可打印行数控制器
ftotal: real;
fjusttotal,fwaittotal: real;
frepair,fjobpay: real;
---- 至此,一个可打印特殊报表的设计完成,达到财务的要求。
绿色通道:好文要顶关注我收藏该文与我联系
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/