BIRT 中如何根據引數動態拼接 SQL
BIRT可以使用sql query來建立資料集,透過在報表中設定引數(Parameter)來傳遞客戶端的使用者輸入,同時可以設定Dataset引數並且與報表引數關聯(這兩個引數是不同的),這樣可以將客戶端的使用者輸入傳遞給Dataset的引數供sql query的where語句使用,這是通常的建立sql語句的做法,但是這種方法只適合固定的sql語句,對於拼接動態的sql就不適用了。
比如要處理這麼個場景:根據傳入的使用者名稱、起止日期,分級別查詢出不同的訂單資訊。author儲存使用者部門資訊,account儲存賬目資訊(多個使用者可歸屬於一個賬目,以逗號分隔),META儲存訂單明細。示意圖如下:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- BIRT 中根據引數實現動態日期分組
- BIRT 統計圖中怎麼根據引數實現 X 軸動態分組
- Transact-SQL 示例 - 如何在拼接的動態sql內呼叫外部變數SQL變數
- Mybatis動態Sql的Foreach遍歷拼接輸入引數中的List或陣列MyBatisSQL陣列
- vue如何通過變數動態拼接urlVue變數
- 如何根據寶塔皮膚引數選擇伺服器伺服器
- SpringJpa @query 中根據傳入引數(欄位)排序Spring排序
- BIRT 如何配置動態資料來源
- perl根據函式名動態呼叫函式
- js根據引數名獲取url上的引數值JS
- vue自定義表單生成器,可根據json引數動態生成表單VueJSON
- 根據DELTA自動生成SQL語句SQL
- Oracle如何根據SQL_TEXT生成SQL_IDOracleSQL
- dev 根據datatable動態生成gridviewdevView
- 動態引數,靜態引數
- Gradle根據引數配置不同的依賴Gradle
- SQL 如何在時間序列中根據欄位變化分組SQL
- 如何在Excel中根據數量生成抽獎名單Excel
- ORACLE中帶引數、REF遊標及動態SQL例項OracleSQL
- SpringBoot中根據屬性動態註冊Spring BeanSpring BootBean
- 根據需要動態include不同的檔案 (轉)
- 繫結變數在靜態sql和動態sql中變數SQL
- 關於靜態引數和動態引數
- Oracle動態SQL引數支援複雜型別OracleSQL型別
- Laravel-admin 如何根據 select 的值實現動態 formLaravelORM
- vue+el-element中根據檔名動態建立dialog的方法Vue
- LeetCode中動態規劃題解合集(根據難易程度))LeetCode動態規劃
- 根據PID查詢 sqlSQL
- C#根據反射動態建立ShowDoc介面文字資訊C#反射
- 根據介面動態修改應用底部選單欄
- react根據json格式資料動態增加domReactJSON
- 根據條件動態更新不同表的資料
- Oracle動態、靜態引數引數修改規則Oracle
- 根據商品數量自動計算價格
- 單引號在動態SQL中的處理SQL
- freemarker根據靜態模板和動態模板生成PDF與Word
- MyBatis引數傳入集合之foreach動態sqlMyBatisSQL
- 動態引數與靜態引數的判斷、修改