大家先看如下的一張**:
給你乙個資料庫,所有資料都在這個庫里,大家覺得這樣的報表如何生成。
另外:1.橫向時間是可以變化的,比如還想統計2023年,2023年的資料,縱向種類也不會只有這麼多,比如大類中還有配件、贊助。
這樣又如何擴充套件?
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解析生成我們所需要的報表。
由於未經公司允許,我暫不把此次外包的設計器圖樣公布出來,希望大家理解。
演算法題之遐想
b 今天一同事問到了這個題目,想了乙個演算法,記錄以作備忘 b 演算法題 這是乙個排列,其中7不能放在第二個位置,6和8不能相鄰,列印所有的排列 param args author jeck218 gmail.com 2009 10 12 public static void main string...
動態列 模板 複雜報表設計之動態報表
如上圖所示,可以需選擇不同的分組維度進行資料分析,例如類別 商維度 可以通過使用者輸入的引數值進行資料動態過濾,例如傳入不同 商 類別的值進行資料查詢過濾 可以選擇要顯示的附加字段資料 同時要求顯示有排名 每個分組內的資料從大到小顯示 佔比 產品占該分組維度總訂購量的百分比 此示例使用指令碼資料集完...
動態列 模板 複雜報表設計之動態報表
如上圖所示,可以需選擇不同的分組維度進行資料分析,例如類別 商維度 可以通過使用者輸入的引數值進行資料動態過濾,例如傳入不同 商 類別的值進行資料查詢過濾 可以選擇要顯示的附加字段資料 同時要求顯示有排名 每個分組內的資料從大到小顯示 佔比 產品占該分組維度總訂購量的百分比 此示例使用指令碼資料集完...