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

    即可

    文章转自:https://blog.csdn.net/sforiz/article/details/5748693

  • 相关阅读:
    leetcode 268. Missing Number
    DBSCAN
    python二维数组初始化
    leetcode 661. Image Smoother
    leetcode 599. Minimum Index Sum of Two Lists
    Python中的sort() key含义
    leetcode 447. Number of Boomerangs
    leetcode 697. Degree of an Array
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月3日)
    北京Uber优步司机奖励政策(1月2日)
  • 原文地址:https://www.cnblogs.com/approx/p/13354286.html
Copyright © 2011-2022 走看看