Eclipse Birt可以使用sql query來(lái)創(chuàng)建數(shù)據(jù)集,通過(guò)在報(bào)表中設(shè)置參數(shù)(Parameter)來(lái)傳遞客戶端的用戶輸入,同時(shí)可以設(shè)置data set參數(shù)并且與報(bào)表參數(shù)關(guān)聯(lián)(這兩個(gè)參數(shù)是不同的),這樣可以將客戶端的用戶輸入傳遞給data set的參數(shù)供sql query的where語(yǔ)句使用,這是通常的創(chuàng)建sql語(yǔ)句的做法,但是種方法只適合固定的sql語(yǔ)句,對(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語(yǔ)句就變成這樣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 = '李'就合理了,把所有姓李的人不分男女都查出來(lái),這就需要使用動(dòng)態(tài)sql語(yǔ)句了,方法有兩種: 一、date set編輯器中有property binging的屬性,可以在右邊的query text框中設(shè)輸入sql語(yǔ)句,或者用expression生成器輔助生成sql語(yǔ)句,上面的例子用種方法應(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編輯器里是沒(méi)有辦法像通常那樣預(yù)覽的 而第二種方法是寫在data set的beforeOpen中的,所以在打開data set之前會(huì)創(chuàng)建data set因此可以像通常那樣預(yù)覽數(shù)據(jù)集結(jié)果等等 第一種方法中用param["sex"].value獲得Sex參數(shù)值,而第二種方法需要利用reportContext來(lái)獲取Sex參數(shù)的值 另外需要注意的是在拼湊sql時(shí)要細(xì)心,例如如果參數(shù)是String類型時(shí)前后一定要加上一對(duì)''(具體的取決于所使用的數(shù)據(jù)庫(kù),筆者使用的是 oracle)
|
|