用C++ Builder/Delphi制作的报表.要求:(1)比如字段:消费金额,每页底下有个小统计消费金额。(2)最后一页底下统计所有的消费金额。最好附一段源代码。不胜感谢! 小计可以用Group来做,GroupHeader的ForceNewPage属性设置为True,在GroupFooter中用Expr控件做小计,记得ResetAfterPrint设置为True总计用Summary来做就可以了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 等我适用一下OK了,就一定加分!谢谢!!Nizvoo(瓦匠泥)想通了没有!!! 你在每页底下写合计的话就不能在GROUPFOOTER中来写啊.要在PAGEFOOTER中,用相同于Infowain(infowain)的QREXPRESSION最后用SUMMARY 用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< 14 then begin RLb1.Caption:=''; RLb2.Caption:=''; RLb3.Caption:=''; RLb4.Caption:=''; RLb5.Caption:=''; RLb6.Caption:=''; RLb7.Caption:=''; RLb8.Caption:=''; end; end; if not Eof then Next else if FNum=14 then begin MoreData:=False;// 不打印记录边条 FNum:=0; First; end; Inc(FNum); end;end;---- 二、双击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;---- 至此,一个可打印特殊报表的设计完成,达到财务的要求。以上代码在win98,Delphi4中运行通过。 回复人: tlovexyj(菠萝菠萝蜜) (2001-11-29 19:41:23) 得0分 这样一定是可以的,因为我已经试过了。不过出现一个问题,我是win2000A下做的,打印机是NEC pin writer20002000下一切正常,可是98下就不行了,装了最新的驱动还是不行,每次都只打印最左边,而且还只是一部分,不清楚为什么,换RBuilder就可以在98下打印,不过又不会实现上述功能。我想要么是打印机的问题,要么是quickrep的问题,升级quickrep到3.07也不行。现在好像到了3.5,可是没有password下不下来,唉。所以介绍给你,试试看会不会有同样的问题。 为什么保存到SQL 2000后台数据库,日期的格式会不一致呢? 关于Pchar指针的使用,多谢了,各位 有关运算问题 vb、delphi的语句转换问题!! 再次请教关于ado连接数据库的问题, 在c中unsigned char*,char*在d中分别表示什么?? 屏幕刷新问题 啊!在线急!急!急!请各位帮帮忙! 十万火急--高分求教怎样在DELPHI数据库中调用EXCLE表? 大家认为c/s结构过时了吗?大家如何看,欢迎讨论! 谁用过D-Link 530TX 10M/100M网卡,效果如何?关键是现在市场价格多少? Delphi调试CGI的外挂程序叫什么名字?哪里可以下载?
要在PAGEFOOTER中,用相同于Infowain(infowain)的QREXPRESSION
最后用SUMMARY
广西省 韦明
---- 我用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< 14 then
begin
RLb1.Caption:='';
RLb2.Caption:='';
RLb3.Caption:='';
RLb4.Caption:='';
RLb5.Caption:='';
RLb6.Caption:='';
RLb7.Caption:='';
RLb8.Caption:='';
end;
end;
if not Eof then Next
else if FNum=14 then
begin
MoreData:=False;// 不打印记录边条
FNum:=0;
First;
end;
Inc(FNum);
end;
end;
---- 二、双击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;
---- 至此,一个可打印特殊报表的设计完成,达到财务的要求。以上代码在win98,Delphi4中运行通过。
回复人: tlovexyj(菠萝菠萝蜜) (2001-11-29 19:41:23) 得0分
这样一定是可以的,因为我已经试过了。
不过出现一个问题,我是win2000A下做的,打印机是NEC pin writer2000
2000下一切正常,可是98下就不行了,装了最新的驱动还是不行,每次都只打印最左边,而
且还只是一部分,不清楚为什么,换RBuilder就可以在98下打印,不过又不会实现上述功能。我想要么是打印机的问题,要么是quickrep的问题,升级quickrep到3.07也不行。现在好像到了3.5,可是没有password下不下来,唉。所以介绍给你,试试看会不会有同样的问题。