溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

BIRT中怎么根據(jù)參數(shù)動(dòng)態(tài)拼接SQL

發(fā)布時(shí)間:2022-01-15 16:02:57 來源:億速云 閱讀:127 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這篇文章的內(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ì)。示意圖如下:

BIRT中怎么根據(jù)參數(shù)動(dòng)態(tài)拼接SQL

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>

向AI問一下細(xì)節(jié)

免責(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)容。

AI