報表項目中,經常會出現報表源數據來自不一樣數據庫的狀況,也就是同一張報表可能會從多個業務系統讀取數據。例如:員工信息從人力資源系統中取出,銷售數據從銷售系統中取出。固然,還有一種可能,同一應用系統的數據庫負載太大,不得已分紅多個數據庫,例如:銷售系統數據分紅當前庫和歷史庫。sql
在數據庫類型方面,報表工具可能鏈接一樣類型的數據庫,好比都是 oracle 或者 db2;也多是不一樣的類型。數據庫
報表應用中針對這種數據分庫存儲的解決辦法有兩種:一、建設專門的數據倉庫;二、利用跨庫訪問的技術。oracle
專門數據倉庫的建設和管理比較複雜,若是數據量很大效率會很低,並且要持續進行 ETL 以便同步各個應用系統的數據。同時,數據倉庫利用的實際上也是傳統數據庫的技術,當遇到負載較大的時候也會面臨着進一步分庫的問題。數據倉庫方式結構示意圖以下:工具
若是使用跨庫訪問技術,例如 Oracle 的透明網關、DB2 的聯合查詢等,也會遇到很多侷限。比較共性的問題是:一、配置起來比較麻煩,並且每每須要數據庫寫權限;二、要爲跨庫的表配置別名;三、不一樣類型數據庫的數據類型不一致時,比較難處理。四、sql 語句受到限制,比較難實現複雜的計算。這種方式的結構示意圖以下:設計
如今,有了第 3 種解決辦法,也就是使用潤乾報表(結合集算器實現)。其內置的集算引擎能夠鏈接多個數據庫,取數以後統一進行數據計算,從而能較好的解決報表數據取自不一樣數據庫的問題。潤乾報表解決分庫存儲問題的結構示意圖以下:3d
下面經過「銷售人員銷售報表」說明潤乾報表解決數據分庫存儲問題的過程。報表以下圖:對象
報表中的銷售訂單數據來自於銷售系統的 db2 數據庫,員工信息來自於人力資源系統的 db2 數據庫。使用潤乾報表開發這張報表的過程以下:blog
一、配置數據源教程
在潤乾報表和集算器中分別配置兩個數據源,銷售系統數據庫「db2sales」,人力資源數據庫「db2HR」。資源
二、編寫腳本
在集算器中定義網格參數 state,並編寫計算腳本:
A | |
---|---|
1 | >salesdb=connect(「db2sales」) |
2 | >hrdb=connect(「db2HR」) |
3 | =salesdb.query(「select * from sales」) |
4 | =hrdb.query(「select * from employee」) |
5 | =A3.run(SELLERID=A4.select@1(EID:A3.SELLERID)) |
6 | =A5.select(SELLERID.STATE==state) |
7 | =A6.new(ORDERID,CLIENT,SELLERID.NAME:SELLERNAME,AMOUNT,ORDERDATE) |
8 | >salesdb.close() |
9 | >hrdb.close() |
10 | result A7 |
代碼說明:
A1:鏈接預先配置好的 db2sales 數據源。
A2:鏈接預先配置好的 db2HR 數據源。
A三、A4:分別從兩個數據源中讀取 sales 序表和 employee 序表。
A5:使用集算器的對象引用機制,將 sales 序表和 employee 序表經過 sellerid=eid 關聯。
A6:按照參數 state="California" 過濾序表。
A7:生成一個新的序表,獲得須要的字段。
A八、9:關閉數據庫鏈接。
A10:返回給集算報表。
三、配置數據集
在報表設計器中定義參數 argstate,配置集算數據集:
四、設計報表以下:
輸入參數計算後,便可獲得前面但願的報表。
報表上部的查詢按鈕使用了潤乾報表提供的「參數模板」功能,具體作法參見教程,這裏再也不贅述。