如何实现某列的最后一行的“合计”的功能,请高手指点。

解决方案 »

  1.   

    可以使用Query等组件先得出合计情况
    然后赋值就可以了!
      

  2.   

    给什么赋值啊,请指教!
    另获得的[totalpages]始终显示为0,[page#]是对的
      

  3.   

    另获得的[totalpages]始终显示为0,[page#]是对的
    将报表设置中的两遍报表选上即可。
      

  4.   

    frReport1.LoadFromFile('d:\rsc\zz.frf');
    frReport1.PrepareReport
    zz:=FRREPORT1.EMFPages.Count;总页数
      

  5.   

    我是在frPrintGrid1 的pagefooter的text属性中
    设[totalpages]结果显示为0,为什么?
      

  6.   

    frprintgrid1.DoublePassReport:=true;
    frprintgrid1.ShowReport;
      

  7.   

    //感激 高人WWWWA(aaaa) 
    //下边是我修改的代码FR_PTabl中的代码,以便供需要的朋友参考
    //支持每页打印Title,支持页脚处理。
    procedure TfrCustomPrintDataSet.BuildReport;
    var
      v: TfrView;
      b: TfrBandView;
      Page: TfrPage;
      LeftMargin: Integer;
    begin
      CreateDS;  if FDataSet = nil then Exit;  FReport.OnBeforePrint := OnEnterRect;
      FReport.OnPrintColumn := OnPrintColumn_;
      FReport.Preview := FPreview;
      FReport.OnUserFunction := OnUserFunction;
      FReport.OnBeginDoc := FOnBeginDoc;
      FReport.OnEndDoc := FOnEndDoc;
      FReport.OnBeginPage := FOnBeginPage;
      FReport.OnEndPage := FOnEndPage;  FReportDataSet.DataSet := FDataSet;
      FColumnDataSet.RangeEndCount := GetFieldCount;  FReportDataSet.OnCheckEOF:=FOnCheckEOF;
      FReportDataSet.OnFirst:=FOnFirst;
      FReportDataSet.OnNext:=FOnNext;
      FReportDataSet.OnPrior:=FOnPrior;  FReport.Clear;
      FReport.Pages.Add;
      Page := FReport.Pages[0];
      with Page do
      begin
        pgMargins.Left   := Round(FPageMargins.Left   * 18 / 5);
        pgMargins.Top    := Round(FPageMargins.Top    * 18 / 5);
        pgMargins.Right  := Round(FPageMargins.Right  * 18 / 5);
        pgMargins.Bottom := Round(FPageMargins.Bottom * 18 / 5);
        ChangePaper(FpgSize, FpgWidth * 10, FpgHeight * 10, -1, FOrientation);
      end;  LeftMargin := Page.PrnInfo.Ofx;
      if Page.pgMargins.Left <> 0 then
        LeftMargin := Page.pgMargins.Left;  with FFitWidth do
        if Enabled and ApplyBeforeOnCustomize then
          TryToFitWidth(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin,
            Trunc((Page.RightMargin-Page.LeftMargin)/(ResizePercent / 100)), Fields, ShrinkOptions);  if Assigned(FCustomizeWidths) then FCustomizeWidths(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin);  with FFitWidth do
        if Enabled and not ApplyBeforeOnCustomize then
          TryToFitWidth(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin,
            Trunc((Page.RightMargin-Page.LeftMargin)/(ResizePercent / 100)), Fields, ShrinkOptions);// Title zpg修改
    {  if FTitle.Text <> '' then
      begin
        b := TfrBandView(frCreateObject(gtBand, ''));
        b.SetBounds(0, 20, 1000, 30);
        b.Flags := b.Flags or flStretched;
        b.BandType := btReportTitle;
        Page.Objects.Add(b);
        v := frCreateObject(gtMemo, '');
        v.SetBounds(0, 20, 1000, 20);  b.Script.Clear;                           // Add Stalker
      b.Script.Add('begin');                    // Add Stalker
      b.Script.Add(' Visible := IsPrint()');    // Add Stalker
      b.Script.Add('end');                      // Add Stalker    v.BandAlign := baWidth;
        TfrMemoView(v).Alignment:= FTitle.GetAlign + frtaMiddle;
        TfrMemoView(v).Font := FTitle.Font;
        v.FrameTyp := FTitle.GetFrameTyp;
        v.FrameWidth := FTitle.FrameWidth;
        v.FillColor := FTitle.Color;
        v.Memo.Add(FTitle.Text);
        Page.Objects.Add(v);
      end;}// Summary
      if FSummary.Text <> '' then
      begin
        b := TfrBandView(frCreateObject(gtBand, ''));
        b.SetBounds(0, 320, 1000, 30);
        b.Flags := b.Flags or flStretched;
        b.BandType := btReportSummary;
        Page.Objects.Add(b);
        v := frCreateObject(gtMemo, '');
        v.SetBounds(0, 320, 1000, 20);
        v.BandAlign := baWidth;
        TfrMemoView(v).Alignment:= FSummary.GetAlign + frtaMiddle;
        TfrMemoView(v).Font := FSummary.Font;
        v.FrameTyp := FSummary.GetFrameTyp;
        v.FrameWidth := FSummary.FrameWidth;
        v.FillColor := FSummary.Color;
        v.Memo.Add(FSummary.Text);
        Page.Objects.Add(v);
      end;// Header
      if frpoHeader in FPrintOptions then
      begin
        b := TfrBandView(frCreateObject(gtBand, ''));
        b.BandType := btMasterHeader;
        b.SetBounds(0, 0, 1000, 30);
        b.Flags := b.Flags or flStretched;
        if frpoHeaderOnEveryPage in FPrintOptions then
          b.Flags := b.Flags or flBandRepeatHeader;
        Page.Objects.Add(b);    v := frCreateObject(gtMemo, '');
        v.SetBounds(LeftMargin, 0, 20, 30);
        TfrMemoView(v).Alignment := frtaCenter + frtaMiddle;
        TfrMemoView(v).Font := FHeader.Font;
        v.FillColor := FHeader.Color;
        v.FrameTyp := FHeader.GetFrameTyp;
        v.FrameWidth := FHeader.FrameWidth;
        v.Flags := v.Flags or flWordWrap or flStretched;
        v.Memo.Add('[Header]');
        Page.Objects.Add(v);
      end;// Body
      b := TfrBandView(frCreateObject(gtBand, ''));
      b.BandType := btMasterData;
      b.Dataset := FReportDataSet.Name;
      b.SetBounds(0, 130, 1000, 18);
      b.Flags := b.Flags or flStretched;
      Page.Objects.Add(b);  b := TfrBandView(frCreateObject(gtBand, ''));
      b.BandType := btCrossData;
      b.Dataset := FColumnDataSet.Name;
      b.SetBounds(LeftMargin, 0, 20, 1000);
      Page.Objects.Add(b);  v := frCreateObject(gtMemo, '');
      v.SetBounds(LeftMargin, 130, 20, 18);
      TfrMemoView(v).Font := FBody.Font;
      v.FillColor := FBody.Color;
      v.FrameTyp := FBody.GetFrameTyp;
      v.FrameWidth := FBody.FrameWidth;
      TfrMemoView(v).GapX := 3;
      v.Flags := v.Flags or flWordWrap or flStretched;
      v.Memo.Add('[Cell]');
      Page.Objects.Add(v);
    // Footer
    //  if frpoFooter in FPrintOptions then
    //  begin
        b:=TfrBandView(frCreateObject(gtBand, ''));
        b.BandType := btMasterFooter;
        b.SetBounds(0, 180, 1000, 30);
        Page.Objects.Add(b);{    v := frCreateObject(gtMemo, '');
        v.SetBounds(LeftMargin, 160, 20, 30);
        TfrMemoView(v).Alignment := frtaCenter + frtaMiddle;
        TfrMemoView(v).Font := FFooter.Font;
        v.FillColor := FFooter.Color;
        v.FrameTyp := FFooter.GetFrameTyp;
        v.FrameWidth := FFooter.FrameWidth;
        v.Flags := v.Flags or flWordWrap or flStretched;
        v.Memo.Add('[Footer]');
        Page.Objects.Add(v);  }
        //放在该处的目的能紧跟Body的后边
        v := frCreateObject(gtMemo, '');
        v.SetBounds(0, 190, 20, 20);
        v.BandAlign := baWidth;
        TfrMemoView(v).Alignment :=0;{ FPageFooter.GetAlign;//靠左为了显示打印日期:[date]和打印人:XXX}
        TfrMemoView(v).Font := FPageFooter.Font;
        v.FillColor := FPageFooter.Color;
        v.FrameTyp := FPageFooter.GetFrameTyp;
        v.FrameWidth := FPageFooter.FrameWidth;
        v.Memo.Add(Copy(FPageFooter.Text,1,pos('┃',FPageFooter.Text)-1)); //约定“┃”为分割线
        Page.Objects.Add(v);
    //  end;
    // Page header And Title
        b := TfrBandView(frCreateObject(gtBand, ''));
        b.BandType := btPageHeader;
        b.SetBounds(0, 200, 1000, 50);
        Page.Objects.Add(b);    v := frCreateObject(gtMemo, '');
        v.SetBounds(0, 200, 20, 20);
        v.BandAlign := baWidth;
        TfrMemoView(v).Alignment:= FTitle.GetAlign;
        TfrMemoView(v).Font := FTitle.Font;
        v.FrameTyp := FTitle.GetFrameTyp;
        v.FrameWidth := FTitle.FrameWidth;
        v.FillColor := FTitle.Color;
        v.Memo.Add(FTitle.Text);
        Page.Objects.Add(v);    v := frCreateObject(gtMemo, '');
        v.SetBounds(0, 230, 20, 20);
        v.BandAlign := baWidth;
        TfrMemoView(v).Alignment := FPageHeader.GetAlign;
        TfrMemoView(v).Font := FPageHeader.Font;
        v.FillColor := FPageHeader.Color;
        v.FrameTyp := FPageHeader.GetFrameTyp;
        v.FrameWidth := FPageHeader.FrameWidth;
        v.Memo.Add(FPageHeader.Text); 
        Page.Objects.Add(v);
    // Page footer
      if FPageFooter.Text <> '' then
      begin
        b := TfrBandView(frCreateObject(gtBand, ''));
        b.BandType := btPageFooter;
        b.SetBounds(0, 260, 1000, 30);
        Page.Objects.Add(b);
        v := frCreateObject(gtMemo, '');
        v.SetBounds(0, 260, 20, 20);
        v.BandAlign := baWidth;
        TfrMemoView(v).Alignment :=2;{FPageFooter.GetAlign;/居中为了显示第[page#]页,共[totalpages]页}
        TfrMemoView(v).Font := FPageFooter.Font;
        v.FillColor := FPageFooter.Color;
        v.FrameTyp := FPageFooter.GetFrameTyp;
        v.FrameWidth := FPageFooter.FrameWidth;
        v.Memo.Add(Copy(FPageFooter.Text,pos('┃',FPageFooter.Text)+2,length(FPageFooter.Text)));//约定“┃”为分割线
        Page.Objects.Add(v);
      end;
    end;
      

  8.   

    好久没做报表了
    开始使用frprintgrid,总算让老板看的过去了
    有些代码需要改的,比如报表的题目总是竖排的
    功能上没有太多的改善
    所以我自己还是不满意
    希望能和楼主交流一下
      

  9.   

    为了使body中的字段内容上下方向居中:
    在TfrMemoView(v).GapX := 3;后边增加一句
    TfrMemoView(v).GapY := 4;
    又问高手:
    frprintgrid如何才能直接打印?
      

  10.   

    成功解决直接打印问题,调用接口如下:frPrintGrid1.BuildReport;
    frPrintGrid1.Report.PrepareReport;
    frPrintGrid1.Report.PrintPreparedReportDlg;
      

  11.   

    呵呵,我用cxGrid,再加上它的Printing System,不用这么操心