實現報表資料分庫儲存

bubblegum發表於2019-12-18

報表專案中,常常會出現報表源資料來自不同資料庫的情況,也就是同一張報表可能會從多個業務系統讀取資料。例如:員工資訊從人力資源系統中取出,銷售資料從銷售系統中取出。當然,還有一種可能,同一應用系統的資料庫負載太大,不得已分成多個資料庫,例如:銷售系統資料分成當前庫和歷史庫。

在資料庫型別方面,報表工具可能連線同樣型別的資料庫,比如都是 oracle 或者 db2;也可能是不同的型別。

報表應用中針對這種資料分庫儲存的解決辦法有兩種:1、建設專門的資料倉儲;2、利用跨庫訪問的技術。

專門資料倉儲的建設和管理比較複雜,如果資料量很大效率會很低,而且要持續進行 ETL 以便同步各個應用系統的資料。同時,資料倉儲利用的實際上也是傳統資料庫的技術,當遇到負載較大的時候也會面臨著進一步分庫的問題。資料倉儲方式結構示意圖如下:

imagepng

如果使用跨庫訪問技術,例如 Oracle 的透明閘道器、DB2 的聯合查詢等,也會遇到不少侷限。比較共性的問題是:1、配置起來比較麻煩,而且往往需要資料庫寫許可權;2、要為跨庫的表配置別名;3、不同型別資料庫的資料型別不一致時,比較難處理。4、sql 語句受到限制,比較難實現複雜的計算。這種方式的結構示意圖如下:

imagepng

現在,有了第 3 種解決辦法,也就是使用潤乾報表(結合集算器實現)。其內建的集算引擎可以連線多個資料庫,取數之後統一進行資料計算,從而能較好的解決報表資料取自不同資料庫的問題。潤乾報表解決分庫儲存問題的結構示意圖如下:

imagepng

下面透過“銷售人員銷售報表”說明潤乾報表解決資料分庫儲存問題的過程。報表如下圖:

imagepng

報表中的銷售訂單資料來自於銷售系統的 db2 資料庫,員工資訊來自於人力資源系統的 db2 資料庫。使用潤乾報表開發這張報表的過程如下:

1、配置資料來源

在潤乾報表和集算器中分別配置兩個資料來源,銷售系統資料庫“db2sales”,人力資源資料庫“db2HR”。

2、編寫指令碼

在集算器中定義網格引數 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 資料來源。

A3、A4:分別從兩個資料來源中讀取 sales 序表和 employee 序表。

A5:使用集算器的物件引用機制,將 sales 序表和 employee 序表透過 sellerid=eid 關聯。

A6:按照引數 state="California" 過濾序表。

A7:生成一個新的序表,得到需要的欄位。

A8、9:關閉資料庫連線。

A10:返回給集算報表。

3、配置資料集

在報表設計器中定義引數 argstate,配置集算資料集:

imagepng

4、設計報表如下:

imagepng

輸入引數計算後,即可得到前面希望的報表。

報表上部的查詢按鈕使用了潤乾報表提供的“引數模板”功能,具體做法參見教程,這裡不再贅述。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69957599/viewspace-2669198/,如需轉載,請註明出處,否則將追究法律責任。

相關文章