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一樣使用共用的報表組件了
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)>)]