大家先看如下的一張表格:
給你一個數據庫,所有數據都在這個庫里,大家覺得這樣的報表如何生成。
另外:
1.橫向時間是可以變化的,比如還想統計2009年,2010年的數據,縱向種類也不會只有這么多,比如大類中還有配件、贊助。這樣又如何擴展?
2.我覺得時間最小跨度是一個季度,鞋子、服裝還不是最小分類,現在我想知道鞋子、服裝每一個月每一個款式的銷售情況有這樣的報表又是如何生成?
3.我希望表格中每一個季度能做一個統計,比如我想知道鞋子在每一個季度的銷售情況。
4.這些我覺得還不夠直觀,我希望能夠生成我希望依據這張表生成一個統計圖片,餅圖,柱狀圖,曲線圖等等。
下面我們來一次報表設計遐想,因為我確實沒有做過這個東西,但是遇到、用過卻有好多次,主流的軟件平台都有這樣的一個模塊。這次公司遇到一個項目,報表非常多,我們這邊技術不夠,外包給了學校的一個研究生導師,他們討論過幾次,於是我對其思路有了一點明白,於
是整理了一下思路,為網絡知識做一點貢獻。
這樣的一個報表設計思路分為四個部分
核心原理
這樣一個設計器核心原理就是元數據定義,我們以第一張表格為例,我們可以將其分解成6個元數據:
第一個元數據:年份數據定義
第二個元數據:季度數據定義
第三個元數據:鞋、服裝數據定義
第四個元數據:鞋、服裝的子類定義
第五個元數據:銷售量數據采集方式的定義
第六個元數據:銷售量數據總和采集方式的定義
第五、六個又是關鍵點,如下圖
不知道大家發現沒有,每一個銷售數據都是一個橫縱向條件的交叉點。說到這里,大家應就基本明白了,以上表格的所有銷售數據不是像過去批量生成的,而是按照橫縱向條件生成的,也就是說有多少個數據,就會有多少次查詢數據庫。
參數定義
就如第一個問題,我們知道,報表是有擴展條件的,也就是我們sql語句的where部分,而參數定義就是負責這部分的,也就是我們常說的查詢條件。但我們不能像寫sql語句那樣設計,何況它也可能是一種靜態數據(比如我們說的月份就不需要從數據庫里獲取)。
我的設計是這樣的:
查詢條件ID、查詢條件名稱、數據類型(String、Number、Date)、顯示方式(Text、Select、CheckBox、Radio)、描述到這里第一步已經算是完成了,下面我們開始第二步
元數據定義
上面的核心原理已經講解了定義元數據的用處,並了解到元素數據其實本身也是一個數據集,這里我們應該想想到底怎么定義元數據。
我的設計是這樣的:
元素據實例名,元數據名稱、元數據類型(計算、靜態、sql)、元數據內容(實體數據、sql)、元數據映射字段、元數據描述
其中元數據映射字段是指元數據數據集字段對應的數據庫字段,設計是這樣的:
元數據字段名、元數據類型、數據庫字段名、數據庫字段類型、描述
下面是一個示例
有了這些東西我們就回答了上面提到的第2個和第3個問題。下面就看我們是如何顯示的:
根據以上已經有的信息我們似乎可以定義出最簡單的報表模板,假設我元數據是這樣定義六組元數據:
元數據一:年份元數據、年份、sql、select date from sales group by date、映射字段(date、date、date、date、date描述)、year描述
元數據二:季度元數據、季度、靜態、第一季度,第二季度,第三季度,第四季度、映射字段(Quarter,String,null,null,描述)
元數據三:大類元數據、鞋服大類、sql、select categories from sales where categorietype=1 group by categories、映射字段(大類、string、categories、string、子類描述)
元數據四:子類元數據、鞋服子類、sql|、select categories from sales where categorietype=2 group by categories、映射字段(子類、string、categories、string、子類描述)
元數據五:銷售數據元數據、銷售數據、sql、select saledate from sales、映射字段(銷售數據、number、saledate、number、銷售數據描述)
元數據六:總計元數據、總計、計算、銷售數據元數據. 銷售數據、映射字段(總計,number,null,null,總計描述)
至此元數據已經定義成功,下面可以看我我們設計的報表模板了:
描繪表格的過程是由外向里的,永遠都是外面的信息決定里面單元格的拆分情況。理論實現了,技術思路我相信每一個程序員都有自己一定的方法,這里就不在深入討論了,也不是本博文所想要描述的。
選擇組件
組件選擇大概分為兩種:表格、圖表。
表格就不用我多說了吧,只是這種生成報表的方式比較損耗資源,因為表格中每一個數據都要進行一次數據查詢,這樣對於簡單的二維表無疑是一場災難,所以報表設計器一般會將簡單表和復雜表分開,以達到資源的高效利用。
關於圖表的實現方法也表格實現也是異曲同工,你可以使用微軟的圖表組建chat,根據元數據的定義,生成幾個數據緩存,然后依次將數據信息存入到各個圖表對象的屬性中去,關於圖表組件的使用這里也不將描述。
這樣也就回答了第4個問題。
生成報表
我們籠統的可以把報表分成兩個部分:表格和組件,上面的兩個段落都有涉及到,也提供了基本的技術思路。
總結
這樣的東西還僅僅是一個技術原型,但我可以肯定其思路是可行的。在現實情況下,我們還需要考慮很多東西,比如表格樣式、執行效率等等。因為web方式不能很好為報表設計階段提供很好的支持,所以這樣的一個報表設計器必然是以windows形式出現,報表設計完成以后生成一個xml文件,以提供web解析生成我們所需要的報表。由於未經公司允許,我暫不把此次外包的設計器圖樣公布出來,希望大家理解。