如何在报表打印不满一页时,用空记录填满这一页。(50分)

  • 主题发起人 主题发起人 jxlber
  • 开始时间 开始时间
你一页有多少行哪?
如果你这一页不满这么多行,用个循环,将其余行仍旧画上
 
第一页是24行。其它26行。
 
//思路如下
var ll_rows ,i,j:integer;
//取出本行数据的行数
if ll_rows < 26 then

i = 26 - ll_rows
for j = 1 to ido

insertrow(0) //插入空行

end if
 
如果你愿意用个临时表,以下代码可以解决:
这个是按钮的事件:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if query2.RecordCount<10 then
begin
while (10-query2.RecordCount)>=0do
begin
query2.Close;
query1.ExecSQL;
query2.Open;
end;
end;
end;

QUERY2是个查询集:SELECT * FROM NAME
QUERY1是个操作:insert into name ( name,gz )
VALUES ('',null );
我让不满足记录数的,填充空记录。
 
用临时表,插空记录
 
在QuickReport的OnNeedData里面写代码,处理DetailBand数据,这样需要设置QuickReport.DataSet=nil。
在这里给DetailBand内的控件赋值
 
to yzhshi
能说得详细一点吗。谢了。
 
你们有用过fastreport吗?用它又怎么实现。
 
我也想知道!:)
 
临时表最简单了,不需要对报表进行代码设计,常规设计就可以了。
我用FR,就是这样做的。
用个动态创建的临时表,用完了就干掉了,资源站用很少的。而且方便。
如果报表需求变了,只改下SQL就行拉。
 
有三種方法可以達到你的效果
1.臨時表
2.設置QuickRep的DataSet=nil,在OnNeedData中寫代碼控製記錄移動
3.增加一個StringBand,在StringBand的Items中隨便加入一些字串,字串行數為你的空白欄位然后在
DetailBand中控製是否打印StringBand
現提供我寫的第三種方法供大家參考:
unit BasePrnitUnit;
interface
uses
Controls, Forms,
ExtCtrls, QuickRpt, Qrctrls,QRPrntr,ADODB, Classes;
type
TBasePrnitForm = class(TForm)
QuickRep: TQuickRep;
DetailBand: TQRBand;
PageHeaderBand: TQRBand;
PageFooterBand: TQRBand;
QRTitle: TQRLabel;
QRPageNum: TQRLabel;
QRSysData1: TQRSysData;
QRStringsBand: TQRStringsBand;
QRUser_nam: TQRLabel;
procedure QuickRepPreview(Sender: TObject);
procedure PageFooterBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
procedure FormCreate(Sender: TObject);
procedure QuickRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
procedure QRStringsBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
procedure QRStringsBandAfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
procedure DetailBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
private
public
FMDat:TADOQuery;
FDDat:TADOQuery;//保存明細邊條數據集
PageLineNum:Integer;//每頁行數
TotalPage:Integer;//總記頁數
Procedure SetTitle(Title:String);
//設置標題
Procedure DataInit(MD,DD:TADOQuery);
//初始化QuickRep數據集
procedure SetBandDataSet(Band:TQRBand;DataSet:TADOQuery);
//設置TBand數據集
Procedure SetChildBandDataSet(ChildBand:TQRChildBand;DataSet:TADOQuery);
Procedure SetPageNum(Num:Integer);
//設置頁號
//請不要在QuickReP中用TQRExpr組件
end;

implementation
uses PreviewForm,SysUtils;
Var
SpaceLineNum,CurrRecord:Integer;
{$R *.DFM}
Procedure TBasePrnitForm.SetPageNum(Num:Integer);
begin
TotalPage:=Num;
end;

procedure TBasePrnitForm.SetBandDataSet(Band:TQRBand;DataSet:TADOQuery);
var
i:integer;
begin
For i:=0 to Band.ControlCount-1do
If Band.Controls is TQRDBText then
(Band.Controls As TQRDBText).DataSet:=DataSet;
end;

procedure TBasePrnitForm.DataInit(MD,DD:TADOQuery);
begin
FMDat:=MD;
FDDat:=DD;
QuickRep.DataSet:=FDDat;
//設置報表數據集
SetBandDataSet(DetailBand,FDDat);
end;

Procedure TBasePrnitForm.SetTitle(Title:String);
begin
QRTitle.Caption:=Title;
QRTitle.Left:=Round((PageHeaderBand.Width-QRTitle.Width) Div 2);
end;

procedure TBasePrnitForm.QuickRepPreview(Sender: TObject);
var
vwForm:TPreviewForm;
begin
vwForm:=TPreviewForm.Create(Application);
vwForm.QRPreview.QRPrinter:=TQRPrinter(Sender);
vwForm.QRTotal.Caption:=Format(vwForm.QRTotal.Caption,[totalPage]);
vwForm.ShowModal;
end;

procedure TBasePrnitForm.PageFooterBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
QRPageNum.Caption:=Format('第%d頁 共%d頁',[QuickRep.PageNumber,totalPage]);
end;

procedure TBasePrnitForm.FormCreate(Sender: TObject);
begin
PageLineNum:=0;
end;

procedure TBasePrnitForm.QuickRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
var
i:integer;
begin
If PageLineNum>0 then
begin
If QuickRep.DataSet.RecordCount=0 then
SpaceLineNum:=PageLineNum
else
If QuickRep.DataSet.RecordCount mod PageLineNum=0 then
SpaceLineNum:=0
else
SpaceLineNum:=PageLineNum-QuickRep.DataSet.RecordCount mod PageLineNum;
QRStringsBand.Items.Clear;
i:=1;
While SpaceLineNum>=ido
begin
QRStringsBand.Items.Add('Print');
Inc(i);
end;
CurrRecord:=0;
end;

end;

procedure TBasePrnitForm.QRStringsBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
If (CurrRecord>=QuickRep.DataSet.RecordCount) And (SpaceLineNum>0) then
PrintBand:=True
else
PrintBand:=False;
end;

procedure TBasePrnitForm.QRStringsBandAfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
If BandPrinted then
Dec(SpaceLineNum);
end;

procedure TBasePrnitForm.DetailBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
Inc(CurrRecord);
end;

procedure TBasePrnitForm.SetChildBandDataSet(ChildBand: TQRChildBand;Dataset:TAdoQuery);
var
i:Integer;
begin
For i:=0 to ChildBand.ControlCount-1do
If ChildBand.Controls is TQRDBText then
(ChildBand.Controls As TQRDBText).DataSet:=Dataset;
end;

end.

 
我也想知道fastReport中如何实现这种功能?
 
在fastreport中实现极其简单,可以用程序实现,也可以用他的一个选项实现。
我给你找一下
 
找到了,程序实现的方法
//------------------
frdbdataset1 fr数据源 dataset设置为要显示的数据集
frreport1 fr报表
报表的的设计如下
band1,报表标题
band2,主项数据无数据源 
band3,主项数据 数据源为frdbdataset1
band4,栏目脚,用于显示合计数据
band5,子栏  ,用于不足行时补写空白行

procedure TForm1.frReport1ManualBuild(Sender: TfrPage);
//在frreport1中的onmanualbuild事件中手工设置报表项
var
i, j,k: Integer;
begin

k:=trunc(frdbdataset1.DataSet.RecordCount/6);
            //每页显示8行(行数可用变量),计算页数
Sender.ShowBandByType(btReportTitle);
//显示报表标题
for i := 0 to kdo
//循环打印每页
begin
Sender.ShowBandByName('Band2');
       //显示列头 (band2是一个主项数据,无数据源)
for j := 1 to 6do
//循环打印每行
begin
if not frdbdataset1.Eof then
begin
Sender.ShowBandByName('Band3');
      //显示主项数据 (band3是主项数据,数据源为frdbdataset1)
frdbdataset1.Next;
//显示下一条数据
end
else
sender.ShowBandByName('band5');
//显示空白行 (band5为child band)
end ;
//在实际的页面设计当中此处有一个栏目脚band 以显示合计
if i <> k then
Sender.NewPage;
//产生新页面
end;
end;
//---------------
手工实现的方法
FastReport有自动追加空行的功能,在"master data"上按右键
 
谢谢!!!!!!
 
我用的是ReportMachine(同FastReport一样),实现这种功能的方法非常简单:
设置Master Data Band的AutoAppendBland=True即可。
 
我用的FastReport.我用程序的方法不可以搞定.
用手工的话.因为我装的是中文版.所以,
请问Master Data是那个BAND???
AutoAppendBland=True是那个中文选项?
如可选,那么,报表怎么知道我要添几个空白行??怎么知道我一个页面要多少条记录?
再则,如何实现记录的表格化打印?
 
http://new.playicq.com/dispdocnew.php?id=5500
试试这个 简单的设置一个属性即可 看他的demo 里的 那个名字叫简历的文件。在文件菜单报表属性设置菜单 选择不满一页填充 就可以
 
后退
顶部