0

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

4

1 回答 1

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 命令)。有关脚本的介绍,请参阅脚本指南(特别是第 7 章)。

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

于 2016-04-04T06:15:21.297 回答