我使用来自Datewerks的报表服务器。
我已经创建了一个报告,就像时间调度程序报告一样。
但是,如果表中没有可用的数据(行),我如何设置报告使其不发送报告?
发布于 2016-04-04 14:15:21
目前,在ReportServer中有两种可能的实现方式。第一种是使用条件调度。在这里,您需要创建一个条件,该条件允许检查您的报告是否包含任何数据。条件本身是动态列表(变体),并通过终端命令rcondition创建。一旦条件就位,就可以在调度过程中选择它(通过激活第一个面板上的高级选项。开始之前,先看一下the manual。
第二种可能是使用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)。
我要补充的是,这并不是一个真正的最佳实现。这里发生的事情是,为了决定是否应该发送电子邮件,将执行报告。如果没有被否决,报告将作为实际流程的一部分再次执行。然而,据我所知,目前在这方面可以做的事情并不多。一种可能的优化不是简单地运行报告,而是使用限制1对其进行调整。
https://stackoverflow.com/questions/36041927
复制相似问题