大多數情況下,FineReport直接在設計器裡使用“資料集查詢”,直接寫SQL就能滿足報表要求,但對于一些複雜的報表,有時候SQL處理并不友善,這時可以把查詢結果在應用層做一些預處理後,再傳遞給報表,即所謂的“程式資料集”,FineReport的幫助文檔上給了一個示例:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
View Code
這個示例我個人覺得有二個地方不太友善:
1、db連接配接串寫死寫死在代碼裡,維護起來不太友善,目前大多數b/s應用,對于資料庫連接配接,通常是利用spring在xml裡配置datasource bean,運作時動态注入
2、将查詢出的結果,填充到資料集時,采用的是數字索引(見82行),代碼雖然簡潔,但是可讀性比較差
折騰一番後,于是便有了下面的改進版本:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
改進的地方:
1、getConnection方法,利用Spring注入datasource,當然為了注入友善,還需要一個輔助類AppContext
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
classes/spring/root-context.xml 裡配置db連接配接
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
2、将原來的數組,換成了LinkedHashSet<LinkedHashMap<String, Object>>,這樣db查詢結果填充到"資料集"時,處理代碼的可讀性就多好了(見queryData方法),但也要注意到LinkedHashSet/LinkedHashMap的性能較Array而言,有所下降,正所謂:有所得必有得失。但對于複雜的彙總統計報表,展示的資料通常不會太多,是以這個問題我個人看來并不嚴重。