2010-07-29 54 views
1

我有這個Birt報表,我從另一個開發人員繼承,由主表中的子表組成。對於主表中的每一行,子表列出屬於當前主行項目的項目。Birt中的聚合子表值

兩個表是從不同的數據集進給時,子表數據集採取指示主項,它的子項來獲取的參數。

現在,我需要做的是一個SUM聚合添加到主表的底部,顯示了子表中的某個字段的總(所有主項目)。

考慮,例如,下面的數據:

MasterItem1 
      ChildItem1 SomeValue 
      ChildItem2 SomeValue 
      ChildItem3 SomeValue 
MasterItem2 
      ChildItem1 SomeValue 
      ChildItem2 SomeValue 
      ChildItem3 SomeValue 
-------------------------------- 
         Total 

(爲什麼不是這個,而不是用做分組簡短的回答:其實有子表到每個主排,含有不同數字和字段的類型,所以以前的開發人員可能沒有找到一種方法來完成這與分組。)

起初我想我可以簡單地添加另一個子表內的總計字段,總計合計來自子數據集的值。然而,這不起作用,因爲子數據集需要一個參數來指示其子級要獲取的主項目,所以無法立即從子數據集獲取所有值。

我想有可能是創建一個直接引用在子表中的字段someValue中的表達方式,而不是通過子數據集去。

任何建議是大大讚賞。

回答

2

感謝馬克和Mystik,你的回答讓我走上了正確的道路!

我的最終解決方案如下:

1)聲明求和變量在該報告的初始化方法:

var total = 0; 

2)每行的值添加到在總和可變包含以下值的數據字段的onReder方法:

total += parseInt(this.getValue()); 

3)使用sum-variable作爲總字段中的表達式。

工程就像一個魅力。


更新: 發現在我的解決方案中的錯誤:最後一行被冷落的總和。我認爲表格頁腳中的總單元格的值在之前被定義爲,最後一行已被渲染。

修正:

  1. 移動離開的OnRender方法求和代碼的onCreate
  2. 添加以下代碼與總細胞的方法的OnRender:

    this.setDisplayValue(總);

3

應該可以在報告的開頭聲明一個全局變量,然後在報告的末尾子錶行事件和其輸出的一個每個子值添加到它 - 如果你」重新編寫JavaScript,這可能是最快捷的解決方案。

如果你不舒適編寫JavaScript(我不是),或者如果上述技術不工作了,你可以嘗試兩種:

  • 創建第三數據集,結合從與來自子報表和在一個新的數據表中的總或
  • 經由聯合組合兩個現有的子數據值表輸出(因此孩子數據的主要報告中的主數據的項目,如果主表是甲,主子表是B,子報表是C,你有AB union AC),取代子表eport表和現有的詳細信息行,其中新的詳細信息行以子行類型爲條件,總計在報告結尾處基於AC值。

顯然,後面的這些方法更復雜 - 但我認爲應該更容易理解和維護。

3

全局變量是要走的路。對於子表中的每一行,將所需的值添加到全局變量,然後訪問它以在表格的底部顯示。沒有任何困難的JavaScript:

var Sum = reportContext.getPersistentGlobalVariable("RunningAggregate"); 
Sum = Sum + row["column Name"]; 
reportContext.setPersistentGlobalVariable("RunningAggregate", Sum); 

然後,您可以通過動態文本項訪問表格頁腳中的全局變量。

祝你好運!