birt修正sql
2152 ワード
birtを使用したことのある学生は、birtが異なるパラメータを入力することで、クエリーする条件を選択できることを知っています.birtのwhereの後で、パラメータを介して入力する必要があるクエリーの条件を?に設定できることを知っています.これにより、異なる値が入力されると、その値は?取り替える.簡単に言えば、これは?正規表現で置換する必要があるものと似ています.例えばtable_A、中のフィールドにはname、age、gender、salary、titleがあります.たとえばgenderが異なる値の場合に対応するデータの個数をクエリーしたいです.パラメータを設定することができます.その値は「male」と「female」で、入力されたパラメータによって私たちが望む結果に値するようにします.このsql文はこのように書くことができます.
しかし、条件をパラメータとして最終的なsql文に伝達したいだけでなく、talbeをパラメータとして伝達したい場合もあります.その時、sql文は伝達されたtable名に基づいて、私たちが望む結果を出力します.最初、私が直接table名を使おうと思ったの?置き換えたかどうかは、次のようになります.
まずdataSetを開き、次にScriptページを開きます.ページ左上のScript:ドロップダウンメニューの「beforeOpen」を選択します.
select * from table_A where gender = ?
しかし、条件をパラメータとして最終的なsql文に伝達したいだけでなく、talbeをパラメータとして伝達したい場合もあります.その時、sql文は伝達されたtable名に基づいて、私たちが望む結果を出力します.最初、私が直接table名を使おうと思ったの?置き換えたかどうかは、次のようになります.
select * from ? where gender = "male"
birtは直接報告を間違えたので、このように簡単にsql文に条件を伝える方法を直接無理に適用することはできないようです.では、私は確かにこのような需要を持っています.いったいどうやって実現すればいいのでしょうか.私自身は解決方法を考えていないので、牛人に聞いてみました.彼は彼の解決方法を提供しました.ここでは、この牛人の実現方法を紹介し、参考にして勉強します.まずdataSetを開き、次にScriptページを開きます.ページ左上のScript:ドロップダウンメニューの「beforeOpen」を選択します.
//save current query as a template
queryTemplate = this.queryText
//clear the query
this.queryText = ""
//rebuild the query
for ( i = 0; i < params["p_plat_arch"].value.length; i++){
if ( i > 0 ){
this.queryText += "UNION
"
}
platArch = params["p_plat_arch"].value[i]
thisQuery = queryTemplate.replaceAll("c64_beagle", platArch)
thisQuery = thisQuery.replaceAll("test_case_name\\ \\=\\ \\'::NONE'", "test_case_name = '"+params["p_testcase"]+"'")
this.queryText += thisQuery.replaceAll("c64_beagle_fft_bench_test",platArch+"_"+params["p_algorithm"]+"_bench_test")+"
"
}
reportContext.setPersistentGlobalVariable("SQLDEBUG",this.queryText);
のqueryは次のとおりです.SELECT
avg_value,
min_value,
max_value,
test_case_name,
changelist,
'c64_beagle' as platform_arch
FROM
c64_beagle_fft_bench_test
WHERE
test_case_name = '::NONE'
簡単に言えば、sql文を実行する前に、c 64_をbeagle_fft_bench_testのテーブル置換先:platArch+""+params["p_algorighm"]+"_bench_test")+"".