我使用 Datewerks 的报表服务器。
我已经创建了一份报告,就像时间安排报告一样。
但是,如果表中没有可用的数据(行),我如何设置报告以便它不发送报告?
1 回答
目前有两种可能如何在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 命令)。有关脚本的介绍,请参阅脚本指南(特别是第 7 章)。
我应该补充一点,这并不是真正的最佳实现。这里发生的是,为了决定是否应该发送电子邮件,执行报告。如果没有被否决,报告将作为实际过程的一部分再次执行。然而,据我所知,目前对此无能为力。一种可能的优化是不只是运行报告,而是使用LIMIT 1对其进行调整。