多數據源動態關聯報表的制作(birt為例)
主表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為例)