這篇文章主要介紹瞭如何讓Birt報表腳本數據源變得既簡單又強大,需要的朋友可以參考下
概述:運行在 JVM 上的 SQL 函數和存儲過程
總所周知,有些數據庫沒有強大的分析函數(eg. Mysql), 有些數據庫沒有存儲過程(eg. Vertica),當遇到複雜的數據計算,往往只能通過 Python,R 等外部腳本來實現,但這些腳本語言和主流工程語言(Java)集成性不好,如果直接用工程語言實現類似 SQL 函數和存儲過程的功能,經常只是針對某個計算需求編寫冗長的代碼,代碼幾乎不可複用。
另外,即便擁有強大的分析函數,實現稍複雜的邏輯其實也不算容易,比如下面這種常見的業務計算,找出“銷售額佔到一半的前 n 個客戶,並按銷售額從大到小排序”,在 Oracle 中 SQL 實現如下:
with A as (selectCUSTOM,SALESAMOUNT,row_number() over (order by SALESAMOUNT) RANKING from SALES) select CUSTOM,SALESAMOUNT from (select CUSTOM,SALESAMOUNT,sum(SALESAMOUNT) over (order by RANKING) AccumulativeAmount from A) where AccumulativeAmount>(select sum(SALESAMOUNT)/2 from SALES) order by SALESAMOUNT desc
說明:按照銷售額累計值從小到大排序,通過累計值大於“一半銷售額”的條件,逆向找出佔到銷售額一半的客戶。爲了避免窗口函數在計算累計值時對銷售額相同的值處理出現錯誤,用子查詢先計算了排名。
下面是用集算器實現相同邏輯的代碼:
從上述代碼我們可以看到,集算器利用一套簡潔的語法取代了需嵌套 SQL+ 窗口函數才能實現的邏輯,並且具有通用一致性(任何數據源代碼一致)。
集算器是一套運行在 JVM 上專門處理結構化數據的腳本語言,類似用 SQL 函數和存儲過程,與 Java 集成可以創建可移植、功能強大和與數據庫無關的計算邏輯,運行於中間層的計算邏輯和運行於數據庫層的數據邏輯之間的分離,提高了應用程序的可擴展性、靈活性和可維護性。
應用場景:報表數據準備
應用結構
集成後,集算器嵌入報表應用層,相當於本地的邏輯數據庫(不需要單獨服務器部署),在報表與數據源間作爲報表數據準備層,完成各種複雜的計算任務。
如何集成
下面以 Vertica 爲數據源,Birt 爲報表工具,描述怎樣集成 esProc 作爲數據準備層。
(一) Birt 開發環境
1、 基礎 jar 集成
集算器 JDBC 需要三個基礎 jar 包,都可以在 [esProc 安裝目錄]\esProc\lib 目錄下找到,分別爲:
dm.jar 集算器計算引擎及JDBC驅動包
jdom.jar 解析配置文件
icu4j\_3\_4_5.jar 處理國際化
除了基礎包外,還有一些爲完成特定功能的 jar 包。如,要在集算器 JDBC 用其它數據庫作爲集算器的數據源,那麼還需要相應數據庫的驅動 jar 包,本文涉及到 vertica,所以要同時增加其 JDBC 驅動包(以 vertica9.1。0 爲例)
vertica-jdbc-9.1.0-0.jar vertica 官網即可下載
獲取到以上 Jar 後,將其拷貝至 Birt 開發環境 [安裝目錄]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。
注意:標紅部分,不同 birt 版本略有不同
2、 配置文件集成
raqsoftConfig. ,主要包含集算器授權、腳本文件路徑、其他作爲集算器數據源的連接配置等。
可在 [esProc 安裝目錄]\esProc\config 下找到,需複製後放置在類路徑下,同樣將其拷貝至 Birt 開發環境 [安裝目錄]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。
注意:配置文件名不能改變
(二) Birt 應用環境
1、 將(一)中的所有 jar 拷貝至應用的 WEB-INF\lib 下
2、 將 raqsoftConfig. 拷貝至應用的 WEB-INF\classes 下
例一:常規調用
1、 Vertica 內 Sales 表字段及數據說明(通過 vsql 查詢,本測試庫有 2013/14/15 年數據)
2、 編寫並部署 esProc 腳本
(1) esProc 設計器添加 vertica JDBC 驅動包
vertica 官網下載 jdbc 驅動包(如,vertica-jdbc-9.1.0-0.jar),放至【esProc 安裝目錄】\common\jdbc 下
(2) 新增 vertica 數據源
打開設計器,Tool—Datasource connection 新增 JDBC 方式連接
點 ok 保存,再點 connect 連接
數據源名稱變爲粉色即表示連接成功。
(3) 編寫算法腳本 (文件:VerticaExternalProcedures.dfx)
File – New
(4) 部署腳本
將腳本文件部署到 raqsoftConfig. 配置的腳本文件主目錄下。
3、 esProc 配置文件 raqsoftConfig. 內增加 vertica 數據源連接配置
<DB name="vertica "> <property name="url" value="jdbc:vertica://192.168.10.10:5433/ForEsprocTestDB"/> <property name="driver" value="com.vertica.jdbc.Driver"/> <property name="type" value="0"/> <property name="user" value="dbadmin"/> <property name="password" value="runqian"/> <property name="batchSize" value="0"/> <property name="autoConnect" value="false"/> <property name="useSchema" value="false"/> <property name="addTilde" value="false"/> <property name="needTransContent" value="false"/> <property name="needTransSentence" value="false"/> <property name="caseSentence" value="false"/> </DB>
4、 Birt 開發工具內新建報表,並增加 esProc 數據源“esProcConnection”
Driver class 爲”com.esproc.jdbc.InternalDriver(v1.0)”,會用到 dm.jar 等
Data URL 爲”jdbc:esproc:local://"
5、 Birt 調用 Vertica 外部存儲過程(esProc 數據集)
新建“Data Sets”,選擇配置的集算器數據源(esProcConnection),數據集類型選擇存儲過程(SQL Stored Procedure Query)
Next,查詢腳本(Query-Query Text)輸入:{call VerticaExternalProcedures()}
其中:VerticaExternalProcedures 爲 esProc 腳本文件名
Finish,預覽數據(Preview Results)
此時,便看到了把 esProc 腳本作爲 Vertica 外部存儲過程取數輔助計
算的過程。
6、 Birt Web 端呈現
以簡單的網格報表爲例
報表設計如下
Web 發佈預覽
例二:參數調用
這裏把“找出訂單銷售額佔到一半的前 n 個客戶,並按銷售額從大到小排序”,改爲要求按年查詢,即“按年度查詢訂單銷售額佔到一半的前 n 個客戶,並按銷售額從大到小排序”,因此增加了參數過濾功能。
下面看下具體的改法:
1、 esProc 腳本增加按年度參數及過濾功能
打開 esProc 設計器,Program – Parameter – Add
參數名爲“qyear”(可與報表參數名不同)
腳本改動:
注:A2 增加條件過濾
2、 報表內增加年度參數
報表增加按年查詢的入口參數,參數名爲“qyear”
開發工具打開報表,Data Explorer – Report Parameter – new patameter
Default value 爲 qyear 的默認值。
3、 報表數據集增加數據集參數並與報表參數綁定
Data set 內編輯 VerticaExternalProcedures 數據集
Query Text 改爲“{call VerticaExternalProcedures(?)}”,? 爲入口參數年
度,此處用佔位符設置。
選 Parameters,增加數據集參數 qyear 並與報表參數 qyear 綁定。
Preview Results, 這裏根據 qyear 默認值僅有查詢 2013 年數據
改爲“2015”後
4、 Web 端預覽
查詢“2015”年數據
修改或 url 傳入 qyear 爲“2013”年後
更多 "birt 整合方案" 詳見: http://c.raqsoft.com.cn/tag/Report
總結
以上所述是小編給大家介紹的如何讓Birt報表腳本數據源變得既簡單又強大,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對神馬文庫網站的支持!