zoukankan      html  css  js  c++  java
  • FastReport几个问题

    1.FastReport中如何共用TFrxreport及TfrxDBDataSet

    一个程序中,不管多么大的程序,只要打印或预览时是模式的,则完全可以共用一个TFrxreport

    变量及几个TfrxDBDataSet。只不过,要注意完成一个报表程序的步骤,主要是下面几步
    1)清除报表,得到一个全新的报表内容。
    Frxreport1.clear。
    2)设置要使用的TfrxDBDataSet的别名,如果不需要可以省略这一步,但一般最好不同的报表用不

    同的别名。
    注意这一步要在加载报表文件之前,因为一般设计报表文件时已经包含了别名信息。
    frxDBDataSet1.UserName:=别名;
    3)加载报表或动态建立一个TfrxReportPage。
    Frxreport1.LoadFromFile(报表文件的完整文件名);
    4)关联TfrxDBDataSet与TDataset,并设置要使用哪些TfrxDBDataSet。
    Frxreport1.DataSets.Clear;//先清除原来的数据集
    frxDBDataSet1.DataSet:=dataset1;//关联Fastreport的组件与TDataset数据集。
    Frxreport1.DataSets.Add(frxDBDataSet1);//加载关联好的TfrxDBDataSet到报表中。
    经过这几步后,就可以像单独使用一个Tfrxreport一样使用共用的报表组件了

    写成函数是

    procedure IniReport(var frReport:TfrxReport;var frDbBase:TfrxDBDataset;ReportName: string; qry: TADOQuery);
    begin
       frReport.clear;
       frReport.LoadFromFile(ReportName);
       frReport.DataSets.Clear;
       frDbBase.DataSet := qry;
       frReport.DataSets.Add(frDbBase);
    end;

    2.如何打印空白处?
    在打印报表的Band处的OnBeforePrint事件中添加代码:
    while FreeSpace > 20 do
      ShowBand(Child1)

    3.如何打印指定行数后换页?
    在master band中OnBeforePrint事件中写代码:
    var
       vLineCount: integer;
    begin
       vLineCount := vLineCount + 1;
       if vLineCount = 10 then
       begin
          vLineCount := 0;
          NewPage;
       end;
    end;

    4.fastreport中如何把数据显示为百分比
    DisplayFormat属性,其中的Kind你设置成fkNumeric,FormatStr
    [<frxDBDataset1."sjl">*100 #n%2.2f]%”

    5.FastReport如何打印表格式的空行?
    var
       PageLine: integer;       //在現在頁列印到第幾行
       PageMaxRow: integer=15;  //設定每頁列數
       procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
       begin
           PageLine := <Line> mod PageMaxRow;
           if (PageLine = 1) and (<line> > 1) then
              Engine.newpage;
           child1.visible := False;
       end;

      //Footer1高度設為0
      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;
    begin
    end.

    6.在首页打印本页小计,最后一页打印本页小计和合计(如果只有一页,则打印本页小计和合计)

      frxReport1.PrepareReport();
      frxReport1.Variables['pageQ'] := pageQ;
      frxReport1.Variables['hander'] := QuotedStr(hander);
      frxReport1.Variables['doubleline'] := QuotedStr(StringOfChar('=', Length(hander) + 12));

      whName :='设备资产';
      frxReport1.Variables['p1'] := QuotedStr('仓库:' + whName);
      frxReport1.Variables['p9'] := QuotedStr('领用科室:' + DepName);
      frxReport1.Variables['p2'] := QuotedStr('日期:' + ywDate);
      frxReport1.Variables['p3'] := QuotedStr('单据号:' + VoucherNo);

      if warehouseno=3 then
      begin
        frxReport1.Variables['p8'] := QuotedStr('经手:');
        frxReport1.Variables['p4'] := QuotedStr('保管:');
        frxReport1.Variables['p5'] := QuotedStr('负责人:');
      end
      else
      begin
        frxReport1.Variables['p8'] := QuotedStr('采购:');
        frxReport1.Variables['p4'] := QuotedStr('验收:');
        frxReport1.Variables['p5'] := QuotedStr('科室签字:');
      end;
      frxReport1.Variables['p6'] := QuotedStr('操作员:'+Operator);
      frxReport1.Variables['p7'] := QuotedStr('打印日期:' + prDate);
      frxReport1.Variables['p10'] := QuotedStr('('+ShareGlobalVar.GlobalVar.GetUnitID+')');
      if IsPreView then
      begin
        frxReport1.ShowReport;
      end
      else
      begin
        frxReport1.PrintOptions.ShowDialog := False;
        frxReport1.PrepareReport();
        frxReport1.Print;
      end;
    end;

    在FastReport写入代码

    procedure ColumnFooter1OnBeforePrint(Sender: TfrxComponent);
    var
      bVisible: boolean;                                                        
    begin
      bVisible := <Page> = <pageQ>;
      Memo12.visible := bVisible;
      Memo21.visible := bVisible;
      Memo16.visible := bVisible;
      Memo14.visible := bVisible;     
      if not bvisible then
      begin             
        p8.Top := 27;
        p7.Top := 27;       
        p4.Top :=  27;
        p5.Top :=  27;
        p6.Top :=  27;       
      end
      else
      begin
        p8.Top := 49.46;
        p7.Top := 49.46;       
        p4.Top :=  49.46;
        p5.Top :=  49.46;
        p6.Top :=  49.46;     
      end;                     
    end;

    procedure Page1OnBeforePrint(Sender: TfrxComponent);
    var
      bVisible: boolean;                                                        
    begin
      bVisible := <Page> = <pageQ>;
      if not bvisible then
      begin             
        ColumnFooter1.Height:=48;
      end
      else
      begin
        ColumnFooter1.Height:=69.35;
       end;
    end;

    begin

    end.

    7.加入自定义函数

    (1)在delphi程序中定义函数

      frxReport1.AddFunction('function MoneyCn(mmje: Double): String;','Myfunction','小写金额转大写的函数');
      frxReport1.OnUserFunction :=frxUserFunction;

    (2)在frxUserFunction事件中加载函数

    function TFunComm.frxUserFunction(const MethodName: string;
      var Params: Variant): Variant;
    begin
      if UpperCase(MethodName) = UpperCase('MoneyCn') then
        Result := MoneyCn(Params[0]);
    end;

    (3)实现函数(数字转大写)

    function MoneyCn(mmje: Double): string;
    const
      s1: string = '零壹贰叁肆伍陆柒捌玖';
      s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';

      function StrTran(const S, s1, s2: string): string;
      begin
        Result := StringReplace(S, s1, s2, [rfReplaceAll]);
      end;
    var
      S, dx: string;
      i, Len: Integer;
    begin
      if mmje < 0 then
      begin
        dx := '负';
        mmje := -mmje;
      end;
      S := Format('%.0f', [mmje * 100]);
      Len := Length(S);
      for i := 1 to Len do
        dx := dx + Copy(s1, (Ord(S[i]) - Ord('0')) * 2 + 1, 2) + Copy(s2, (Len - i)
          * 2 + 1, 2);
      dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰',
        '零'),
        '零拾', '零'), '零角', '零'), '零分', '整');
      dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零',
        '零'),
        '零亿', '亿'), '零万', '万'), '零元', '元');
      if dx = '整' then
        Result := '零元整'
      else
        Result := StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整');
    end;

    (4) FastReport中引用函数

    如:[MoneyCn(<SUM(<frxDBDataset1."M3">,MasterData1,2)>)]

    8.在FastReport中将两字段连接起来(用脚本实现)

      [Trim(<frxDBDataset1."C2">)+' '+Trim(<frxDBDataset1."C3">)]

    9.数据栏的动态调试设置

    MasterData根据数据自动设置其高度

    (1)首先设置MasterData栏的Stretch为True

     (2)  再右键单击MasterData栏的各个字段,选中Stretch to Max Height

    即可

    10.在Delphi中定义数据字段

      var

         frxMemo: TfrxMemoView;

      if frxMemo <> nil then
      begin
         frxMemo.AllowExpressions := True;
         frxMemo.Memo.Text := '[SUM(<frxDBDataset1."FDHJ' + IntToStr(i) + 'SL">,MasterData1)]';
      end;

    11.分组时打印页号,如1/1,2/1,1/2,2/2,3/2,4/2

    在FastReport的脚本中写入:

    var
      GPage,GIndex,FGIndex:integer;
      PageList:array of integer;                                                             
     
    procedure PageFooter1OnBeforePrint(Sender: TfrxComponent);
    begin
      GPage := GPage + 1;
      FGIndex :=0;                                
    end;

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

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

    procedure Memo6OnBeforePrint(Sender: TfrxComponent);
    begin
      if not Engine.FinalPass then exit;
      Memo6.Lines[0] := '总页号:'+IntToStr(PageList[FGIndex]);   //Memo6为总页数   
    end;

    begin

    end.

    分页号的memo中写入

    分页号:[GPage]

    12.如果分组头要每页都显示,则在GroupHeader1的右键中选择Start New Page,Keep Together,Reprint on New Page,Reset Page Numbers

  • 相关阅读:
    【JVM】垃圾回收概述(十五)
    mysql命令查看某数据使用空间情况,索引,行数
    联合使用PrediXcan、MetaXcan基于GWAS结果预测靶基因及特异性组织的表达(又名全转录组分析Transcriptome-Wide AnalysisS)
    【Python基础编程009 ● Python入门 ● 输入 】
    【Python基础编程007 ● Python入门 ● 字符串的格式化操作符 】
    【Python基础编程006 ● Python入门 ● 输出的基本使用 】
    【Python基础编程005 ● Python入门 ● 标志符和关键字 】
    【Python基础编程004 ● Python入门 ● 变量的数据类型 】
    【Python基础编程003 ● Python入门 ● 变量的定义及其使用 】
    【Python基础编程002 ● Python入门 ● 注释 】
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/1775009.html
Copyright © 2011-2022 走看看