主報表和子報表(或Table表)使用不同的資料庫時。JasperReport/Birt等報表工具從功能上可以處理,但在子報表中無法直接使用資料源名,需要使用顯式的資料庫賬号、密碼。可以看到這種方式存在一定的安全隐患,而且實施過程比較複雜。
集算器具有結構化強計算引擎,支援多樣性資料源,內建簡單,可以協助報表工具友善地實作此類需求,下面通過一個例子來說明主子報表多資料源的實作過程。
表emp在MySQL資料庫中,存儲員工資訊,主鍵是EId。表sales在MSSQL中,存儲員工的訂單資訊,字段SellerId是邏輯外鍵,對應emp表的EId字段。現在需要制作一張主子報表,按薪酬範圍顯示每位員工的訂單資訊,主報表資料來自表emp,子報表資料來自表sales。部分源資料如下:
表emp

表sales
集算器代碼:
empEsProc.dfx(該腳本檔案用于主報表)
A1:按薪酬範圍查詢MYSQL資料庫的表emp。
myDB1是資料源名,指向MYSQL。函數query執行SQL查詢,可以接收參數,low和high分别是來自報表的參數,表示薪酬範圍。當low=1000,high=3000時,A1的計算結果如下:
A2:将A1傳回給報表工具。集算器對外提供JDBC接口,報表工具會将集算器識别為普通資料庫,內建方案請參考相關文檔。
salesEsProc.dfx(該腳本檔案用于子報表)
A1:按員工ID從MSSQL的sales表查找相應的訂單。
myDB1是資料源名,指向MSSQL。eid是報表參數,表示員工ID,用來建立主子報表的關聯關系。如果eid=1,則A1的計算結果如下:
A2:将A1傳回給報表工具。
接下來以JasperReport為例設計簡單的主子報表,主表模闆如下:
需要定義兩個報表參數pLow、pHigh,分别對應empEsProc.dfx中的兩個參數。
報表調用集算器的方法和調用存儲過程一樣。首先要定義JDBC資料源,比如esProcConn,如下圖:
之後就可以在JasperReport的SQL設計器中調用empEsProc.dfx,表達式是:empEsProc $P{pLow},$P{pHigh}。
下面設計子報表,模闆如下:
對于報表來說,empEsProc.dfx和salesEsProc.dfx來自于同一個資料源esProcConn,是以子報表的資料源選擇“Usesame connection used to fill the master report”,如下圖:
類似的,在子報表中調用集算器的SQL寫作:salesEsProc $P{pEId}
主子報表的關系請按照Jasper的規範設定,本案例用主表中的字段$F{EId}映射子報表的參數pEId。最終的表樣如下:
Table表相當于格式簡單的子報表,Jasper對兩者采取了相同的處理結構,是以Table表也會遇到多資料源的問題。此類問題同樣可以用集算器解決,比如把本案例的子報表改為Table表。
報表模版:
報表預覽: