2016-03-16 31 views
0

我使用Datewerks中的Report Server。
我已經創建了一個報告,就像時間安排報告一樣。
但是,如果表中沒有數據(行)可用,那麼如何設置報告以便它不發送報告?ReportServer:沒有空表的報告

回答

0

目前有兩種可能性如何在ReportServer中完成。首先是使用條件調度。在這裏你需要創建一個條件來檢查你的報告是否有任何數據。條件本身是動態列表(變體),並通過終端命令rcondition創建。一旦條件就位後它可以在調度過程中進行選擇(通過激活第一面板上的先進選擇。爲了讓您一開始,看看。

第二種可能是使用的ReportServer的腳本功能並掛鉤到調度程序中,如果您只對動態列表報告感興趣,這種方法效果特別好,因爲在這裏可以很容易地確定報告是否包含任何數據(例如,對於Jasper或BIRT報告,它不是清楚如何確定報告是否包含數據,因爲報告引擎可能仍然生成具有多個頁面的PDF /文檔。)

您正在尋找的鉤子是SchedulerExecutionHook在執行任何預定作業並可能否決執行之前調用它。以下是一個腳本,用於檢查a)計劃作業是否爲報表執行作業,b)報表是否爲動態列表。如果滿足這些條件,它將運行報告,然後檢查結果是否有數據。如果情況不是這樣,它否決執行。

import net.datenwerke.scheduler.service.scheduler.hooks.SchedulerExecutionHook 
import net.datenwerke.scheduler.service.scheduler.hooks.adapter.SchedulerExecutionHookAdapter 
import net.datenwerke.rs.scheduler.service.scheduler.jobs.report.ReportExecuteJob 
import net.datenwerke.rs.base.service.reportengines.table.entities.TableReport 
import net.datenwerke.rs.base.service.reportengines.table.output.object.CompiledTableReport 
import net.datenwerke.scheduler.service.scheduler.helper.SkipJobExecution 

def callback = [ 
    doesVetoExecution : { job, logEntry -> 
    if(job instanceof ReportExecuteJob && 
     job.getReport() instanceof TableReport){ 
     job.doExecute() 
     if(job.getExecutedReport() instanceof CompiledTableReport && 
      ! job.getExecutedReport().hasData()){ 
      return new SkipJobExecution("No data") 
     } 
    } 
    } 
    ] as SchedulerExecutionHookAdapter 

def HOOK_NAME = "SkipEmptyListSchedulerHook"; 
GLOBALS.services.callbackRegistry.attachHook(HOOK_NAME, SchedulerExecutionHook.class, callback) 

要註冊掛鉤,將其放置在這種情況下,每當服務器啓動時鉤註冊的文件服務器的bin/onstartup.d文件夾。爲了不重新啓動服務器,而是直接註冊它,打開終端(CTRL + ALT + T)並手動執行腳本(exec命令)。有關腳本的介紹,請參閱Scripting Guide(特別是Chapter 7)。

我應該補充說,這不是一個最佳的實現。這裏發生的是,爲了決定是否發送電子郵件,報告被執行。如果未被否決,報告將作爲實際流程的一部分再次執行。據我所知,目前還沒有太多可以做到的事情。一個可能的優化將不是簡單地運行報告,而是使用LIMIT 1來適應它。