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;beginend.
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