一个主从报表,要求:每页都有小计,固定行数,最后有总计,在最后一页,小计要紧跟在纪录后,总计跟在小计后。
我的报表是用master date放置主表数据,用detail date 放置从表数据,用page header的清空页统计变量,代码:sum_page_je:=0;sum_page_se:=0;在detail date 的 (OnBeforePrint)事件中,写代码如下:
begin
  if (([LINE#-1] mod 26)=0) and (([LINE#]-1)>1) then
    begin
      NEWPAGE;
    end
  else
    begin
      sum_page_je:=sum_page_je+[dm.pjxb_dateset."金额"];
      sum_page_se:=sum_page_je+[dm.pjxb_dateset."税额"];
    end;
end
在page footer中,放置memo显示sum_page_je、sum_page_se
出于为在最后一页,小计要紧跟在纪录后,总计跟在小计后这种情况的考虑,我加入了detail footer,在其上也显示本页的小计sum_page_je、sum_page_se
并要屏蔽page footer显示,在 page footer的(OnBeforePrint)事件中写入
begin
  if [[PAGE#]= TOTALPAGES] then
    pagefooter1.visible:=false;
end
最后是report summary写出总计。
我的报表在打印从表有3条记录的报表出错,在最后一页的小计出错。(每页行数是2)
我也知道原因在detail date 的OnBeforePrint事件中。
我的问题实现一个这样的报表应该怎么做?我不会了,救我

解决方案 »

  1.   

    我用的是QR:
    一共用了三个BAND,分别是:QRGroup1(Group Header)、QRBand1(Detail)和QRBand2(Group Footer),用QRGroup1放置主表详细信息和细表的表头,QRBand1放置细表信息,QRBand2放置主表信息和总计、本页小计。这是一个组,要想实现固定的行数,需要来打存这个组。在QRGroup的Expression上写出打破这个组的条件,设置FooterBand为QRBand2。
    再添加一数据集,调用函数这样写:
    procedure PrepareFixedReport(ASource:TDataSet;ATemp:TClientDataSet;
      AReport: TQuickRep; ALinesPerPage:Integer = 20;APreview:Boolean = true);
    var i, c, grp, pg, k , PageCount: integer;
    begin
    if ATemp.Active then ATemp.Close;
    ATemp.FieldDefs.Clear;
    ATemp.FieldDefs.Assign(ASource.FieldDefs);
    ATemp.FieldDefs.Add('_GroupNo',ftInteger);
    ATemp.FieldDefs.Add('_PageNo',ftInteger);
    ATemp.FieldDefs.Add('_PageCount',ftInteger);
    ATemp.CreateDataSet;
    pg := 1;
    grp := 1;
    k := 0;
    PageCount :=  (ASource.RecordCount-1 ) div ALinesPerPage +1;
    c := ASource.FieldCount-1;
    ASource.DisableControls;
    try
      ASource.First;
      while not ASource.eof do
      begin
        inc(k);
        if k > ALinesPerPage then
        begin
          k := 1;
          inc(grp);
          if (grp and 1) = 1 then inc(pg);
        end;
        ATemp.Append;
        for i := 0 to c do
        ATemp.Fields[i].Value := ASource.Fields[i].Value;
        ATemp.FieldByName('_PageCount').AsInteger := PageCount;
        ATemp.FieldByName('_PageNo').AsInteger := Pg;
        ATemp.FieldByName('_GroupNo').AsInteger := Grp;
        ATemp.Post;
        ASource.Next;
      end;
    finally
      ASource.EnableControls;
    end;
    若是看不太懂,把信箱留下我给你发一个例子。
      

  2.   

    to lihongyue
    偶不懂!发个例子好了,[email protected]
    大家想一下,在fastreport中怎么实现?
    拜托了
      

  3.   

    to lihongyue
    谢谢!
    大家继续呀
    我更想知道在fastreport
      

  4.   

    楼主不好意思fastreport没有用过,是第三方控件吧。
      

  5.   

    楼主不好意思fastreport没有用过,是第三方控件吧。
      

  6.   

    to lihongyue
    是的,你发的例子我已经收到了,谢谢了,可是我装在不上,你的例子中是不是也用什么第三方控件了?