寫這篇文章的目的是為象我一樣想系統(tǒng)研究報表的人做一些概念上的指導,我不會給這些概念下定義,只是盡量用自己的語言解釋得清楚些。我的文筆很差,思維也不太連貫,只能時時來BLOG記錄一些思想的火花,希望這不斷積累的星星之火能成為燎原之勢。假如讀者有任何感想,請做個簡單的評論,幫助我再碰撞出一些火花。
什么是報表
報表這個詞在日常生活中,一般是指下級向上級的數(shù)據(jù)匯報,比如,全國各地疾病控制中心或防疫站會定期向上級匯報傳染病發(fā)病和死亡情況等,類似的報表,在信息系統(tǒng)中,屬于數(shù)據(jù)采集的部分,具體來說,就是應用中增、刪、改、查中增加記錄功能。
在我們的IT系統(tǒng)里,我把報表分兩類:一是固定格式的,或者是有規(guī)范可循的,一般常見于為事業(yè)單位做的系統(tǒng)中,比如衛(wèi)生統(tǒng)計報表,人力資源、稅務系統(tǒng)的報表等;二是自由格式的統(tǒng)計分析,一般稱為統(tǒng)計分析,是由為方便用戶分析數(shù)據(jù)而開發(fā)的模塊,有的也提供給用戶自定義報表的工具。所以,以后的敘述中,我將把統(tǒng)計分析和報表混為一談,甚至任何可以用報表工具實現(xiàn)的展示,我都把它歸到報表的范疇里。
為什么要使用報表工具
有兩個原因:一是為了簡化程序員的開發(fā)工作,二是為客戶提供自定義報表功能。
據(jù)我了解,現(xiàn)在仍然有許多項目中的報表模塊沒有用第三方的報表工具來實現(xiàn),大部分是因為項目經(jīng)理還不知道可以利用現(xiàn)成的工具來節(jié)省一部分工作,但只要是接觸過報表工具的人,都會自覺地在項目中使用。因為工具會把報表的主要工作——格式、計算和輸出——都幫你做好,節(jié)省你的一些時間。而沒使用工具之前,報表的格式,假如是頁面上的話,會用HTML的<TABLE>標簽來做,計算會寫到數(shù)據(jù)庫的存儲過程里或業(yè)務邏輯代碼里,而輸出則是用iText、POI之類的庫來完成。
其實,報表工具并不如想象得那么萬能,一旦碰上復雜的表樣和復雜的計算,做起來并不輕松,甚至由于工具本身的限制,根本無法完全實現(xiàn)需求。這時,只能去說服客戶更改需求、換其他工具或改回到手工實現(xiàn)。好在這么變態(tài)的報表并不是總有機會碰得到,只要你肯動腦筋,大部分都可以解決。
打印
說報表,不能不提到打印。我目前總結出來的解決方案有三種:一是用瀏覽器的打印功能,雖然這是一直被唾棄的方式,但對于不考慮分頁和不是超寬超長的報表,還是可以去嘗試說服客戶接受的,更何況,假如你的應用只考慮IE的話,可以用腳本去調(diào)用一些IE功能來實現(xiàn)比較完美的打??;二是用Applet,雖然有點不怎么流行Applet了,又有一點安全方面的小影響,但你可以在程序里完全控制打??;三是輸出為其他格式,如PDF,XLS等,用已安裝在客戶端機器的插件來打印,現(xiàn)在的報表工具一般都是可以輸出這樣的格式。另外,有的報表工具在服務器端提供打印支持,這種方式似乎并不是我們想要的。
“中國式”報表
這大概是近來才發(fā)展起來的一個詞,其中包含了許多的無奈和憤怒以及對中國特色的無處不在的感慨:-)
概括起來,中國式報表一般是指表頭復雜的表格式報表,這種表格的列頭(表格上端)和行頭(表格左端)會分成多個層次,而且還帶有大量的總計和小計的計算,樣式的復雜導致了計算的復雜,因此做起來異常困難。這類報表的格式一般都來自某種強制性的規(guī)范的,比如國家某些部委的統(tǒng)計報表標準等。造成這種復雜格式的原因,一是為了統(tǒng)計分析方便,最大限度地展示數(shù)據(jù),二是因為以前MS-Excel普及使用的結果。所以一些類Excel的報表工具被宣傳為最適合做中國式報表。也曾聽人說過,中國式報表大部分是交叉表,我同意。而且我進一步分析發(fā)現(xiàn),許多這樣所謂的交叉表,其實行或列的擴展范圍是有限的,也就是說,有可能做成固定數(shù)目行或列,固定好行列后,為每個單元格做不同的計算,這樣一來,又是Excel的長項了。
報表中計算的處理
報表中除了格式讓人頭疼外,計算也是挺麻煩的。簡單的一些匯總統(tǒng)計,報表工具會支持。但對于一個數(shù)據(jù)庫表中全是基礎數(shù)據(jù),而統(tǒng)計需要關聯(lián)多個表來進行,還要根據(jù)外部條件來判斷,除了整列做匯總外,可能行涉及到其他列參與其中。說得的確很復雜,解決方案可以分為下面三種:
一是把計算放在數(shù)據(jù)庫端,寫成存儲過程或寫到視圖里,這樣的報表工具只要把記錄集拿過來顯示一下就OK了。工具的使用只是用來定義顯示和輸出的。二是把計算寫進SQL查詢,一般的工具只能支持一條SELECT語句(通過子報表可以支持多個SELECT),要把復雜的計算寫出來,很考驗SQL的功底,這樣做,雖然可以避免把邏輯寫到數(shù)據(jù)庫里,移植性好點,但工具仍舊只是用來顯示和輸出的。三是完全用工具來實現(xiàn),一般的工具都提供腳本編程的功能,做到對復雜計算的最靈活的控制。