Wie kann ich einen parameter einstellen, um eine Liste von Werten in einem BIRT-report?
Ich habe einen Datensatz mit einer Abfrage wie diese:
select s.name, w.week_ending, w.sales
from store s, weekly_sales_summary w
where s.id=w.store_id and s.id = ?
Möchte ich die Abfrage ändern, um mir zu erlauben, geben Sie eine Liste der store-IDs, wie:
select s.name, w.week_ending, w.sales
from store s, weekly_sales_summary w
where s.id=w.store_id and s.id IN (?)
Wie kann ich dies in BIRT? Welche parameter muss ich angeben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist der einfache Teil ist der Bericht parameter: stellen Sie den Anzeige-Typ der Liste, dann überprüfen Sie die option Mehrere Werte Zulassen.
Jetzt der schwierige Teil: leider kann man nicht binden Sie ein multi-value-Bericht parameter auf ein dataset-parameter (zumindest nicht in der version 3.2, die ist, was ich verwende). Es gibt eine Buchung auf den BIRT-Welt-blog hier:
http://birtworld.blogspot.com/2009/03/birt-multi-select-statements.html
dass beschreibt wie Sie ein code-plug-in für bind-multi-wählen Sie Berichtsparameter zu einem Berichtsdataset.
Leider, wenn ich es versuchte, es funktionierte nicht. Wenn Sie es bekommen können, um zu arbeiten, das ist die Methode, die ich empfehlen würde; wenn Sie nicht können, dann die alternative wäre eine änderung der dataset ist queryText, einfügen, alle Werte aus der report-parameter in der Abfrage an der entsprechenden Stelle. Vorausgesetzt
s.id
numerisch ist, hier ist eine Funktion, die eingefügt werden können in der beforeOpen Ereignis-Skript für die datasource:kann dann aufgerufen werden, aus der beforeOpen Ereignis-Skript für die dataset, wie diese:
davon aus, dass Ihr Bericht parameter aufgerufen wird rpID. Sie müssen ändern Sie Ihre Abfrage wie folgt Aussehen:
0 ist im Skript enthalten, so dass die query-Skript gültig ist, zur design-Zeit, und das dataset Werte binden richtig an den Bericht; an der Laufzeit, das ist hard-coded 0 werden entfernt.
Jedoch, dieser Ansatz ist potentiell sehr gefährlich, da könnte es machen Sie anfällig für SQL-Injection-Angriffe: http://en.wikipedia.org/wiki/SQL_injection , wie hier gezeigt: http://xkcd.com/327/ .
Bei rein numerischen Werten aus einer vordefinierten Auswahlliste die SQL-injection-Angriff nicht möglich sein sollte; ist jedoch der gleiche Ansatz ist anfällig, wo Freiform-Eingabe-strings für die parameter sind erlaubt.
Zur info: das BIRT-Welt Artikel funktionieren sollte (ich schrieb es), aber das war eine frühere Lösung für das problem.
Haben wir einen open-source-plugin, das Sie hinzufügen können, BIRT, die hat eine viel sauberere Lösung für dieses problem. Die Bind-Parameter-Funktion in den birt-Funktionen-lib bietet eine einfache Möglichkeit zu tun, multi-wählt aus multi-value-Parameter.
Wenn Sie noch daran interessiert sind, haben Sie einen Blick auf die birt-Funktionen-lib-Projekt auf Eclipse Labs.
Ist hier eine andere. Basierend auf einige Tipps, die ich an anderer Stelle gefunden und erweitert, um die Erhaltung der Anzahl der Parameter in Datensatz SQL. Diese Lösung arbeitet mit einer JavaScript-Funktion, die Sie aufrufen, an OnBeforeOpen des Datensatzes:
In deiner Abfrage ersetzen vorkommen (?) mit @XYZ?. Die obige Methode stellt sicher, dass
die Abfrage der Istwerte und noch einen parameter (so dass die dataset-editor und in der Vorschau nicht beschweren).
Hinweis: Vorsicht vor SQL-injection, z.B. indem nicht die string-Werte
Erstellte ich eine allgemeinere Lösung, die Griffe optionale/erforderliche Parameter Verhalten zu. Wenn der parameter nicht erforderlich, und der Benutzer nicht wählen Sie einen beliebigen Wert, der IN-Klausel wird deaktiviert. Es erlaubt auch dem Benutzer, wählen Sie sowohl die realen Werte und den Wert null zu.
Im Bericht
initialize
Skript füge ich diesen code:Beispiel
In der dataset-Abfrage-legen Sie Ihre Besondere IN-Klausel:
In
beforeOpen
Skript der Datensatz mit der IN-Klausel schreiben:Hinweis, dass ich eine Platzhalter die es erlaubt die Abfrage ausführen, auch vor dem Austausch (zB. es hat Angebote als F4 ist ein varchar). Können Sie bauen ein Platzhalter, der genau Ihren Fall.