Wie setze ich einen Parameter auf eine Werteliste in einem BIRT-Bericht?

8

Ich habe ein DataSet mit einer Abfrage wie folgt:

%Vor%

Ich möchte die Abfrage so ändern, dass ich eine Liste von Geschäfts-IDs angeben kann, beispielsweise:

%Vor%

Wie erreiche ich das in BIRT? Welche Art von Parameter muss ich angeben?

    
Mike Sickler 04.08.2010, 02:22
quelle

4 Antworten

9

Der einfache Teil ist der Berichtsparameter: Legen Sie den Anzeigetyp auf Listenfeld fest und aktivieren Sie die Option Mehrere Werte zulassen.

Jetzt der schwierige Teil: Leider können Sie einen mehrwertigen Berichtsparameter nicht an einen Dataset-Parameter binden (zumindest nicht in Version 3.2, was ich verwende). Es gibt einen Eintrag im BIRT World Blog hier: Ссылка In diesem Abschnitt wird beschrieben, wie Sie mit einem Code-Plug-In Parameter für mehrere Auswahlberichte an ein Berichtsdataset binden können.

Leider, als ich es versuchte, hat es nicht funktioniert. Wenn Sie es zur Arbeit bringen können, wäre das die Methode, die ich empfehlen würde; Wenn dies nicht möglich ist, besteht die Alternative darin, den queryText der Datenmenge zu ändern, um alle Werte aus dem Berichtsparameter an der entsprechenden Stelle in die Abfrage einzufügen. Angenommen, s.id ist numerisch, hier ist eine Funktion, die in das Ereignisskript beforeOpen für die Datenquelle eingefügt werden kann:

%Vor%

, die dann aus dem beforeOpen-Ereignisskript für das -Datenset wie folgt aufgerufen werden kann:

%Vor%

Angenommen, Ihr Berichtsparameter heißt rpID. Sie müssen Ihre Abfrage so anpassen, dass sie wie folgt aussieht:

%Vor%

Die 0 ist im Skript enthalten, damit das Abfrageskript zur Entwurfszeit gültig ist und die Datenmengenwerte korrekt an den Bericht gebunden werden. Zur Laufzeit wird diese fest codierte 0 entfernt.

Dieser Ansatz ist jedoch möglicherweise sehr gefährlich, da er Sie anfällig für SQL-Injection-Angriffe machen könnte: Ссылка , as demonstriert hier: Ссылка .

Bei rein numerischen Werten, die aus einer vordefinierten Auswahlliste ausgewählt werden, sollte ein SQL-Injection-Angriff nicht möglich sein; Derselbe Ansatz ist jedoch anfällig, wenn Freiform-Eingabezeichenfolgen für den Parameter zulässig sind.

    
Mark Bannister 04.08.2010, 10:31
quelle
4

Zu Ihrer Information: Der BIRT World-Artikel sollte funktionieren (ich habe ihn geschrieben), aber das war eine frühere Lösung für das Problem.

Wir haben ein Open-Source-Plugin erstellt, das Sie zu BIRT hinzufügen können, das eine viel sauberere Lösung für dieses Problem bietet. Die Funktion Bind Parameters in der birt-functions-lib bietet eine einfache Möglichkeit, Multi-Selects aus mehrwertigen Parametern zu machen.

Wenn Sie noch interessiert sind, schauen Sie sich das birt-functions-lib-Projekt an zu Eclipse Labs.

    
Scott Rosenbaum 14.09.2010 03:05
quelle
2

Hier ist noch einer. Basierend auf einigen Hinweisen, die ich an anderer Stelle gefunden und erweitert habe, um die Anzahl der Parameter in Ihrem Datensatz SQL zu erhalten. Diese Lösung funktioniert mit einer JavaScript-Funktion, die Sie bei OnBeforeOpen des Datasets aufrufen:

%Vor%

Ersetzen Sie in Ihrer Abfrage die Vorkommen von (?) durch @XYZ ?. Die obige Methode stellt sicher, dass Die Abfrage hat die aktuellen Werte und immer noch einen Parameter (damit sich der Dataset-Editor und die Vorschau nicht beschweren).

Hinweis: Vorsicht vor SQL-Injection, z. indem Stringwerte nicht zugelassen werden

    
gnomie 16.04.2012 15:22
quelle
2

Ich habe eine allgemeinere Lösung erstellt, die auch das optionale / erforderliche Parameter Verhalten behandelt. Wenn der Parameter nicht benötigt wird und der Benutzer keinen Wert auswählt, wird die IN-Klausel deaktiviert. Außerdem kann der Benutzer sowohl echte Werte als auch einen Nullwert auswählen.

Im Bericht initialize script füge ich diesen Code hinzu:

%Vor%

Verwendungsbeispiel

Setzen Sie in der Dataset-Abfrage Ihre spezielle IN-Klausel:

%Vor%

In beforeOpen Skript des Datensatzes mit der IN-Klausel schreiben:

%Vor%

Beachten Sie, dass ich einen Platzhalter verwendet habe, der es ermöglicht, dass die Abfrage auch vor dem Ersetzen ausgeführt wird (z. B. mit Anführungszeichen, da F4 ein Varchar ist). Sie können einen Platzhalter erstellen, der zu Ihrem Fall passt.

    
bluish 02.08.2012 09:50
quelle

Tags und Links