在主表中動態插入子表字段

   庫表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(?)來調用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章