首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

FastReport 進階應用:打造醫院藥品驗收單與調撥單列印系統

     編輯:Delphi

需求背景

醫院藥品驗收單、調撥單為固定格式條形單據(21cm × 10cm),每頁固定 5 筆明細,不足補空行,超過換頁並重印頁首,底部顯示本頁小計與累計。

報表設計器操作

  1. 新增報表,設定頁面大小、邊距。
  2. 放置 Band1(頁首)、Band2(明細)、Band3(頁尾)、Child1(分頁頁首)、Child2(空白行)、Child3(小計列)。
  3. 綁定資料集 frDBDataSet1 對應查詢結果。
  4. 定義變數:InHJ(入庫合計)、OutHJ(出庫合計)、CaHJ(差價合計)、LineCount(總行數)。
報表設計器版面

關鍵事件腳本

Band2.OnBeforePrint(分頁控制)

begin
  if (LINE# - 1) <> 0 and (LINE# - 1) mod 5 = 0 then
  begin
    showBand(Child1);  // 列印新頁頁首
    showBand(Band1);
  end;
end;

Child3.OnBeforePrint(空行補齊與小計)

begin
  lin := LineCount;
  while (lin mod 5) <> 0 do
  begin
    showBand(Child2); // 列印空白行
    inc(lin);
  end;
  showBand(Child3);   // 列印小計列
end;

Band3.OnBeforePrint(頁尾固定內容)

begin
  showBand(Child1);
end;

Delphi 端資料傳遞與累計邏輯

private
  line1, line2: Integer;
  inputXj, intemp: Double;   // 入庫小計/暫存
  outXj, outemp: Double;     // 出庫小計/暫存
  CajiaXj, catemp: Double;   // 差價小計/暫存

procedure TInputForm.frDBDataSet1Next(Sender: TObject);
var ReCount: Integer;
begin
  ReCount := ADORuku.RecordCount;
  Inc(line1); Inc(line2);

  if not ADORuku.Eof then
  begin
    inputXj  := inputXj  + ADORuku.FieldByName('入庫金額').AsFloat;
    outXj    := outXj    + ADORuku.FieldByName('出庫金額').AsFloat;
    CajiaXj  := CajiaXj  + ADORuku.FieldByName('差價金額').AsFloat;
  end;

  // 每 5 筆輸出小計並歸零
  if (line2 mod 5 = 0) and (ReCount > (line2 div 5) * 5) then
  begin
    intemp := inputXj; outemp := outXj; catemp := CajiaXj;
    inputXj := 0; outXj := 0; CajiaXj := 0;
  end;

  // 最後一筆將累計值傳給報表變數
  if ADORuku.Eof then
  begin
    intemp := inputXj; outemp := outXj; catemp := CajiaXj;
  end;
end;

預覽效果

報表預覽效果

遷移建議

FastReport 4/5/6 版本語法相容,若升級至新版僅需調整 showBand 大小寫與變數宣告方式。複雜單據建議改用 TfrxMemoView 獨立計算欄位,減少腳本耦合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved