FastReport几个问题

转载 2011年03月08日 14:59:00

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

FastReport 自定义函数解决QRCode显示

在FastReport 4.2的barcode组件不包含QRCode(听说高版本的Delphi内置的FastReport已经包含QRCode功能),这篇文章简单讲下如何用自定义函数解决QRCode的显...
  • rocklee
  • rocklee
  • 2015年01月19日 18:47
  • 2687

FastReport经验汇总

FastReport经验 1.FastReport中如果访问报表中的对象? 可以使用FindObject方法。 TfrxMemoView(frxReport1.FindObject(...
  • yanjinrong
  • yanjinrong
  • 2014年08月15日 10:30
  • 1464

FastReport单元格合并之横向合并

FastReport纵向合并请点击这里
  • lichuxiong
  • lichuxiong
  • 2014年10月24日 19:16
  • 3314

FastReport调用进程句柄,设置窗口置顶

应用场景 在使用第三方打印插件,FastReport时,选择打印xps,点击打印,弹出文件另存为对话框,但是此对话框不会出现在软件的最前面,而且会一直占用进程,点击软件界面出现假死情况。 解决方案 思...
  • yijunwanghaha
  • yijunwanghaha
  • 2017年03月16日 13:13
  • 509

C#使用FastReport 报表初步体验(图文)

原来程序使用的Word和Excel来做一些导出数据和打印的操作,可是运行一段时间发现总有一些用户的电脑上安装的Office有些问题,还需要重新安装调整造成一些额外的维护工作。这里通过简单尝试使用Fas...
  • upi2u
  • upi2u
  • 2016年08月30日 16:24
  • 3609

修改fastreport实现页尾补空白行或打印固定行数

刚刚实现成功,“页尾剩余补空白行”和“打印固定行数”两种模式 代码: frxClass加:   //在DataBand末尾加空白行 //abcNone不启用,abcByReco...
  • nhconch
  • nhconch
  • 2014年12月02日 16:52
  • 8900

动态创建Fastreport分以下几个步骤:

动态创建Fastreport分以下几个步骤: 1.首先清空Fastreport,定义全局变量,并加载数据集    frReport.Clear;    frReport.DataSets.A...
  • suyingsoft
  • suyingsoft
  • 2017年04月23日 16:41
  • 755

FastReport.NET报表控件功能详解—预览、打印和导出

FastReport.NET提供方便的MS Word样式的预览窗口,支持在报表预览状态中进行文本搜索,还支持在报表预览状态中进行修改。 预览窗口 文本搜索 预览状态中修改 ...
  • Pokemogo
  • Pokemogo
  • 2017年08月03日 15:30
  • 671

在fastreport里转换金额大小写

在fastreport的pascalscript里面我没有搞明白怎么调用sysutil
  • ddlucky
  • ddlucky
  • 2014年11月13日 15:48
  • 1437

FastReport.net在用户的应用程序中创建报表

在这篇文章中,主要讲述FastReport .Net直接从用户应用程序中创建报表的能力,如果你不想产生一堆个人文件的报告模板或要在应用程序内隐藏一个报告模板,以避免损坏或修改模板,它就派上大用场了。此...
  • Small_YX
  • Small_YX
  • 2016年05月17日 17:32
  • 1118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FastReport几个问题
举报原因:
原因补充:

(最多只允许输入30个字)