
TIPTOP 客製紀錄 (三):Crystal Report 報表開發基礎
TIPTOP 客製開發進階:Crystal Report 報表開發。紀錄報表引擎的運作原理與中繼架構,將資料庫數據轉換為格式化的報表產出。
WRITTEN BY

- Name
- Harry Chang
在完成 單檔表單 與 單檔明細 的開發後,下一個重要的課題是報表開發。報表在 ERP 系統中負責將資料精準呈現給使用者。本篇筆記將重點紀錄 TIPTOP 與 Crystal Report 協同運作的報表開發流程。
標準程式架構

在開發報表程式時,同樣建議尋找邏輯清晰的標準報表程式(例如 aapr106)進行複製。移除所有註解後,即可取得乾淨的報表骨架。
報表程式與一般維護程式最大的不同在於,報表程式包含處理暫存檔案的架構,其儲存的內容主要為 XML 資料,用以傳送給 Crystal Report 報表主機。
以下是修改為 capr901 的標準報表程式架構說明:
報表程式的底層邏輯,主要圍繞著資料的 Foreach 與 EXECUTE 進行處理。
開發執行順序
在 TIPTOP 中新增 Crystal Report 報表程式的標準流程如下:
- 需求定義:確認資料來源(例如沿用
tc_apx_file)。 - SQL 撰寫:在資料庫中先行測試 SQL 語法,確認產出的資料結果正確無誤。
- 程式編譯:編譯
capr901.4gl。 - 複製畫面:複製 4FD 檔案並進行 QBE(Query By Example)條件確認。
- 權限註冊:到
p_zz新增報表程式代號。 - 連結設定:運行
r.l2 capr901。 - 權限放行:在
p_zz點選給予權限。 - 樣板設定:在
p_zaw進行樣板的複製與修改設定。 - CR主機設定:在 Crystal Report 主機上複製樣板 (.rpt),並修改欄位對應與 XML 定義。
完成上述 9 個步驟後,即可在系統前端(如 Edge 瀏覽器)檢視報表產出結果。
Crystal Report 實作練習
在報表開發實務中,重點在於:在 Crystal Report (CR) 主機上製作一個完整的報表樣板 (capr901)。
這項練習的目的在於理解「兩台主機協作」的運作機制。在 TIPTOP 的報表架構中,資料的產出是透過跨主機的資料拋轉,最終呈現在使用者的瀏覽器上。
重點機制包含:
- 跨主機的資料傳遞:區分「TIPTOP 主機(負責邏輯與資料處理)」與「CR 報表主機(負責畫面渲染)」的角色。TIPTOP 負責將資料整理成 XML 格式,傳送給 CR 主機進行排版渲染。
- XML 標籤的對應 (Mapping):在 Crystal Report 設計器中,必須精確地將 XML 中的欄位標籤對應到報表的版面上。若命名不一致,數據將無法正確顯示。
- 樣板 (Template) 權限連結:透過
p_zaw讓 TIPTOP 系統與 CR 主機上的樣板建立連結,使數據能順利轉換並於瀏覽器上呈現。

TIPTOP 的 Crystal Report 列印機制採用了高度解耦的「中繼架構」。其核心在於: 4GL 程式不直接處理報表排版,而是先透過複雜的運算,將最終數據寫入動態生成的暫存表 (l_table),並由 cl_prt_cs3 底層函式將 SQL 指令與參數封裝成 XML 格式的描述檔,發送至 CR 主機。CR 主機端則透過預先設計好的樣板 (.rpt),根據 XML 提供的 Metadata 進行欄位對應 (Field Mapping),並向資料庫撈取暫存表內的數據。這種機制能確保即便在處理巨量資料時,也能精確控制數據邏輯,同時保有 Crystal Report 在報表美化與輸出格式上的極致靈活性。
補充:主機間通訊協定與 Port(ISO 27001 稽核實錄)
導入 ISO 27001 時,稽核方問了一個開發時很少被問到的問題:「TIPTOP 主機是怎麼跟 CR 主機溝通的?使用什麼 Port?」。趁這個機會,把上面架構圖的網路層實際查證了一遍,紀錄如下。
跨主機的連線一共三條:
| 連線方向 | 協定與 Port | 傳輸內容 |
|---|---|---|
| TIPTOP 主機 → CR 主機 | HTTP / TCP 80(IIS) | 僅傳報表憑證編號(certid),無業務資料 |
| CR 主機 → 資料庫主機 | Oracle SQL*Net / TCP 1521 | 憑 certid 取回 SQL 指令與報表資料 |
| 使用者瀏覽器 → CR 主機 | HTTP / TCP 80(IIS) | 檢視與下載渲染完成的報表 |
實地查證的方式有三個檢查點:
- CR 主機位址與 Port:在 TIPTOP 主機上執行
echo $CRIP,會印出類似http://192.168.x.x/topprod/的 URL——這就是cl_prt_cs3發送 HTTP 請求的目的地。URL 未帶 port,依 HTTP 標準即為 TCP 80。此環境變數定義於.profile與topprod.sh。 - Oracle Listener Port:檢視
$ORACLE_HOME/network/admin/listener.ora,可看到(PROTOCOL = TCP)(PORT = 1521)的設定。 - 實際流量:在 CR 主機(Windows)上執行
netstat -an | findstr 1521,可觀察到 CR 主機對資料庫 1521 的多條 ESTABLISHED 連線——這是 CR 引擎維持的資料庫連線池。TIPTOP 到 CR 的 port 80 連線僅在報表產生的瞬間存在,需在列印當下用netstat -an | findstr :80才抓得到。
這個中繼架構在資安上有一個特點:TIPTOP 與 CR 之間的 HTTP 通道上只有 certid 這組取件編號,機敏的業務資料並不經過這條線,實際資料存取全部收斂在資料庫的 1521 連線上,回覆稽核時是個加分點。不過也要誠實面對它的弱點:三條連線都是明文傳輸,port 80 因全體使用者檢視報表所需無法鎖來源,這部分防火牆規則(1521 僅允許 CR 主機連入)與 HTTPS 的導入評估,是走 ISO 27001 遲早要面對的課題。
開發規範:報表種類與應用
在 ERP 系統中,報表的應用型態決定了其服務對象與設計重點,主要分為以下三類:
- 明細表 (Detail Reports):提供最詳盡的底層數據紀錄。強調資料的完整性與檢索的便利性。
- 憑證 (Vouchers/Documents):系統對外的正式單據(如採購單、出貨單)。代表著交易依據,排版的嚴謹度與精確性為第一優先。
- 管理報表 (Management Reports):高度濃縮的數據分析。主要提供給管理層級作為決策參考,需具備高度的資料摘要與視覺化呈現。
核心觀念:報表是與使用者溝通的橋樑 報表是使用者最常接觸到的系統產出,針對不同人員的需求提供正確、清晰的查詢結果,是報表客製化最重要的環節。
結語
完成 單檔表單、單檔明細 到本篇「Crystal Report 報表」的開發紀錄後,已涵蓋 TIPTOP 系統客製化最核心的三大技術領域。
熟練掌握基本功後,後續面對更複雜的業務邏輯,便能以這些基礎架構為基礎進行「組合應用」。在了解系統架構與限制的前提下,靈活運用這些開發技巧,即可有效應對各類客製化需求。