Oracle Reports 產出的報表預設為動態行列數,列印時常因頁尾資料不足導致版面錯位。本文分享兩種樣式的固定行列輸出實作:Tabular 用「觸發器補空白列」,Matrix 用「視圖 Union 空白列」,皆經實務驗證可直接套用。
wzdm(物資代碼),欄位:wzdm、wzmc、xhgg、jldwx 行(如 30 行),不足補空白列DECLARE
v_jls NUMBER(2); -- 實際筆數
i NUMBER(2) := 1;
BEGIN
SELECT COUNT(*) INTO v_jls FROM wzdm;
IF MOD(v_jls, :x) <> 0 THEN
LOOP
EXIT WHEN i >= (:x - MOD(v_jls, :x)) + 1;
INSERT INTO wzdm (wzdm, wzmc, xhgg, jldw) VALUES ('', '', '', '');
i := i + 1;
END LOOP;
COMMIT;
END IF;
END;
:x 為使用者參數,可在報表執行時輸入每頁行數。
BEGIN
DELETE FROM wzdm WHERE wzdm IS NULL;
COMMIT;
END;
t_zjxhqx(物資資金消耗去向月報),欄位:lbmc(類別)、dwmc(單位)、je(金額)x 行(類別)、y 列(單位),不足補空白t_kjl(no NUMBER(2)),塞入 1..z(z = 每頁最大可印行數)。v_tjbb,將實際資料與空白列做 UNION,透過 MOD 計算需補行數與列數。v_tjbb,即可得到固定 x 行 y 列結果。CREATE VIEW v_tjbb AS
SELECT dwmc, lbmc, je FROM t_zjxhqx
UNION
SELECT dwmc, NULL, TO_NUMBER(NULL)
FROM t_zjxhqx, t_kjl
WHERE no - (z - x) > (SELECT MOD(COUNT(DISTINCT lbmc) - 1, x) + 1 FROM t_zjxhqx)
UNION
SELECT NULL, lbmc, TO_NUMBER(NULL)
FROM t_zjxhqx, t_kjl
WHERE no - (z - y) > (SELECT MOD(COUNT(DISTINCT dwmc) - 1, y) + 1 FROM t_zjxhqx);
z、x、y 需依實際版面替換為常數。
| 樣式 | 方法 | 優點 | 缺點 |
|---|---|---|---|
| Tabular | Trigger 插/刪空白列 | 邏輯直觀、不改動基表結構 | 會實際寫入資料表,並發環境需注意鎖衝突 |
| Matrix | 視圖 Union 空白列 | 零侵入、效能佳、適合交叉表 | 視圖 SQL 較複雜,維護需理解 MOD 邏輯 |
若專案已規劃移轉現代化報表工具,Tabular 固定行可用 RTF 模板 for-each@last-page 邏輯;Matrix 固定行列可用 Pivot Table 設定「顯示無資料項目」。
掌握這兩招,即可在 Oracle Reports 專案中輸出整齊劃一的列印版面,滿足財務、稽核單位的格式嚴格要求。