BIRT 中如何根據引數動態拼接 SQL

xiaohuihui發表於2020-06-17

BIRT可以使用sql query來建立資料集,透過在報表中設定引數(Parameter)來傳遞客戶端的使用者輸入,同時可以設定Dataset引數並且與報表引數關聯(這兩個引數是不同的),這樣可以將客戶端的使用者輸入傳遞給Dataset的引數供sql query的where語句使用,這是通常的建立sql語句的做法,但是這種方法只適合固定的sql語句,對於拼接動態的sql就不適用了。

比如要處理這麼個場景:根據傳入的使用者名稱、起止日期,分級別查詢出不同的訂單資訊。author儲存使用者部門資訊,account儲存賬目資訊(多個使用者可歸屬於一個賬目,以逗號分隔),META儲存訂單明細。示意圖如下:

BIRT 中如何根據引數動態拼接 SQL

1、傳入登入引數login_user,判斷部門級別

2、當級別為manager,需提前獲取當前賬目

3、當部門為admin,統計所有賬目、使用者銷售額

4、當部門為manager,統計當前賬目下所屬的使用者銷售額

5、當部門為engineer,只統計自己銷售額

BIRT可以透過一個間接的方式來實現:在DataSet的Script頁簽下選擇beforeOpen事件,透過編寫JS指令碼來動態拼接SQL,類似程式碼如下:

...

var query = "select ITEMS,USERS,sum(AMOUNT) as TOTALAMOUNT from META where ORDERDATE>=? and ORDERDATE<=?";

var user = reportContext.getParameterValue("login_user");

...

if(flag == "admin"){

        ...

        query += " group by ITEMS,USERS";  

}else if(flag == "manager"){

        ...

        query += "and ITEMS ='"+ account +"'";

        query += " group by ITEMS,USERS";

}else{

        ...

        query += " and  USERS = '" + login_user + "'";

        query += " group by ITEMS,USERS";

}

this.queryText = query;

...

這種硬編碼的方式會造成計算邏輯與展現之間耦合度過高,要麼需要大量修改報表檔案,要麼需要每個報表繼承一個公共的庫檔案,程式碼寫起來非常複雜,在報表數量、開發人數較多時,難以管理、修改和維護。

更好的方式是引入一個顯式的資料計算層,在其中提供可解釋執行的指令碼功能,把資料來源計算獨立出來(所有的業務邏輯判斷和批次資料計算都放在這一層,最後將計算結果直接返回給BIRT的DataSet進行報表展現即可)。

集算器就是這麼個資料計算中介軟體,它提供豐富的結構化資料集運算功能,可以很方便地實現批次資料計算和各類動態SQL拼接。比如上面的問題,集算器SPL程式碼則非常簡單且直觀:


A

B

1

=connect("myDB")

=sql="\"select ITEMS,USERS,sum(AMOUNT) as TOTALAMOUNT from META where ORDERDATE>=? and ORDERDATE<=?"

2

=flag=A1.query("select dept from author where userid=?",login_user).dept

3

if flag=="admin"

>B1=concat(sql,"group by ITEMS,USERS\"")

4

else if flag=="manager"

>B1=concat(sql,"and ITEMS='",A1.query("select accountid from account where find_in_set(?,limits)",login_user).accountid,“'  group by ITEMS,USERS\"")

5

else

>B1=concat(sql,"and USERS='",login_user,"' group by ITEMS,USERS\"")

6

=A1.query@x(${B1},startdate,enddate)

從上面的例子,我們看到:實現同樣演算法,SPL程式碼更短、工作量更少、除錯方便,而且還有利於整體瞭解和把握演算法。

其實還有很多情況BIRT解決動態計算問題不太方便,但有集算器SPL的輔助卻很簡單,感興趣可以參考:

集算器提供了JDBC驅動,可以很方便的與BIRT等報表工具整合, 有使用和獲得它的方法。

關於集算器安裝使用、獲得免費授權和相關技術資料,可以參見 。

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

相關文章