您好,登錄后才能下訂單哦!
這篇文章的內(nèi)容主要圍繞BIRT中怎么根據(jù)參數(shù)動(dòng)態(tài)拼接SQL進(jìn)行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!
BIRT可以使用sql query來創(chuàng)建數(shù)據(jù)集,通過在報(bào)表中設(shè)置參數(shù)(Parameter)來傳遞客戶端的用戶輸入,同時(shí)可以設(shè)置Dataset參數(shù)并且與報(bào)表參數(shù)關(guān)聯(lián)(這兩個(gè)參數(shù)是不同的),這樣可以將客戶端的用戶輸入傳遞給Dataset的參數(shù)供sql query的where語句使用,這是通常的創(chuàng)建sql語句的做法,但是這種方法只適合固定的sql語句,對(duì)于拼接動(dòng)態(tài)的sql就不適用了。
比如要處理這么個(gè)場(chǎng)景:根據(jù)傳入的用戶名、起止日期,分級(jí)別查詢出不同的訂單信息。author存儲(chǔ)用戶部門信息,account存儲(chǔ)賬目信息(多個(gè)用戶可歸屬于一個(gè)賬目,以逗號(hào)分隔),META存儲(chǔ)訂單明細(xì)。示意圖如下:
1、傳入登錄參數(shù)login_user,判斷部門級(jí)別
2、當(dāng)級(jí)別為manager,需提前獲取當(dāng)前賬目
3、當(dāng)部門為admin,統(tǒng)計(jì)所有賬目、用戶銷售額
4、當(dāng)部門為manager,統(tǒng)計(jì)當(dāng)前賬目下所屬的用戶銷售額
5、當(dāng)部門為engineer,只統(tǒng)計(jì)自己銷售額
BIRT可以通過一個(gè)間接的方式來實(shí)現(xiàn):在DataSet的Script頁簽下選擇beforeOpen事件,通過編寫JS腳本來動(dòng)態(tài)拼接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; ... |
這種硬編碼的方式會(huì)造成計(jì)算邏輯與展現(xiàn)之間耦合度過高,要么需要大量修改報(bào)表文件,要么需要每個(gè)報(bào)表繼承一個(gè)公共的庫文件,代碼寫起來非常復(fù)雜,在報(bào)表數(shù)量、開發(fā)人數(shù)較多時(shí),難以管理、修改和維護(hù)。
更好的方式是引入一個(gè)顯式的數(shù)據(jù)計(jì)算層,在其中提供可解釋執(zhí)行的腳本功能,把數(shù)據(jù)源計(jì)算獨(dú)立出來(所有的業(yè)務(wù)邏輯判斷和批量數(shù)據(jù)計(jì)算都放在這一層,最后將計(jì)算結(jié)果直接返回給BIRT的DataSet進(jìn)行報(bào)表展現(xiàn)即可)。
集算器就是這么個(gè)數(shù)據(jù)計(jì)算中間件,它提供豐富的結(jié)構(gòu)化數(shù)據(jù)集運(yùn)算功能,可以很方便地實(shí)現(xiàn)批量數(shù)據(jù)計(jì)算和各類動(dòng)態(tài)SQL拼接。比如上面的問題,集算器SPL代碼則非常簡(jiǎn)單且直觀:
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) |
感謝你的閱讀,相信你對(duì)“BIRT中怎么根據(jù)參數(shù)動(dòng)態(tài)拼接SQL”這一問題有一定的了解,快去動(dòng)手實(shí)踐吧,如果想了解更多相關(guān)知識(shí)點(diǎn),可以關(guān)注億速云網(wǎng)站!小編會(huì)繼續(xù)為大家?guī)砀玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。