多數據源主子報表的處理(Jasper爲例)

   主報表和子報表(或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,因此子報表的數據源選擇“Use same connection used to fill the master report”,如下圖:



 

   類似的,在子報表中調用集算器的SQL寫作:salesEsProc $P{pEId}

  主子報表的關係請按照Jasper的規範設定,本案例用主表中的字段$F{EId}映射子報表的參數pEId。最終的表樣如下:



 

 Table表相當於格式簡單的子報表,Jasper對兩者採取了相同的處理結構,因此Table表也會遇到多數據源的問題。此類問題同樣可以用集算器解決,比如把本案例的子報表改爲Table表。

  報表模版:



 

   報表預覽:



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章