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

Delphi QuickReport 實戰:多表關聯查詢報表設計與列印完整指南

     編輯:Delphi

QuickReport (QReport) 是 Delphi 經典報表元件,支援複雜分組、主從報表、圖表等功能。本文以「設備管理報表」為例,完整示範如何結合 TQuery 多表連接查詢、設計帶表格線的分組報表、以及處理分組標題不重複列印的技巧。

資料庫結構說明

三個 FoxPro 資料表 (.dbf) 位於 D:\SB 目錄:

表名欄位類型說明
DLBMK (大類編碼)DLBHN3大類編號
DLMCC20大類名稱
SBXHK (型號配置)XHBMN3型號編號
DLBHN3關聯大類編號
SBXHC30設備型號
SBPZC30設備配置
SBSLN3設備數量
BMSBK (部門設備)BMMCC20部門名稱
XHBMN3關聯型號編號
SLN3數量

報表需求:列出**只有電腦部擁有、其他部門沒有**的設備型號統計。

SQL 查詢語句

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)

關鍵屬性設定

  • 表格線繪製:各 Band 設定 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:\SB

實務開發提醒

  1. BDE 設定:確保 DatabaseName 路徑正確,FoxPro 驅動已安裝。
  2. 字串修剪:SQL 中 TRIM(bmmc) 處理 Char 型別尾部空白,避免比對失敗。
  3. 豎線斷裂:BeforePrint 動態設定 Shape 高度可完美適應不同行高、字體大小變化。
  4. 分組邏輯:利用變數記錄上一筆分組鍵值,配合 PrintBand 參數控制是否列印,是 QuickReport 分組不重複列印的標準模式。
  5. 子報表替代:複雜主從關係可考慮 TQRSubDetail 子報表,功能更強大。

QuickReport 雖為舊世代元件,但在傳統 Delphi 專案維護中仍佔重要地位,掌握其分組、表格繪製、動態控制等核心技巧,能快速產出專業級列表報表。

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