ReportServer:没有包含空表的报告

时间:2016-03-16 16:47:06

标签: reportserver

我使用Datewerks的报告服务器 我创建了一份报告,就像时间安排报告一样 但是,如果表中没有可用的数据(行),如何设置报告以便不发送报告?

1 个答案:

答案 0 :(得分:0)

目前有两种可能性如何在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)。

我应该补充一点,这不是一个真正的最佳实现。这里发生的是,为了决定是否应该发送电子邮件,报告将被执行。如果未被否决,则报告将作为实际过程的一部分再次执行。据我所知,目前对此没有多少可以做的。可能的优化不仅仅是运行报告,而是使用 LIMIT 1 进行调整。