醫院藥品驗收單、調撥單為固定格式條形單據(21cm × 10cm),每頁固定 5 筆明細,不足補空行,超過換頁並重印頁首,底部顯示本頁小計與累計。
Band1(頁首)、Band2(明細)、Band3(頁尾)、Child1(分頁頁首)、Child2(空白行)、Child3(小計列)。frDBDataSet1 對應查詢結果。InHJ(入庫合計)、OutHJ(出庫合計)、CaHJ(差價合計)、LineCount(總行數)。
begin
if (LINE# - 1) <> 0 and (LINE# - 1) mod 5 = 0 then
begin
showBand(Child1); // 列印新頁頁首
showBand(Band1);
end;
end;
begin
lin := LineCount;
while (lin mod 5) <> 0 do
begin
showBand(Child2); // 列印空白行
inc(lin);
end;
showBand(Child3); // 列印小計列
end;
begin
showBand(Child1);
end;
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 獨立計算欄位,減少腳本耦合。