集算器協助報表計算的例子很多,但大多數計算困難都發生在數據進入報表工具之前,如上面列舉的文本計算和SQL協助中就有許多案例是針對報表開發的。除此之外,還有些復雜計算是發生在報表工具環節內,以及某些並非由於計算困難導致但可以用數據源計算來解決的報表難題。這裡我們來討論集算器在這些場合下對報表工具的協助作用。
動態數據源
報表工具中某個報表使用到的數據源通常是確定的,報表的參數通常只用於數據集的選出條件(即SQL的WHERE部分)而不會用來選擇數據源,如果我們希望某個報表使用的數據源是由參數決定的,這對於大多數報表工具來講都能直接做到,一般都需要采用報表工具提供的API編程才行,非常繁瑣。
如果采用集算器就非常簡單。可將集算器作為報表的固定數據源,然後在集算腳本中再根據參數再決定連接實際的數據源取數據返回。
A
1
=${pds}.query("select * from T where F=?",pF)
數據源名稱用參數pds進來,報表工具本身不必支持動態多數據源了。
類似地,有些報表工具要求主子報表必須用同一個數據源,當需要主子報表用不同數據源時,也可以采用這個辦法,把集算器作為主子報表的共同數據源,而實際數據源在集算腳本中根據參數決定。
動態數據集
報表工具中,報表參數通常會用作數據集選出條件的參數,也就是SQL的參數。但有時我們需要替換SQL的一部分而不能只用參數,比如整個WHERE部分是作為參數傳入的,這樣可能獲得更靈活的查詢條件。
某些報表工具支持宏,可以做到這一點。對於不支持宏的報表工具,就只能再使用報表工具提供的API用代碼去改寫報表模板的數據集定義,相當繁瑣。用集算器就很簡單:
A
1
="select * from T" + if(where!=""," where "+where,"")
拼上where,空則不拼
2
=db.query(A1)
即使支持宏的報表工具,有些SQL也不易拼出。比如希望按傳入的字段列表做合計,就要在這些字段上拼加sum(),而報表工具通常沒有直接變換串的手段,又必須使用API去處理,或者在上層事先拼好。這時用集算器也都很容易處理。
A
1
=sums.array().("sum("+~+") as "+~).string()
把a,b變成sum(a) as a,sum(b) as b
2
=db.query("select G,"+A1+" from T group by G")
取數限制
由於容量有量,我們要求報表最多取出10000行數據,如果沒有取完要再補一行標記有“繼續”的記錄,這樣可以顯示出數據是否完整。但報表工具通常只能執行確定的取數語句,這種靈活控制又需要復雜代碼調用API來實現。
集算器用代碼控制這個過程很輕松:
A
B
1
=db.cursor("select * from T")
=A1.fetch(1000)
2
if A1.fetch@0(1)
>B1.insert(0,"繼續")
未完成則插入標記
3
>A1.close()
return B1