天天看點

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

        主報表和子報表(或Table表)使用不同的資料庫時。JasperReport/Birt等報表工具從功能上可以處理,但在子報表中無法直接使用資料源名,需要使用顯式的資料庫賬号、密碼。可以看到這種方式存在一定的安全隐患,而且實施過程比較複雜。

集算器具有結構化強計算引擎,支援多樣性資料源,內建簡單,可以協助報表工具友善地實作此類需求,下面通過一個例子來說明主子報表多資料源的實作過程。

         表emp在MySQL資料庫中,存儲員工資訊,主鍵是EId。表sales在MSSQL中,存儲員工的訂單資訊,字段SellerId是邏輯外鍵,對應emp表的EId字段。現在需要制作一張主子報表,按薪酬範圍顯示每位員工的訂單資訊,主報表資料來自表emp,子報表資料來自表sales。部分源資料如下:

        表emp

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

         表sales

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

        集算器代碼:

        empEsProc.dfx(該腳本檔案用于主報表)

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

        A1:按薪酬範圍查詢MYSQL資料庫的表emp。

        myDB1是資料源名,指向MYSQL。函數query執行SQL查詢,可以接收參數,low和high分别是來自報表的參數,表示薪酬範圍。當low=1000,high=3000時,A1的計算結果如下:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

        A2:将A1傳回給報表工具。集算器對外提供JDBC接口,報表工具會将集算器識别為普通資料庫,內建方案請參考相關文檔。

        salesEsProc.dfx(該腳本檔案用于子報表)

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

         A1:按員工ID從MSSQL的sales表查找相應的訂單。

         myDB1是資料源名,指向MSSQL。eid是報表參數,表示員工ID,用來建立主子報表的關聯關系。如果eid=1,則A1的計算結果如下:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

         A2:将A1傳回給報表工具。

         接下來以JasperReport為例設計簡單的主子報表,主表模闆如下:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

         需要定義兩個報表參數pLow、pHigh,分别對應empEsProc.dfx中的兩個參數。

         報表調用集算器的方法和調用存儲過程一樣。首先要定義JDBC資料源,比如esProcConn,如下圖:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

        之後就可以在JasperReport的SQL設計器中調用empEsProc.dfx,表達式是:empEsProc $P{pLow},$P{pHigh}。

        下面設計子報表,模闆如下:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

        對于報表來說,empEsProc.dfx和salesEsProc.dfx來自于同一個資料源esProcConn,是以子報表的資料源選擇“Usesame connection used to fill the master report”,如下圖:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

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

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

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

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

        報表模版:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

        報表預覽:

主子報表資料源來自異構資料庫的解決方法(Jasper report為例)

繼續閱讀