#1 2016-03-01 09:24:27

KKap
Member
Registered: 2015-07-24
Posts: 20

Bedingte Einplaung

hi,

wie kann ich eine Einplanung so vornehmen das das Versenden des Reports nur dann ausgeführt wird
wenn in der Tabelle (Dynamischen Liste) etwas vorhanden ist ?

danke schonmal

Offline

#2 2016-03-02 20:51:10

Thorsten J. Krause
datenwerke
Registered: 2012-02-15
Posts: 479
Website

Re: Bedingte Einplaung

Hallo, guten Abend,

mit bedingten Einplanungen allein ist das leider nicht ohne weiteres moeglich, da diese keinen Zugriff auf den eingeplanten Bericht haben. (Man koennte natuerlich noch extra fuer die Bedingung eine weitere Variante erstellen, aber das das irgenwann nicht mehr synchron ist, ist absehbar)
Wenn Du Dich bereits mit ReportServer Scripten beschaeftigt hast, kannst du vermutlich etwas mit dem SchedulerExecutionHook machen. Der hat Zugriff auf den ausgeführten Bericht und kann über job.getExecutedReport().hasData() abfragen, ob dieser Daten zurückgegeben hat.

Viele Grüße
Thorsten

Offline

#3 2016-03-03 09:40:27

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

Hallo,

nein mit Scripts aufem ReportServer hatte ich noch nichts zu tun...
gibts es ein Tutorial oder Beispiel zu einem Script das ich mir das mal anschauen kann ?

Grüße

Offline

#4 2016-03-04 13:34:46

Thorsten J. Krause
datenwerke
Registered: 2012-02-15
Posts: 479
Website

Re: Bedingte Einplaung

Hallo,

ein paar Beispiele gibt es in unserem Blog: https://reportserver.net/blog/category/scripting/
Und ansonsten haben wir im Shop natuerlich den Script Guide, der eine etwas grundlegendere Einführung gibt: https://reportserver.net/de/services/#header-2

Cheers,
Thorsten

Offline

#5 2016-07-08 05:24:12

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

hallo,

ich hab nun folgenden code in das Verzeichnis "fileserver Root/bin/onstartup.d" gepackt
den Report Server neugestartet aber trotzdem bekomme ich einen automatischen erzeugten Report zu gesendet.

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

GLOBALS.services.callbackRegistry.attachHook(HOOK_NAME, SchedulerExecutionHook.class, callback)

an was kann das liegen ?

Offline

#6 2016-07-11 06:08:51

Arno Mittelbach
datenwerke
Registered: 2012-02-14
Posts: 690

Re: Bedingte Einplaung

Hallo Kai,

könntest Du mal das komplette Skript inklusive imports etc. posten?

Grüße
Arno

Offline

#7 2016-07-13 07:28:13

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

klar

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 HOOK_NAME = "SkipEmptyListSchedulerHook";

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

GLOBALS.services.callbackRegistry.attachHook(HOOK_NAME, SchedulerExecutionHook.class, callback)

Offline

#8 2016-07-14 07:06:49

Arno Mittelbach
datenwerke
Registered: 2012-02-14
Posts: 690

Re: Bedingte Einplaung

Hallo Kai,

bei mir funktioniert das Skript tadellos. Hattest Du es mal versucht erst einmal mit "exec" direkt im Terminal auszuführen? Um zu überprüfen, dass der Hook nach Neustart eingehängt ist kannst Du folgendes Skript verwenden

GLOBALS.services.callbackRegistry.getRegisteredHooks().each{ k,v -> tout.println(k) }
return null

Hier sollte als Ausgabe, unter anderem der Name "SkipEmptyListSchedulerHook" erscheinen.

Grüße
Arno

Offline

#9 2016-07-20 12:48:27

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

Hallo,

bei der ausgabe des Scripts erscheint nichts.
wir haben um den ReportServer "neu" zu starten einfach den Application Server (tomcat) neugestartet
oder gibt es für den ReportServer ein eigenen neustart Script ?

da sich der Hook ja so nicht registriert hat.

Grüße

Offline

#10 2016-07-20 13:03:16

Arno Mittelbach
datenwerke
Registered: 2012-02-14
Posts: 690

Re: Bedingte Einplaung

Hi,

wenn Du das "HookScript" direkt auf dem Terminal ausführst (exec ..), klappt dann alles? Wie sieht denn die etc/scripting/scripting.cf Konfigurationsdatei aus? Ist da onstartup.d als Startupverzeichnis eingetragen?

Grüße
Arno

Offline

#11 2016-07-20 13:09:53

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

wenn ich das "HookScript" im Terminal ausführe bekomme ich :

net.datenwerke.rs.scripting.service.scripting.exceptions.ScriptEngineException: javax.script.ScriptException: javax.script.ScriptException: java.lang.IllegalArgumentException
at net.datenwerke.rs.scripting.service.scripting.engines.GroovyEngine.eval(GroovyEngine.java:67)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:207)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:253)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:301)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:272)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand.doRollbackExecute(ExecScriptCommand.java:310)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:66)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1$1.doFilter(ExecScriptCommand.java:247)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66)
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1.call(ExecScriptCommand.java:238)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1.call(ExecScriptCommand.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.script.ScriptException: javax.script.ScriptException: java.lang.IllegalArgumentException
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:138)
at net.datenwerke.rs.scripting.service.scripting.engines.GroovyEngine.eval(GroovyEngine.java:65)
... 16 more

da das Script ja eh nur gefeuert werden soll, wenn ein Report gesendet werden soll, kann das Script ja alleine von sich aus auch nicht funktionieren, oder ?? ...

scripting.cf:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <scripting>
      <enable>true</enable>
      <restrict>
         <location>bin</location>
      </restrict>
      <startup>
         <login>fileserver/bin/onlogin.d</login>
         <rs>fileserver/bin/onstartup.d</rs>
      </startup>
   </scripting>
</configuration>

Offline

#12 2016-07-20 13:25:43

Arno Mittelbach
datenwerke
Registered: 2012-02-14
Posts: 690

Re: Bedingte Einplaung

Das folgende Script

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 HOOK_NAME = "SkipEmptyListSchedulerHook";

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

GLOBALS.services.callbackRegistry.attachHook(HOOK_NAME, SchedulerExecutionHook.class, callback)

registriert nur den Hook. Das heißt, wenn das über das Terminal ausgeführt wird, sollte dies keine Fehler werfen, sondern einfach der Hook registriert werden. Angenommen das script heißt "skipExecution.groovy". Dann kommt bei

exec skipExecution.groovy

obiger stack trace?

Offline

#13 2016-07-22 07:08:45

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

Hallo,

genau, wenn ich

exec SkipEmptyListSchedulerHook.groovy 

im terminal ausführe kommt obiger StackTrace

Offline

#14 2016-07-22 07:15:57

Arno Mittelbach
datenwerke
Registered: 2012-02-14
Posts: 690

Re: Bedingte Einplaung

Das ist sehr komisch. Ist in den Logs ein längerer StackTrace zu finden (der StackTrace sieht ein wenig abgeschnitten aus)? Welche RS Version ist hier im Einsatz?

Offline

#15 2016-07-22 07:19:23

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

kompletter StackTrace:

net.datenwerke.rs.scripting.service.scripting.exceptions.ScriptEngineException: javax.script.ScriptException: javax.script.ScriptException: java.lang.IllegalArgumentException
at net.datenwerke.rs.scripting.service.scripting.engines.GroovyEngine.eval(GroovyEngine.java:67)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:207)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:253)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:301)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:272)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand.doRollbackExecute(ExecScriptCommand.java:310)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:66)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1$1.doFilter(ExecScriptCommand.java:247)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66)
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1.call(ExecScriptCommand.java:238)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1.call(ExecScriptCommand.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.script.ScriptException: javax.script.ScriptException: java.lang.IllegalArgumentException
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:138)
at net.datenwerke.rs.scripting.service.scripting.engines.GroovyEngine.eval(GroovyEngine.java:65)
... 16 more
Caused by: javax.script.ScriptException: java.lang.IllegalArgumentException
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:335)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:132)
... 17 more
Caused by: java.lang.IllegalArgumentException
at groovyjarjarasm.asm.ClassReader.<init>(Unknown Source)
at groovyjarjarasm.asm.ClassReader.<init>(Unknown Source)
at groovyjarjarasm.asm.ClassReader.<init>(Unknown Source)
at org.codehaus.groovy.runtime.ProxyGeneratorAdapter.createClassVisitor(ProxyGeneratorAdapter.java:256)
at org.codehaus.groovy.runtime.ProxyGeneratorAdapter.<init>(ProxyGeneratorAdapter.java:158)
at groovy.util.ProxyGenerator.instantiateAggregate(ProxyGenerator.java:161)
at groovy.util.ProxyGenerator.instantiateAggregateFromBaseClass(ProxyGenerator.java:117)
at groovy.util.ProxyGenerator.instantiateAggregateFromBaseClass(ProxyGenerator.java:103)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.asType(DefaultGroovyMethods.java:7506)
at org.codehaus.groovy.runtime.dgm$48.doMethodInvoke(Unknown Source)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1074)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:904)
at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:836)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:827)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:164)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.asType(ScriptBytecodeAdapter.java:587)
at Script50.run(Script50.groovy:8)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:332)
... 18 more

Version:
RS2.2.2-5639

Offline

#16 2016-07-22 10:07:57

Thomas Davies
datenwerke
Registered: 2016-05-18
Posts: 74

Re: Bedingte Einplaung

Ich habe eben noch einmal eine frische RS 2.2.2 installiert und auch dort läuft das Skript leider einwandfrei... Zwei Ideen hätte ich noch:

- Wurden irgendwelche Bibliotheken von Hand geupdated?
- Welche Java Version ist im Einsatz?

Offline

#17 2016-07-22 10:12:38

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

- nein, es wurden keine Bibliotheken per hand aufgespielt
- es läuft die Java Version 1.8.0_77 auf dem Server

Grüße

Offline

#18 2016-07-22 10:27:01

Thomas Davies
datenwerke
Registered: 2016-05-18
Posts: 74

Re: Bedingte Einplaung

Dann liegt es vermutlich an der Java Version. ReportServer 2.2.2 läuft leider nur zuverlässig mit Java 1.7. Ab RS 3.0 kann auch Java 1.8 verwendet werden.

Grüße
Thomas

Offline

#19 2016-07-27 09:33:15

KKap
Member
Registered: 2015-07-24
Posts: 20

Re: Bedingte Einplaung

ein Downgrad der java Version kommt auf dem Sever leider nicht Frage.
gibt es einen anderen Weg um den Hook zu nutzten ?

Offline

#20 2016-07-27 11:02:31

Arno Mittelbach
datenwerke
Registered: 2012-02-14
Posts: 690

Re: Bedingte Einplaung

Wenn ein Downgrade von Java nicht möglich ist wird dies mit der alten ReportServer Version leider nicht gehen. Das einfachste wäre ein Upgrade auf RS 3.0. Hier müsste allerdings auf die Enterprise Version geupdated werden.

Grüße
Arno

Offline

Board footer

Powered by FluxBB