1. 程式人生 > >多數據源動態關聯報表的制作(birt為例)

多數據源動態關聯報表的制作(birt為例)

處理 center 關閉 主表 等價 兩個 數據 fonts img

使用Jasper或BIRT等報表工具時,常會碰到一些很規的統計,用報表工具本身或SQL都難以處理,比方與主表相關的子表分布在多個數據庫中,報表要展現這些數據源動態關聯的結果。集算器具有結構化強計算引擎,集成簡單,能夠協助報表工具方便地實現此類需求。以下通過一個樣例來說明多數據源動態關聯的實現過程。

主表org在數據源Master中,org裏每條記錄相應的子表在不同的數據源中,比方org.org_id=”ORG_S”時。這條記錄相應的子表是數據源S_odaURL的User表,org.org_id=”ORG_T”時,這條記錄相應的子表是數據源T_odaURL中的User表。子表不止兩個,名字都是User。須要和主表動態關聯再呈如今報表中。邏輯上的關系例如以下:

技術分享

集算器代碼例如以下:

技術分享

A1=Master.query("select * from org where org_id like ‘"+arg1+"%‘ ")


運行SQL。從數據源Master的org表取數據。

arg1是來自報表的參數,用來過濾數據,假如arg1=”ORG”則A1的計算結果例如以下:

技術分享

A2: for A1
依次循環A1中的記錄。每次動態關聯一個子表,並將關聯結果合並在B2中。值得註意的是集算器用自然縮進來表示循環語句的作用範圍,即B2-B7。循環體中可用A2來引用循環變量,可用#A2來引用循環計數。


B2=right(A2.org_id,1)+"_odaURL"
依據當前記錄的org_id字段計算出相應子表的數據源名。

第一次循環時。B2的計算結果為” S_odaURL”。


B3=connect(B2)
依據名字連接到數據源。

註意。A1中的數據源Master已配置為自己主動連接,能夠直接使用,B3中的數據源須要使用函數connect手動連接。


B4=B3.query("select * from user where org=?",A2.org_id)
查詢數據源B3,按條件取出user表中的數據。


B5=B4.derive(A2.org_id:org_id,A2.org_manager:manager,A2.org_title:title)
在子表B4中新增三列,數據來自主表。重命名為org_id、manager、title。第一次循環時。B5計算結果例如以下:

技術分享

B6=B1=B1|B5
將B5的計算結果合並到B1,運算符”|”等價於函數union。

循環結束後B1會存儲報表須要的完整數據。例如以下:

技術分享

B7=B3.close()
關閉數據源連接。


A8: result B1
將B1返回給報表工具。

集算器對外提供JDBC接口,報表工具會將集算器識別為普通數據庫。集成方案請參考相關文檔。

對於熟練的程序猿,還能夠使用集算器的長語句來避免循環語句,使代碼更為簡潔:

技術分享

接下來以BIRT為例設計一張簡單的分組表,模板例如以下:

技術分享

須要定義報表參數pVar,用來相應集算器中的參數。

預覽後能夠看到報表結果:

技術分享

報表調用集算器的方法和調用存儲過程一樣,比方將本腳本保存為dynamicDatasource.dfx。則在BIRT的存儲過程設計器中能夠用call dynamicDatasource (?)來調用。

多數據源動態關聯報表的制作(birt為例)