0

Datewerks の Report Server を使用しています。
タイム スケジューラ レポートと同様に、レポートを作成しました。
しかし、テーブルにデータ (行) がない場合にレポートを送信しないようにレポートを設定するにはどうすればよいでしょうか?

4

1 に答える 1

0

ReportServerでこれを実現する方法として、現在 2 つの可能性があります。1 つ目は、条件付きスケジューリングを使用することです。ここでは、レポートにデータがあるかどうかを確認できる条件を作成する必要があります。条件自体は動的リスト (バリアント) であり、端末コマンドrconditionを介して作成されます。条件が設定されると、スケジューリング プロセス中に選択できます (最初のパネルで高度なオプションを有効にすることにより)。開始するには、マニュアルを参照してください。

2 つ目の方法は、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 に答える