複雜報表複雜在哪?

  報表開發者總會遇到一些較爲複雜的報表,這類報表的數目通常很少,但花費的開發時間卻很多,有時候還會變成疑難問題。本文將討論這些複雜報表到底複雜在哪方面,以及該用什麼方法去解決,希望對提高報表的開發效率有所幫助。

  以前的複雜報表主要複雜在前端:

n  單元格合併,斜線表頭。

n  字體風格根據數據大小發生變化。

n  任意單元格之間的計算。比如針對幾條特殊的明細數據,計算它們和彙總值的比例。

n  片區之間有規律的計算。比如橫向表頭是產品分類,縱向表頭由兩種分組拼成:三層機構分組、單層年度分組,交叉處要顯示某類產品在不同分組中的銷售額。

n  不規則分組。比如按照州、州府間隔顯示各州的產品銷量(總計時不能重複計算州府的銷量)。

  

  報表工具經過十年的發展,上述前端難題大都已經得到了妥善的解決,比如Style ReportRunqian ReportQlikViewTableau,它們各自用不同的方法解決了上述難題。


  現在的報表主要複雜在後端,即數據源的計算。

n  複雜的業務邏輯。比如:找出連續三個月銷售額增長超過10%的銷售人員,展示他們的銷售額和銷量。再比如:找出購買過參數列表中所有itemCustomer,展示這些Customer的帳戶餘額。

n  跨庫計算。比如:某企業要根據績效和基本工資覈算不同工種員工的實際工資,基本工資存儲在財務管理軟件的MSSQL數據庫中,而績效分數存儲在績效考覈系統的Oracle數據庫中,請將績效分數轉化爲工資數額並呈現在報表中。再比如:某連鎖商場各門店都有自己的數據庫,總部需要用報表來呈現這些數據的彙總結果。

n  非數據庫數據源的計算。比如:根據Excel中的數據,從多隻股票中選出連續上漲5天的股票。再比如:根據日誌中的數據,展示出指定時間段內每個用戶對每種產品的關注時間。

n  多源合併爲單源。比如,BIRTCrystal ReportJapserReport等報表工具對多數據庫支持不夠方便,經常需要編寫用戶自定義數據源將多源合併爲單源。

   

   常見的報表工具只負責將取到的數據呈現出來,不涉及後端數據的生成,報表開發者必須自己想辦法解決上述問題,因此報表後端的複雜性一直是困擾報表開發者的最大障礙,也是複雜報表之所以顯得複雜的主因。同時,現代報表講究簡潔易讀,用戶對複雜樣式的要求在逐漸降低,而對數據本身的關注程度更高,複雜報表的重點早已從前端呈現轉移到後端數據源。事實上,前端的複雜性也大多可以通過後端來解決,比如片區之間有規律的計算、不規則分組,這就使報表數據源的計算更加重要。

 

   解決報表中複雜的數據源計算,可以採用SQL\SP,中間數據庫、自定義數據源等三種方式。

   

   SQL\SP理論上可以解決複雜的業務邏輯,但一方面僅限於單數據庫的情況,對於其他情況無能爲力,比如:非數據庫數據源、跨庫計算、多源合併爲單源。另一方面,複雜業務邏輯並非普通的報表開發者就能輕易實現,往往需要調配更加資深的程序員。由此可見,SQL\SP能解決的問題有限,對人員的要求較高,不足之處非常明顯。

   

   中間數據庫可以用來實現跨庫計算,即把異種數據庫的數據加載到同一個數據庫,再用報表工具來訪問中間數據庫中的統一視圖。中間數據庫一般需要單獨配置,會增加額外的成本負擔。另外,中間數據庫有一個加載的過程,實時性比較差。如果想實現增量實時加載,就需要建立調度任務或在源庫中添加觸發器和時間戳,並書寫較爲複雜的數據加載腳本,顯然,額外的開發工作量會顯著增加。不僅如此,很多商業軟件的數據庫是不允許擅自修改的,無法添加觸發器和時間戳,性能的提升也就無從談起。由此可見,中間數據庫的不足之處是成本高、開發工作量大、實時性和性能得不到保障。


  非數據庫數據源的計算也可以採用中間數據庫的辦法,優缺點也大致相同,區別主要在實時性和成本上。首先,非數據庫數據源難以增加觸發器和時間戳,無法實現實時計算。其次,很多非數據庫數據源的數據量較大,會佔用寶貴的數據庫存儲空間,成本更高。比如前面根據日誌數據計算關注時間的例子,商業網站每天的日誌都有幾千萬條,一年的數據可能就有幾個TB之多,中間數據庫不得不面臨頻繁升級之苦。大數據量還會對性能產生較大的影響,要想提升數據庫的性能,就要採用並行數據庫,成本非常昂貴。


  自定義數據源是大部分報表工具都會提供的接口,解決多源合併爲單源的問題比較方便,其中最常見的是用戶自定義Java Bean。用戶自定義Java Bean允許開發者用高級語言將異構數據庫、異種數據源、半結構化數據源的數據合併爲單一數據源,優點是靈活自由無所不能,但缺點也同樣明顯。和SQL/esProc/R這類專業的數據計算語言不同,JAVA等高級語言缺乏結構化計算函數,開發者首先要實現過濾、分組、彙總、排名、排序、唯一值、關聯算法等大量的底層函數才能進行計算,開發工作量巨大。對於一般甚至是較爲簡單的算法來說,用高級語言實現都極爲困難。

R語言也可以用作自定義數據源。它的優點是庫函數豐富,可以進行混合計算,缺點是沒有JDBC接口,在性能和穩定性也較差,所以實踐中很少有人用它來解決報表數據源中的複雜計算。


潤乾公司開發的集算報表不僅可以很好的實現報表的複雜展現問題,也可以很好的完成報表中複雜的數據源計算任務。

集算報表內置了編程語言集算器esProc,是自定義數據源編程的利器。和SQL類似,集算報表的esProc是專業的數據計算語言,具有豐富的結構化數據計算函數,所以可以輕鬆解決第一類難題:複雜的業務邏輯。和R語言類似,集算報表通過esProc可以直接進行數據庫、文本文件、Excel、半結構化數據的混合計算,無需中間庫暫存,因此能夠實現高性能低成本的跨庫計算和非數據庫數據源計算。esProc面向應用開發者,語法簡單,代碼易於書寫,交互性強,調試功能完善,因此對開發者的技術要求較低。集算報表可以通過jdbc方式調用esProc,也可以通過定義“集算器數據集”來直接調用。集算報表內置esProc單機並行計算引擎,可以將充分利用多CPU或者多CPU核的計算資源,性能表現優異。

下面舉例說明集算報表自定義數據源編程的方法,比如前面跨庫計算中的例子“根據績效分覈算實際工資”。

wKiom1VQQbeSbrrpAAHphPWFsjk182.jpg

l  跨庫的關聯計算:A5

l  複雜的業務邏輯:A6-C9

l  結構化數據計算函數:A4A10-A13

l  返回輸出結果:A14

集算報表調用這個集算器程序的配置如下:

wKioL1VQQ1aD7Dp_AAEk55npO-4123.jpg

 上圖中ds1接收esProc返回的結果集,test.dfxesProc的程序文件名。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章