2007年5月14日 星期一

BIP - dynamic grouping and calculating

一般會建議在D2K Report做Data的group與小計加總等
因為在D2K Report裡做這些事會比較簡單...
拉一拉就好了
但是...有幾個小小的缺點
1. 欠缺彈性.
D2K裡的group是固定的...以S/O銷售資料為例...
當拉了客戶別-產品-detail的group structure...
就無法輕易用於產品別-客戶-detail的group structure...
因此當有客戶別 /產品別 / 業務別 /地區別 ..各種報表...
則可能要寫四個...
但根本上的row data其實是一樣的...
2. 設定煩雜
D2K寫Data.. BIP做Template的方式...
至少都要多定義一個excutable來對應RDF檔..
承1..至少要多定義4個executable...
但如果sql只是簡單的抓row data..
則直接用data template的XML與XSD來做...
Concurrent program直接call XDODTEXE這支JCP就好了

因此..
當報表會因不同group條件而分支出多個子報表時
不妨用Data template抓row data...然而直接在RTF template上做動態的分組和加總就好

以下為幾個常用的技巧
假設資料為
<ROW>
<AAA> ... </AAA>
<BBB> ... </BBB>
<CCC> ... </CCC>
</ROW>
的架構
1. Dynamic Grouping
一般用 <?for-each?> ~ <?end for-each?> 只能抓取row data
需要用 <?for-each-group:ROW;AAA?> ~ <?end for-each-group?>
則可以對每一個不同的AAA做分組...

而對於分組內資料的取用..
則使用 <?for-each:current-group()?> ~ <?end for-each?>

假設要做巢式分組...AAA的組內還要依BBB再分
則這麼寫
------- <?for-each-group:ROW;AAA?>
---------------<?for-each-group:current-group();BBB?>
--------------------- <?for-each:current-group()?>
-----------------------------do some thing in current-group
--------------------- <?end for-each?>
---------------<?end for-each-group?>
------- <?end for-each-group?>


2. Group Calculating
在分組小計的時後
特別要注意的是...目前在第幾層
而原本的資料欄位都在ROW這一層
-------<?for-each-group:ROW;AAA?>
---------------<?for-each-group:current-group();BBB?>
--------------------- <?for-each:current-group()?>
-----------------------------do some thing in current-group
-----------------------------<?sum(current-group()//CCC)?> 加總AAA-BBB組內的CCC
--------------------- <?end for-each?>
---------------<?end for-each-group?>
---------------<?sum(current-group()/CCC)?> 加總AAA組內的CCC
------- <?end for-each-group?>

3. Powerful and Flexible-Variables
透過定義變數
<?xdoxslt:set_variable($_XDOCTX,'VAR_NM',VAR_Val)?>
指定變數
<?xdoxslt:set_variable($_XDOCTX,'VAR_NM',VAR_Val)?>
和呼叫變數
<?xdoxslt:get_variable($_XDOCTX,'VAR_NM')?>
可以輕易的做 grant total總計等運算

加上if等條件判斷式
也可以做條件換頁等動作

4. Page Break
一般而言
還是用<xsl:if xdofo:ctx="inblock" test="1=1"><xsl:attribute name="break-before">page</xsl:attribute></xsl:if>的語法就可以了

沒有留言: