QuickReport (QReport) 是 Delphi 經典報表元件,支援複雜分組、主從報表、圖表等功能。本文以「設備管理報表」為例,完整示範如何結合 TQuery 多表連接查詢、設計帶表格線的分組報表、以及處理分組標題不重複列印的技巧。
三個 FoxPro 資料表 (.dbf) 位於 D:\SB 目錄:
| 表名 | 欄位 | 類型 | 說明 |
|---|---|---|---|
DLBMK (大類編碼) | DLBH | N3 | 大類編號 |
DLMC | C20 | 大類名稱 | |
SBXHK (型號配置) | XHBM | N3 | 型號編號 |
DLBH | N3 | 關聯大類編號 | |
SBXH | C30 | 設備型號 | |
SBPZ | C30 | 設備配置 | |
SBSL | N3 | 設備數量 | |
BMSBK (部門設備) | BMMC | C20 | 部門名稱 |
XHBM | N3 | 關聯型號編號 | |
SL | N3 | 數量 |
報表需求:列出**只有電腦部擁有、其他部門沒有**的設備型號統計。
SELECT a.dlbh, a.dlmc, b.sbxh, b.sbpz, b.sbsl
FROM dlbmk a, sbxhk b
WHERE a.dlbh = b.dlbh
AND b.xhbm NOT IN (
SELECT xhbm FROM bmsbk WHERE TRIM(bmmc) <> '電腦部'
)
ORDER BY a.dlbh
Qrep1: TQuickRep
DataSet = Query1
Bands:
TitleBand1 (rbTitle) // 報表標題列
HeadBand1 (rbColumnHeader) // 表頭欄位名稱
DetailBand1 (rbDetail) // 大類分組列 (每組只印一次)
ChildBand1 (rbChildBand) // 型號明細列 (屬於 DetailBand1)
DrawLeft/Right/Top/Bottom = True 畫橫線;用 TQRShape 設定 Shape = qrsVertLine、Height = Band.Height 畫豎線。DetailBand1 放置 DlmcDBText (綁 dlmc) — 大類名稱ChildBand1 放置 SbxhDBText, SbpzDBText, SbslDBText — 型號/配置/數量Shape1~3 在 HeadBand1,Shape4~6 在 DetailBand1,Shape7~9 在 ChildBand1,寬度 1、Top 0。var
bh: ShortInt = 0; // 記錄上一筆大類編號,初始 0 確保第一組必印
procedure TrepForm.HeadBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
{ 表頭豎線高度同步 Band 高度 }
Shape1.Height := HeadBand1.Height;
Shape2.Height := HeadBand1.Height;
Shape3.Height := HeadBand1.Height;
end;
procedure TrepForm.DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
{ 控制大類名稱只印一次:dlbh 改變才列印 }
PrintBand := (bh <> Query1['dlbh']);
if PrintBand then
begin
bh := Query1['dlbh']; // 更新記錄
Shape4.Height := DetailBand1.Height;
Shape5.Height := DetailBand1.Height;
Shape6.Height := DetailBand1.Height;
end;
end;
procedure TrepForm.ChildBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
{ 明細列豎線高度同步 }
Shape7.Height := ChildBand1.Height;
Shape8.Height := ChildBand1.Height;
Shape9.Height := ChildBand1.Height;
end;
procedure TmainForm.PreviewBtnClick(Sender: TObject);
begin
repForm.Qrep1.Preview;
end;
procedure TmainForm.PrintBtnClick(Sender: TObject);
begin
repForm.Qrep1.Print;
end;
sbgl.dpr 專案檔main.pas 主視窗sbrep.pas 報表視窗dlbmk.dbf, sbxhk.dbf, bmsbk.dbf 放在 D:\SBDatabaseName 路徑正確,FoxPro 驅動已安裝。TRIM(bmmc) 處理 Char 型別尾部空白,避免比對失敗。BeforePrint 動態設定 Shape 高度可完美適應不同行高、字體大小變化。PrintBand 參數控制是否列印,是 QuickReport 分組不重複列印的標準模式。TQRSubDetail 子報表,功能更強大。QuickReport 雖為舊世代元件,但在傳統 Delphi 專案維護中仍佔重要地位,掌握其分組、表格繪製、動態控制等核心技巧,能快速產出專業級列表報表。