Eclipse Birt可以使用sql query來創(chuàng)建數(shù)據(jù)集,通過在報(bào)表中設(shè)置參數(shù)(Parameter)來傳遞客戶端的用戶輸入,同時(shí)可以設(shè)置data set參數(shù)并且與報(bào)表參數(shù)關(guān)聯(lián)(這兩個(gè)參數(shù)是不同的),這樣可以將客戶端的用戶輸入傳遞給data set的參數(shù)供sql query的where語句使用,這是通常的創(chuàng)建sql語句的做法,但是種方法只適合固定的sql語句,對(duì)于動(dòng)態(tài)的sql就不適用了。
如有這樣一條sql query
Sql代 碼
select user.first_name firstName,user.second_name secondName,user.sex sex,user.age age,user.birth_day birthDay
from user_table user
where user.second_name = ?
and user.sex = ?
定義兩個(gè)報(bào)表參數(shù)SecondName,Sex定義兩個(gè)data set參數(shù)secondname,sex并與報(bào)表參數(shù)關(guān)聯(lián),用戶查看報(bào)表時(shí)必須要輸入姓和性別作為查詢條件,如果不輸則對(duì)應(yīng)的參數(shù)值就是null,假如查 姓李的人,性別不輸,則sql語句就變成這樣select ... from ... where user.second_name = '李' and user.sex = null 顯然這樣的sql是查不出結(jié)果的,哪有sex是null的人呢?對(duì)于這種情況應(yīng)該是如果用戶某一個(gè)參數(shù)不輸則不將它做為查詢條件,上面的sql應(yīng)該變成 select ... from ... where user.second_name = '李'就合理了,把所有姓李的人不分男女都查出來,這就需要使用動(dòng)態(tài)sql語句了,方法有兩種:
一、date set編輯器中有property binging的屬性,可以在右邊的query text框中設(shè)輸入sql語句,或者用expression生成器輔助生成sql語句,上面的例子用種方法應(yīng)該寫成
Javascript 代碼
var query = " select user.first_name firstName,user.second_name secondName,user.sex sex,user.age age,user.birth_day birthDay";
query += " from user_table user";
query += " where user.second_name = ?"
if(param["Sex"].value != null){
query += " and user.sex = '" + param["Sex"].value + "'";
}
this.text = query;
二、利用script,在data set的before open事件中
Javascript 代碼
var query = " select user.first_name firstName,user.second_name secondName,user.sex sex,user.age age,user.birth_day birthDay";
query += " from user_table user";
query += " where user.second_name = ?"
var sex = reportContext.getParameterValue("Sex");
if(sex != null){
query += " and user.sex = '" + sex + "'";
}
this.queryText = query;
這兩種方法的區(qū)別在于:第一種方法是在報(bào)表run的時(shí)候創(chuàng)建data set,因此在data set編輯器里是沒有辦法像通常那樣預(yù)覽的 而第二種方法是寫在data set的beforeOpen中的,所以在打開data set之前會(huì)創(chuàng)建data set因此可以像通常那樣預(yù)覽數(shù)據(jù)集結(jié)果等等
第一種方法中用param["sex"].value獲得Sex參數(shù)值,而第二種方法需要利用reportContext來獲取Sex參數(shù)的值
另外需要注意的是在拼湊sql時(shí)要細(xì)心,例如如果參數(shù)是String類型時(shí)前后一定要加上一對(duì)''(具體的取決于所使用的數(shù)據(jù)庫,筆者使用的是 oracle)