You are not logged in.
Pages: 1
Hallo,
ich habe in Crystal Reports einen optionalen Parameter mit mehrfach Auswahlmöglichkeit.
Der Auswahlliste wird durch eine Abfrage gefüllt (aktuell Business View).
Damit steht dann in der Datensatz-Auswahlformel: (not HasValue({?Produktgruppe}) OR {Befehl.ID} = {?Produktgruppe})
Leider führt die Ausführung bei leerem Parameter zu einer Null-Pointer Exception.
Unschön würde ich eine Lösung finden, eine weitere Zeile anzuhängen:
union
select -1, 'keine Auswahl'
from dual
weil der Anwender dann die Auswahl "keine Auswahl" als Default ausgewählt hat und in der Auswahlformel auf
-1 statt auf not HasValue geprüft werden muss, aber nur dann, wenn nur ein Wert gewählt wurde.
Gibt es hier einen Lösungsansatz?
Vielen Dank
Joachim
Offline
Hallo Joachim,
der muss NULL Fall muss irgendwo abgehandelt werden, hier bieten sich mehrere Möglichkeiten an:
- Die von Dir geschilderte Variante
- Die Benutzung einer nvl / isnull Funktion in der Abfrage selber
- Die Benutzung von $X{}, siehe auch https://reportserver.net/en/guides/admi … arameters/
Ob die letzte Variante so mit Crystal funktioniert habe ich aber selber noch nicht ausprobiert ... .
Gruß Jan
Offline
Hallo Jan,
Danke für die schnelle Antwort.
Der Parameter taucht nicht in der SQL-Abfrage auf, die Datensätze werden über CrystalReports gefiltert.
Die Exception entsteht beim Aufrufen des Reports, vermutlich weil der Parameter keinen Wert enthält.
Ich hatte in einem alten Forumsbeitrag gelesen, dass ihr immer einen Wert erwartet und hatte gehofft,
dass dieses Verhalten verändert wurde, weil ich ja auch in der Parameterdefinition vom RS einen
Parameter Mandatory machen kann.
Viele Grüße
Joachim
Offline
Hallo Joachim,
wir vermuten das der Crystal Report empfindlich auf die Tatsache reagiert gar keine Zeile zu bekommen. Kannst Du bitte einen leeren Crystal Report ausführen und schauen ob der auch eine NullPointerException wirft. Mit leerem Report meine ich einen Report der irgendetwas anzeigt aber auf einer Query basiert, die keine Zeile liefert.
Falls das den selben Fehler gibt können wir für die nächste Version (3.1) den Nullpointer behandeln. Du könntest Dein Problem zunächst dadurch lösen, dass Du einfach eine Tabelle mit in die Query hineinnimmst, die eine Zeile enthält, z.B. Dual oder Datenstand o.ä.. Dann wären Deine Daten leer aber immer noch eine Zeile da damit der Bericht nicht stirbt ...
Gruß und ein schönes Wochenende
Jan
Offline
Hallo Jan,
Danke für eure Mühe.
Ein leerer Report ist kein Problem (select sysdate from dual where 1=2). Die Seite bleibt einfach leer.
Ich vermute, dass bei der Übergabe der Parameter, es sind in dem Beispiel 5, von denen einer Pflicht ist, der Fehler entsteht.
In etwa so: Stichtag=01.01.1900&Produktgruppe=&Medium=&dsplPriceCategory='Nein'&dsplSortKey='Ja'.
Dabei ist Stichtag Pflicht und alle anderen Optional, die beiden dspl-Parameter sind DropDown und haben einen Default von 'Nein'
Produktgruppe und Medium haben keinen Default und sind optional.
Wenn diese nicht gefüllt sind entspricht das einer Auswahl von 'Allen' (die Bedingung in der Datensatz-Auswahlformel ist dann wahr).
Sobald ich einen Wert für Produktgruppe und Medium auswähle funktioniert der Report fehlerfrei.
Die Parameter sind als Mehrfachselektion und Listenfeld definiert mit dem Type long.
Viele Grüße
Joachim
Offline
Hallo Jan,
ich habe einen simplen Report in Crystal gemacht, der auf der internen RS-Datenbank (so wie sie von Bitnami kommt) beruht.
Eine Tabelle (rs_column_a) und einen Datenquellen-Parameter (select name_field from rs_column_a group by name_field order by name_field).
Auch hier lässt sich das Verhalten reproduzieren.
Leider kann ich den Report nicht anhängen.
Gruß
Joachim
Offline
ein kleiner Nachtrag:
Ich habe den gleichen Report wie in #6 mit BIRT nachgebaut.
Ein optionaler Parameter wird aus Eclipse mittels Ansicht im Web-Viewer mit 2! zusätzlichen Zeilen dargestellt (eine Zeile leer, eine Zeile mit Null Value) .
Wenn ich hier nichts auswähle werden alle Zeilen dargestellt.
Aus dem ReportServer heraus existieren diese Zeilen nicht, die Ausführung führt zu keinem Fehler, allerdings bleibt der Report leer (0 Zeilen werden selektiert).
das beforeOpen Script:
if (params["Name"] != null && params["Name"].value != null)
{
this.queryText += " and name_field in ('" + params["Name"].value.join("','") + "')";
}
Offline
Hallo Joachim,
wenn ich zurück auf Dein ursprüngliches Problem komme, würde dann nicht eine where Bedingung wie:
select a.col1, a.* from MyTable a where a.col1 = case when myoptmultiselctionparm is null then a.col1 else myoptmultiselctionparm end
Dein Problem lösen? Wenn nicht dann habe ich es noch nicht verstanden und bitte Dich das Problem noch mal genau zu präziesieren damit wir das in die Fehlerliste für 3.1 aufnehmen können.
Vielen Dank im voraus
jan
Offline
Hallo Jan,
ich habe einen ganz trivialen Report basierend auf der Tabelle rs_column_a.
Ein optionaler Parameter "Name" mit Mehrfachselektion existiert, wird jetzt aber nirgendwo verwendet, also kein Filterkriterium.
Für die Auswahl des Parameters verwende ich sowohl in CrystalReports als auch im Reportserver folgendes SQL:
select name_field
from rs_column_a
group by name_field
order by name_field
Ich bekomme dann in beiden Systemen eine Liste mit verfügbaren Werten von denen aber kein Wert ausgewählt ist.
Wenn ich dann auf Vorschau im ReportServer gehe bekomme ich die folgende Fehlermeldung:
Fehler: Der Bericht konnte nicht ausgeführt werden.
Der Bericht konnte nicht ausgeführt werden: net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: Der Bericht konnte nicht ausgeführt werden: null
Im Falle eines nicht nachvollziehbaren Fehlers kontaktieren Sie bitte einen Administrator.
Details
net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: Der Bericht konnte nicht ausgeführt werden: net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: Der Bericht konnte nicht ausgeführt werden: null at net.datenwerke.rs.core.service.reportmanager.ReportExecutorServiceImpl.execute(ReportExecutorServiceImpl.java:218) at net.datenwerke.rs.core.service.reportmanager.ReportExecutorServiceImpl.execute(ReportExecutorServiceImpl.java:119) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.exeucteReport(ReportExportServlet.java:535) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.doExportReport(ReportExportServlet.java:416) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.exportReport(ReportExportServlet.java:346) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.exportReportViaSession(ReportExportServlet.java:339) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.doGet(ReportExportServlet.java:168) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$f15ef67e.CGLIB$doGet$0() at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$f15ef67e$$FastClassByGuice$$5fdb8f5a.invoke() at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228) at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72) at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:66) at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72) at net.datenwerke.security.service.security.aop.SecurityCheckInterceptor.invoke(SecurityCheckInterceptor.java:109) at
...
Das ganze hat meiner Meinung nach nichts mit der Verarbeitung des Parameters im Report zu tun.
Wenn ich das SQL verändere:
select name_field
from rs_column_a
group by name_field
union
select null
order by name_field
und dann den null Wert auswähle funktioniert der Report.
Ich lasse Dir gerne den Report zukommen. Er läuft gegen eure interne DB.
Viele Grüße
Joachim
Offline
Hallo Joachim,
danke für die ausführliche Beschreibung, jetzt können wir das Problem besser verstehen :-)
Wir schauen uns das an und melden uns, sobald wir etwas herausgefunden haben.
Viele Grüße,
Eduardo
Offline
Hi Joachim,
wenn ich das richtig verstehe, hast du einen Crystal Report, dann fügst du einen Datasource Parameter, der aber nirgendwo auftaucht, d.h. er wird gar nicht verwendet?
Wenn ich einen Datasource Parameter mit folgender Query erstelle:
select name_field
from rs_column_a
group by name_field
order by name_field
bekomme ich eine Fehlermeldung in reportserver, wenn ich den Report aufmache:
Query could not be executed:
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.
Ich verwende MSSQL, und folgende Query wird daraus erstellt:
SELECT TOP 0 * FROM (SELECT * FROM (select name_field
from rs_column_a
group by name_field
order by name_field
) wrappedQry) limitQry /* token: fb4a72e7-250e-423e-a178-eacf1f1154ae */ /* currentuser: 6 */
Was für eine interne DB benutzt du ?
Ich denke, dass das an der Query liegt:
select name_field
from rs_column_a
group by name_field
order by name_field
Wieso verwendest du ein group by und ein order by in der Parameter-Query?
Kannst du folgendes ausprobieren?
select name_field
from rs_column_a
Viele Grüße,
Eduardo
Offline
Hallo Eduardo,
für das einfache Beispiel habe ich die Bitnami-Installation verwendet. Da wird eine MySQL bzw. MariaDB als interen Datenbank verwendet.
Unsere "echten" Reports laufen gegen eine OracleDB.
Das Group by verwende ich, weil ich jede Ausprägung nur einmal haben möchte. Ich kenne eure interne Struktur nicht, ich wollte nur ein
einfaches Beispiel geben.
Auch mit :
select name_field
from rs_column_a
als Parameter erhalte ich im Preview den Fehler.
Noch einfacher mit einer CSV-Datasource:
value;description
5;RMV Chipkarte
6;RMV Papierrolle
7;RMV Wertmarkenbogen
Diese Datenquelle für den Parameter verwenden.
Wie ich schrieb, der Parameter hat keinen Einfluss auf die Ergebnismenge, ich zeige ihn nur noch in der Überschrift an.
Ich bekomme die Parameterkonfiguration angezeigt, wähle einen Eintrag aus und bekomme die ganze Tabelle angezeigt.
Ohne Auswahl wieder der Fehler.
Danke für eure Mühe
Joachim
Offline
Hallo Joachim,
sorry für die Verzögerung.
Kannst du mir bitte Screenshots der Parameterkonfiguration in Crystal (CSV-Datasource) schicken ?
Auch von der entsprechenden Konfiguration in ReportServer.
Viele Grüße,
Eduardo
Offline
Hallo Joachim,
ich kann das Problem nachvollziehen: bei keiner Auswahl bekomme ich eine NPE, bei Auswahl von einem Wert bekomme ich den Bericht mit dem Parameter in der Überschrift angezeigt, und bei Auswahl mehrerer Werte bekomme ich wieder eine NPE.
Ich schaue mir das Problem an (Ticket RS-2664)
Der Vollständigkeit halber: hier die komplette NPE, falls jemand ein ähnliches Problem hat:
Error: An error occurred during report execution.
The report could not be executed: net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: The report could not be executed: null
To get help please contact an administrator.
Details
net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: The report could not be executed: net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: The report could not be executed: null at net.datenwerke.rs.core.service.reportmanager.ReportExecutorServiceImpl.execute(ReportExecutorServiceImpl.java:218) at net.datenwerke.rs.core.service.reportmanager.ReportExecutorServiceImpl.execute(ReportExecutorServiceImpl.java:119) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.exeucteReport(ReportExportServlet.java:535) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.doExportReport(ReportExportServlet.java:416) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.exportReport(ReportExportServlet.java:346) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.exportReportViaSession(ReportExportServlet.java:339) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet.doGet(ReportExportServlet.java:168) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$db209ebd.CGLIB$doGet$4() at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$db209ebd$$FastClassByGuice$$a80d666b.invoke() at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228) at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72) at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:66) at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72) at net.datenwerke.security.service.security.aop.SecurityCheckInterceptor.invoke(SecurityCheckInterceptor.java:109) at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72) at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$db209ebd.doGet() at javax.servlet.http.HttpServlet.service(HttpServlet.java:735) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$db209ebd.CGLIB$service$13() at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$db209ebd$$FastClassByGuice$$a80d666b.invoke() at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228) at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72) at net.datenwerke.security.service.security.aop.SecurityCheckInterceptor.invoke(SecurityCheckInterceptor.java:109) at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72) at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52) at net.datenwerke.rs.core.server.reportexport.ReportExportServlet$$EnhancerByGuice$$db209ebd.service() at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263) at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178) at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91) at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62) at com.google.inject.persist.PersistFilter.doFilter(PersistFilter.java:89) at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163) at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) 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.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 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:68) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:370) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1011) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) at java.lang.Thread.run(Thread.java:745) Caused by: net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorRuntimeException: net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: The report could not be executed: null at net.datenwerke.rs.crystal.service.crystal.reportengine.CrystalReportEngine.executeReport(CrystalReportEngine.java:104) at net.datenwerke.rs.crystal.service.crystal.reportengine.CrystalReportEngine.doExecute(CrystalReportEngine.java:63) at net.datenwerke.rs.core.service.reportmanager.engine.ReportEngine.execute(ReportEngine.java:150) at net.datenwerke.rs.core.service.reportmanager.ReportExecutorServiceImpl.execute(ReportExecutorServiceImpl.java:186) ... 64 more Caused by: net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException: The report could not be executed: null at net.datenwerke.rs.crystal.service.crystal.reportengine.output.generator.CrystalPDFOutputGenerator.exportReport(CrystalPDFOutputGenerator.java:58) at net.datenwerke.rs.crystal.service.crystal.reportengine.CrystalReportEngine.executeReport(CrystalReportEngine.java:93) ... 67 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at net.datenwerke.rs.crystal.service.crystal.reportengine.output.generator.CrystalPDFOutputGenerator.exportReport(CrystalPDFOutputGenerator.java:52) ... 68 more Caused by: com.crystaldecisions.sdk.occa.report.lib.ReportSDKParameterFieldException: InternalFormatterException---- Error code:-2147217394 Error code name:missingParameterValueError at com.crystaldecisions.sdk.occa.report.application.PrintOutputController.if(SourceFile:237) at com.crystaldecisions.sdk.occa.report.application.PrintOutputController.export(SourceFile:147) at com.crystaldecisions.sdk.occa.report.application.PrintOutputController.export(SourceFile:128) at com.crystaldecisions.sdk.occa.report.application.PrintOutputController.export(SourceFile:111) ... 73 more
Grüße,
Eduardo
Offline
Hallo,
der Fall mit den leeren Werten ist korrigiert und wird mit dem nächsten Nightly-Build (20170717) behoben sein.
Bitte beachten: der Parameter muss die Option "Optionale Eingabeaufforderung" in Crystal auf "Wahr" gesetzt haben, damit Crystal den Parameter als Optional erkennt.
Den anderen Fall mit der Mehrfachauswahl schaue ich mir noch an.
Viele Grüße,
Eduardo
Offline
Hallo,
um das Problem mit der Mehrfachauswahl zu korrigieren, muss in Crystal folgende Option gesetzt werden: "Mehrfachwerte zulassen"
Viele Grüße,
Eduardo
Offline
Pages: 1