實際系統由于歷史設計的緣由,業務數據有時沒法直接滿足報表需求,從而需要在報表中補足數據,以滿足報表展現需要。像http://bbs.csdn.net/topics/100074605中提到的問題,就是1個比較典型的此類需求。
這類問題使用SQL或存儲進程常常復雜度太高,如帖子中貼出的答案;而使用1般報表工具則需要不斷地重復遍歷進行數據關聯,還要借助隱藏格和做大量的條件判斷才能完成,實現難度和報表性能都不理想。
潤乾集算報表則在完成這類報表時則比較簡單,這里以上述鏈接中的實際業務為例,給出集算報表的實現方案。
源數據以下:
現需要在報表中顯示以下內容:
這里需要將源數據中沒有的日期補齊,并設置CLICKS值為0。
這個報表的難點在于用SQL或存儲進程寫起來很困難,而1般報表工具則不具有數據源計算能力,實現上也很困難。像潤乾報表這樣比較優秀的報表工具在實現上會是這樣:
潤乾報表在實現時,需要借助隱藏行(第1行)和隱藏列(A、B),還要使用ds1.select(SID,,DATE==B3)不斷循環數據集尋覓匹配記錄,最后通過量個單元格的顯示值表達式控制顯示效果,報表復雜度較高且性能較差,對其他報表工具將更加困難。
如果事前把數據計算準備好,報表工具只需要負責顯現和簡單計算,進程就會更輕松。但不管是使用復雜SQL、存儲進程和自定義JAVA數據集編程,對這樣的復雜運算(實際情況常常比這個例子更麻煩很多)都是1件工作量很大的事情,而且難以保護。
集算報表本身內置了合適結構化計算的腳本,可以方便地寫出數據準備的計算(相當于1種更使用更簡單的自定義數據集)。上述報表需求使用集算報表可以這樣完成:
首先使用集算腳本編輯器,新建集算腳本,設置腳本參數:起始日期和結束日期
編寫腳本完成數據補齊操作,為報表輸出計算后結果集。
A1:讀取明細數據,這里將數據存儲在TXT中,也能夠存儲在數據庫;
A2-A3:取SID和SNAME值,用于數據補齊時填充字段值;
A4:獲得開始到結束日期所有日期集合;
A5:與明細數據中的日期集合做交集,得到需要補齊的日期集合。
A6-B6:循環A5得到的日期集合,將生成的記錄插入A1集合中,補齊數據。
A7:依照起止日期從A1集合中取出符合條件的記錄,并按日期排序。
A8:為報表返回結果集。
使用集算報表編輯器,編輯報表模板,用于數據展現。首先新建參數,并設置默許值。
新建報表并設置集算器數據集,調用上述編輯好的腳本文件。
其中,dfx文件路徑既可以是絕對路徑,也能夠是相對路徑,相對路徑是相對選項中配置的dfx主目錄的;參數b_date和e_date為報表模板參數,begin和end為腳本參數,事實上2者可以同名。
編輯報表表達式,直接使用集算腳本返回的結果集,完成報表制作,不再需要使用隱藏行列和顯示值判斷表達式。
報表展現結果以下:
可以看到,使用集算器腳本可以快速完為報表補齊數據。而且外置的集算腳本具有可視化的編輯調試環境,編輯好的腳本還可以復用(被其他報表或程序調用)。不過,如果腳本已調試好,而且不需要復用的時候,要保護兩個文件(集算腳本和報表模板)的1致性會比較麻煩,這時候候直接使用集算報表的腳本數據集就比較簡單了。
在腳本數據集中可以分步編寫腳本完成計算任務,語法與集算器1致,還可以直接使用報表定義好的數據源和參數。
1.在數據集設置窗口中點擊“增加”按鈕,彈出數據集類型對話框,選擇“腳本數據集”;
2.在彈出的腳本數據集編輯窗口中編寫腳本;
這里可以看到,在腳本數據集中直接使用了報表中定義好參數b_date和e_date,比起單獨的集算腳本更加簡單、直接。
3. 報表模板和表達式與使用集算器數據集方式1致,不再贅述。