qq_20039935 2024-02-22 18:39 采纳率: 0%
浏览 84
已结题

delphi+fastreport实现分组补空打印问题

delphi2010+fastreport4.在实现分组打印时候,要求每页打印9行,每组数据不足9行的自动补空到9行,超过9行的,新建页(不是接着打第二页,是新建一个凭证页),怎么实现。补空已经写好了,现在是出现有一组数据超过9行的,并没有当前页汇总再第二页打印,而是直接连打了第二页。

img

img

img

report code:
function MoneyToCharacter(Money:real):string; //数字转换为中文大写             
var
    temp:string;
   resu:string;
      i,j:integer;     
    len:integer; 
    Num:array[0..9] of string; 
    A:array[0..13] of string; 
begin  
     Num[0]:='零';  
     num[1]:='壹';  
     Num[2]:='贰'; 
     num[3]:='叁'; 
     Num[4]:='肆'; 
     num[5]:='伍';  
     Num[6]:='陆'; 
     num[7]:='柒'; 
     Num[8]:='捌'; 
     num[9]:='玖'; 
     a[0]:='分';   
     a[1]:='角';   
     a[2]:='元';   
     a[3]:='拾';   
     a[4]:='佰';   
     a[5]:='仟';   
     a[6]:='万';   
     a[7]:='拾';   
     a[8]:='佰';   
     a[9]:='仟';   
     a[10]:='亿';  
     a[11]:='拾';  
     a[12]:='佰';  
     a[13]:='仟';  
     temp:=trim(inttostr(round(money*100)));
     len:=length(temp);    
     resu:='';                  
     if (len>13) or (len=0) then 
       begin                     
         exit;                   
       end;                      
     for i:=1 to len do          
     begin                                 
         j:=strtoint(copy(temp,i,1));      
         resu:=resu+num[j]+a[len-i];       
     end;                                  
     result:=resu;                         
end;

  
var
  GPage,GIndex,FGIndex:integer;
  PageList:array of integer;
  PageLine: integer;
       
  PageMaxRow: integer=9;         
  jf,df:real;   
procedure PageFooter1OnBeforePrint(Sender: TfrxComponent);
begin
  GPage := GPage + 1;
end;

procedure Page1OnBeforePrint(Sender: TfrxComponent);
begin
  GPage :=1;
end;

procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
var
  i: integer;   
begin
  if Engine.FinalPass then  //二次遍历时增加分组索引
    FGIndex := FGIndex + 1
  else
  begin
    setLength(PageList,GIndex + 1);
          
    PageList[GIndex] := GPage; //存放分组的总页数
          
    GIndex := GIndex + 1;
  end;
  GPage := 0;

  i := iif(PageLine=0, PageMaxRow, PageLine);
  child1.visible := True;       
  while i < PageMaxRow do
  begin
    i := i + 1;
    Engine.ShowBand(Child1);  //印空白表格
  end;         
  child1.visible := False;
end;

procedure Memo1OnBeforePrint(Sender: TfrxComponent);
begin
  if not Engine.FinalPass then exit; 
  Memo1.Lines[0] := IntToStr(FGIndex);    
end;                                                                                                                                                                                

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin 
  PageLine := <Line> mod PageMaxRow;
  if (PageLine = 1) and (<line> > 1) then
    Engine.newpage; 
  child1.visible := False;
end;

//如果仅在最后一页补空行可用

{procedure Footer1OnBeforePrint(Sender: TfrxComponent);
var
  i: integer;   
begin
   i := iif(PageLine=0, PageMaxRow, PageLine);
  child1.visible := True;       
  while i < PageMaxRow do
  begin
    i := i + 1;
    Engine.ShowBand(Child1);  //印空白表格
  end;         
  child1.visible := False;      
end;}
               

procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
begin
   jf:=jf+<frxDBDataset1."借方金额">      ;    
  // Memo15.Text :=FloatToStr(jf);
   MEMO15.Text := FORMATFLOAT('###,##0.00', jf);                                                                                                                    
   df:=df+<frxDBDataset1."贷方金额">    ;            
   Memo16.Text :=FORMATFLOAT('###,##0.00', df);
   memo13.text:=MoneyToCharacter(df)           
end;

procedure GroupFooter1OnAfterPrint(Sender: TfrxComponent);
begin
   jf:=0;
   df:=0;   
end;



begin
  FGIndex :=0;
                 
end.

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-22 18:41
    关注
    获得7.50元问题酬金

    引自免费微信小程序:皆我百晓生

    在您的Delphi 2010 + FastReport 4.0项目中,您希望实现分组打印功能,每页打印9行数据(包括空白补足行),超过9行则新开凭证页。从您提供的代码片段和描述来看,主要问题在于当某一分组的数据量超过一页时,FastReport并没有正确地在新页上开始新的分组。

    为了实现这个需求,需要对现有的GroupFooter1OnBeforePrintMasterData1OnBeforePrint以及可能的Footer1OnBeforePrint事件处理程序进行调整。

    以下是根据您的需求修改后的FastReport脚本:

    uses
      SysUtils, // 注意引入SysUtils单元以使用FormatFloat函数
    
    // ... 其他已存在的代码 ...
    
    var
      GPage, FGIndex, PageLine: integer;
      PageMaxRow: integer = 9;
      jf, df: real;
    
    procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);
    begin
      if Engine.FinalPass then
      begin
        FGIndex := FGIndex + 1; // 每进入一个新分组,FGIndex递增
        GPage := 1;            // 当前分组的起始页码设为1
      end;
    end;
    
    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin 
      if not Engine.FinalPass then Exit;
    
      PageLine := <Line> mod PageMaxRow; // 计算当前行在本页的位置
      
      if (PageLine = 1) and (<Line> > 1) then
        Engine.NewPage; // 如果当前行为新页的第一行,则插入新页
    
      if PageLine > 0 then
        child1.Visible := False; // 如果不是补空行,则隐藏Child band
    end;
    
    procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
    var
      i: integer;
    begin
      if Engine.FinalPass then
      begin
        // 补足剩余行数到9行
        i := PageMaxRow - PageLine;
        while i > 0 do
        begin
          i := i - 1;
          Engine.ShowBand(Child1); // 显示空白表格
        end;
        
        // 进入下一页,因为这里是分组尾部,下一个分组或footer应该在新页
        Engine.NewPage;
      end;
    end;
    
    procedure Footer1OnBeforePrint(Sender: TfrxComponent);
    begin
      // 若需要在最后一页补足空白行,可在此添加逻辑,但根据您的描述,似乎不需要此部分
    end;
    
    procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
    begin
      jf := jf + <frxDBDataset1."借方金额">;
      MEMO15.Text := FormatFloat('###,##0.00', jf);
    
      df := df + <frxDBDataset1."贷方金额">;
      Memo16.Text := FormatFloat('###,##0.00', df);
    
      memo13.text := MoneyToCharacter(df);
    end;
    
    procedure GroupFooter1OnAfterPrint(Sender: TfrxComponent);
    begin
      jf := 0;
      df := 0;
    end;
    
    begin
      FGIndex := 0;
    end.
    

    这段代码首先确保了在每个新的分组开始时重置页码,并在MasterData1OnBeforePrint事件中检查是否需要新建页面。同时,在GroupFooter1OnBeforePrint事件中补充不足的行数并强制跳转到下一页,以确保每个分组的新内容都从新页开始。

    请注意,上述代码是基于您提供的部分代码片段及描述而编写的,实际应用时请结合您的完整报表设计来调试和优化。

    评论 编辑记录
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 创建了问题 2月22日