在Birt中動態插入子表欄位,birt動態插入欄位
庫表dColThread是主表,主鍵是tID。dColQuestion是子表,外鍵是tID,如下:
dColThread
dColQuestion
報表需要根據ApplicationName查詢主表並以列表的形式展現資料。主表每條記錄對應的status欄位值有多個,但不超過5個,需要橫向插入主表的Phone、Decline欄位之間,依次命名為QuestionNo1、QuestionNo2…QuestionNo5。如果某列資料都為空白,則這一列不顯示。表樣形如:
用集算器準備資料,代碼如下:
A1:執行SQL,取出主子表關聯資料。arg1是來自報表參數。假如arg1=”mfc”,則A1的計算結果如下:
A2:按照tID分組,每組是一條主表記錄及其對應的子表記錄,如:
A3:按照報表中列表的結構建立空二維表。
A4:迴圈A2中的組,每次向A3插入一條記錄。迴圈體中可用A4引用迴圈變數,用#A4來引用迴圈計數。
B4:取當前組中status的欄位值,並補足至少5條記錄。
B5:向A3追加新記錄。迴圈結束後A3如下:
A6:返回結果給報表。集算器對外提供JDBC介面,報表工具會將集算器識別為普通資料庫。
然後用BIRT設計list表,模板如下:
如果QuestionNo列為空白則應當隱藏。動態隱藏的方法有很多,這裡介紹其中一種。對於QuestionNo5(其他列類似),可以先在dataSet的onFetch方法中使用如下指令碼:
if(reportContext.getGlobalVariable("t5")==null){ reportContext.setGlobalVariable("t5",row.QuestionNo5)}else{ reportContext.setGlobalVariable("t5",reportContext.getGlobalVariable("t5")+row.QuestionNo5)
再在QustionNo5列的Visibility屬性中使用如下運算式:BirtStr.trim(reportContext.getGlobalVariable("t5"))==""
預覽後可以看到報表結果:
報表調用集算器的方法和調用預存程序一樣,比如將本指令碼儲存為dColMiddle.dfx,則在BIRT的預存程序設計器中可以用call dColMiddle.dfx(?)來調用。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。