您好,登錄后才能下訂單哦!
這篇文章的內容主要圍繞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) |
感謝你的閱讀,相信你對“BIRT中怎么根據參數動態拼接SQL”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關知識點,可以關注億速云網站!小編會繼續為大家帶來更好的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。