標籤:報表統計 集算報表 多重判斷
報表在資料來源準備階段往往要根據實際業務進行各種判斷計算以後才能得到最終的報表資料來源,而使用SQL在這種情況下則難於編寫,http://bbs.csdn.net/topics/390938280中提到的考勤問題就是其中之一,這個計算看起來是給財務或人力部門的考勤報表格服務的。計算邏輯並不算複雜,但使用SQL卻很難做,用預存程序(要取首尾記錄)也很麻煩,而一般的報表工具由於不具備強計算能力,常常只能寫用Java等寫自訂資料來源實現。
使用潤乾集算報表來做則比較簡單,這裡以上述連結中的實際業務為例,給出集算報表的實現方案。
報表背景
來源資料如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/55/43/wKiom1SJQM_TEOHGAAEbpZpYjQU322.jpg" style="float:none;" title="report5_statiscal_judgement_1.jpg" alt="wKiom1SJQM_TEOHGAAEbpZpYjQU322.jpg" />
現需要在報表中以日期和效能統計考勤情況,要求根據:每天7點到12點算上班打卡,16點以後算下班打卡,多次刷卡取最早的打卡時間為上班卡,取最晚時間為下班卡,如果在該時間段未存在打卡記錄即顯示未打卡,8點30之後打卡算遲到,18點之前下班算早退。得到類似下表結果:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/55/41/wKioL1SJQWeA9Ws1AACo-xrNoDk056.jpg" style="float:none;" title="report5_statiscal_judgement_2.jpg" alt="wKioL1SJQWeA9Ws1AACo-xrNoDk056.jpg" />
這個報表的痛點在於用SQL或預存程序寫起來很困難,而一般報表工具則不具備資料來源計算能力,根本無法實現。
集算報表本身內建了適合結構化計算的指令碼,可以方便地寫出資料準備的計算(相當於一種更使用更簡單的自訂資料集)。上述報表需求使用集算報表可以這樣完成:
編寫集算指令碼
首先使用集算指令碼編輯器,建立集算指令碼,設定指令碼參數,如刷卡起止時間範圍:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/55/43/wKiom1SJQM-ixy28AACq-mGRKhs726.jpg" style="float:none;" title="report5_statiscal_judgement_3.jpg" alt="wKiom1SJQM-ixy28AACq-mGRKhs726.jpg" />
編寫指令碼完成資料計算,為報表輸出計算後結果集。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/55/41/wKioL1SJQWfA_bH5AAJ2vdVJgrA563.jpg" style="float:none;" title="report5_statiscal_judgement_4.jpg" alt="wKioL1SJQWfA_bH5AAJ2vdVJgrA563.jpg" />
A1:串連資料來源;
A2:根據指定時間範圍,執行sql查詢考勤表資料,查詢結果按照員工和刷卡時間排序,排序是為了便於後續取得首尾記錄;
A3:按照員工和刷卡日期分組,與SQL不同,集算指令碼中的分組結果保留了分組成員;
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/55/43/wKiom1SJQM-zoi_TAADD1Gp9p0M081.jpg" style="float:none;" title="report5_statiscal_judgement_5.jpg" alt="wKiom1SJQM-zoi_TAADD1Gp9p0M081.jpg" />
A4:建立空結果序表;
A5-C11:迴圈A3中的分組,根據最早和最晚刷卡時間通過判斷計算員工的出勤情況,最後將結果寫回到A4結果序表中;
其中,B6通過A5.m(-1)取得了最後一條記錄,集算報表中的集合都是有序的,所以很容易通過序號取得相應成員,這與SQL的集合無序有很大區別;
A12:為報表返回結果集。
編輯報表範本
使用集算報表編輯器,編輯報表範本,用於資料展現。首先建立參數,並設定預設值。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/55/41/wKioL1SJQWfyX38KAAC8qKMD7MM362.jpg" style="float:none;" title="report5_statiscal_judgement_6.jpg" alt="wKioL1SJQWfyX38KAAC8qKMD7MM362.jpg" />
建立報表並設定集算器資料集,調用上述編輯好的指令檔。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/55/43/wKiom1SJQM_R52BvAAEMES8EvI4772.jpg" style="float:none;" title="report5_statiscal_judgement_7.jpg" alt="wKiom1SJQM_R52BvAAEMES8EvI4772.jpg" />
其中,dfx檔案路徑既可以是絕對路徑,也可以是相對路徑,相對路徑是相對選項中配置的dfx主目錄的;參數b_date和e_date為指令碼參數,begin和end為報表範本參數,事實上二者可以同名。
編輯報表運算式,直接使用集算指令碼返回的結果集,完成報表製作。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/55/41/wKioL1SJQl7TGv2WAACMw5SLVfs510.jpg" title="report5_statiscal_judgement_8.jpg" alt="wKioL1SJQl7TGv2WAACMw5SLVfs510.jpg" />
報表展現結果如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/55/43/wKiom1SJQNGwj8ReAADQiKhEb28585.jpg" style="float:none;" title="report5_statiscal_judgement_9.jpg" alt="wKiom1SJQNGwj8ReAADQiKhEb28585.jpg" />
可以看到,使用集算器指令碼可以快速完成這類帶有多重判斷的情況。而且外置的集算指令碼具有可視化的編輯調試環境,編輯好的指令碼還可以複用(被其他報表或程式調用)。不過,如果指令碼已經調試好,而且不需要複用的時候,要維護兩個檔案(集算指令碼和報表範本)的一致性會比較麻煩,這時候直接使用集算報表的指令碼資料集就比較簡單了。
在指令碼資料集中可以分步編寫指令碼完成計算任務,文法與集算器一致,還可以直接使用報表定義好的資料來源和參數。本例使用指令碼資料集可以這樣完成:
1. 在資料集設定視窗中點擊“增加”按鈕,彈出資料集類型對話方塊,選擇“指令碼資料集”;
2. 在彈出的指令碼資料集編輯視窗中編寫指令碼;
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/55/41/wKioL1SJQWnCU7YyAAHFjqVMLYQ208.jpg" style="float:none;" title="report5_statiscal_judgement_10.jpg" alt="wKioL1SJQWnCU7YyAAHFjqVMLYQ208.jpg" />
這裡可以看到,在指令碼資料集中直接使用了報表中定義好的資料來源kaoqin和參數begin和end,比起單獨的集算指令碼更加簡單、直接。
3. 報表範本和運算式與使用集算器資料集方式一致,不再贅述。
集算報表:www.raqsoft.com.cn/?p=208 .
本文出自 “高效能報表資料計算” 部落格,請務必保留此出處http://report5.blog.51cto.com/8028595/1588750
潤乾集算報表非常規統計之多重判斷