Report-Generator: Integer-Berichtsparameter an Postgres-Funktion übergeben?

Gibt es vielleicht irgendwelchen Trick, wie ich dies erreichen könnte?
Zur Erklärung:
Ich schreibe gerade eine Postgres-Funktion, die durch eine Stückliste rekursiv durchgeht und vergleicht die gewünschte mit der verfügbaren Menge damit die Lieferzeiten berechnet werden können. Ich muss also auf der obersten Ebene die gewünschte Menge eingeben. Die Funktion hat 2 Parametern, die Stücklisten-ID und die Menge. Die Stücklisten-ID kann ich bestimmt übergeben in dem ich die Funktion in einem View einbette und den entsprechenden Berichtsparameter benutze um den gleichen Wert aus der Stücklistentabelle zu selektieren - nicht besonders schön, aber müsste gehen. Die Menge ist aber etwas problematischer. Vielleicht könnte ich z.B. eine Tabelle mit den ersten 1000 Integer-Werten anlegen und den gleichen Trick nutzen (damit L&L in Effekt sowas wie SELECT n FROM MyIntegers WHERE n = 3 generiert wenn der Menge-Berichtsparameter 3 ist), aber diese Idee finde ich sogar selber etwas abartig und würde ich natürlich gern vermeiden! Also falls jemand eine elegantere Lösung einfällt, wäre das ganz nett - und ein großer Dienst an der Ästhetik… :smirk:
Danke!

Sie könnten es über ein Npgsqlcommand probieren. Hier wird eine Funktion mit einem Parameter aufgerufen:

NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM FunctionName(@param1);", connection);
cmd.Parameters.AddWithValue("@param1", NpgsqlDbType.Integer, "{{param1=100|format=number}}");
dataProvider.AddCommand(cmd, "TableName");

Der Code ist jedoch nicht getestet :wink:

1 Like

Hallo Herr Rauchfuß,
vielen Dank für Ihre Antwort auf meinem etwas wirren Post! :grinning:
Wenn ich richtig verstehe, ist NpgsqlCommand eine .NET-Klasse.
Ich wollte aber den Report im Report-Server zur Verfügung stellen, dort kann ich nicht auf .NET darauf zugreifen, oder? Wäre super wenn doch!
Sonst, um Archimedes zu zitieren: “Gib mir einen Punkt, wo ich sicher stehen kann, [einen Hebel, der lang genug ist,] und ich bewege die Erde mit einer Hand”. :smirk:

Im Report Server können Datenquellen bereits jetzt parametrisiert werden. Voraussetzung ist, dass die Datenquelle per Einzelabfragen angebunden ist. Wenn das gegeben ist, dann kann in der Datenquellen-Konfiguration eine Routine hinzugefügt werden. Anbei ein Screenshot zur Verdeutlichung.

Problematisch hierbei könnte sein, dass, wenn die Datenquelle vorher per “Gesamte Datenbank” oder “Ausgewählte Tabellen” angebunden war, alle Tabellen verloren gehen würden, die nicht als Einzelabfrage hinterlegt sind. Hier würde es Abhilfe schaffen die Datenquelle zu duplizieren und in der einen Datenquelle die “Gesamte Datenbank” aktiv zu lassen und in der “Kopie” lediglich die hinzugefügte Routine zu verwenden. Beide Datenquellen können dann zur Berichtsvorlage hinzugefügt werden.

Um es in den Worten von Galileo Galilei zu sagen:

Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will

1 Like

Recht herzlichen Dank, das sieht wie eine hervorragende Lösung aus!
Sobald ich meine PL/pgSQL Funktion fertig habe (hoffentlich morgen), probiere ich es damit und markiere Ihren Post als Solution.

Ich versuche gerade, die Einzelabfrage wie folgt zu definieren (in Report Server 26):

Der Funktionsheader in Postgres ist:

CREATE OR REPLACE FUNCTION public.sl_lieferzeiten(parent_sl_id character, parent_menge numeric)
RETURNS TABLE (sn character, lieferwochen numeric, bedarf numeric, rest_verfuegbar numeric, bezeichn character)

So weit so gut, Funktion & Parameter erkannt, “Abfrage testen” liefert “OK”.
Nur dass nach “Übernehmen” und dann “Verbindung testen” kommt die Fehlermeldung:

grafik

Warum wird public.sl_lieferzeiten(text, text) gesucht obwohl schon erkannt wurde, dass der 2. parameter numeric ist?

Ich habe zum Test meine PL/pgSQL Funktion verunstaltet damit die 2. Parameter als character übergeben und intern als numeric “gecastet” wird.
Das umgeht den Fehler bei “Verbindung testen”.
Mit dieser Datenquelle erzeuge ich eine neue Berichtsvorlage, nehme alle Defaults im Projektassistenten und wähle “Tabelle” zum Einfügen in den Berichtscontainer.
Unter “Datenquelle auswählen” erscheint dann meine _sl_lieferzeiten, aber wenn ich sie auswähle kommt:
grafik
Ich habe schon dem LL-Benutzer “Execute”-Rechte auf der Datenbankfunktion gegeben, daran sollte es nicht liegen.
Derzeit fällt mir nichts Weiteres ein…

Da haben wir Sie vmtl. in eine Falle gelockt. Hierbei handelt es sich tatsächlich um einen Fehler im Report Server. Gerne möchten wir Ihnen einen Patch zur Verfügung stellen, um das Problem zu beheben. Bitte öffnen Sie einen Supportcase und beziehen Sie sich dabei auf diesen Thread.

1 Like

Danke! Werde ich gleich machen.

Wenn ich es richtig verfolgt habe funktioniert bei Ihnen jetzt alles, inklusive numerischer Parameter für Funktionen, richtig :slight_smile: ? Dann geben wir die Änderungen mit dem nächsten Servicepack für alle frei.

1 Like

Ja, bei mir geht nun alles, was ich brauche, Danke! :grinning:
Mir sind beim aktuellen Stand auch keine ungewollte Nebenwirkungen aufgefallen.

Ist eine sehr schöne Lösung, auch mit der Parameterdefinition.
Es wäre vielleicht nett, in einer zukünftige Version auch die Eigenschaft “Dargestellter Wert” für Werte “Aus Datenquelle” dort festlegen zu können (wenn ich dies nicht einfach übersehen habe); Das wäre aber eher etwas für den “Idea Place”.

2 Likes

Vielen Dank für das Feedback. Zu Ihrem Vorschlag: das planen wir in der Tat für die Version 27 (bzw. “works on my machine” :wink: ), der entsprechende Logeintrag ist

Parametrized data sources now support to pass a “displayformula” option in order to set the displayed value for the auto generated parameter. This allows to use ID values for the parameter itself while displaying a user friendly substitution.

Damit können Sie dann genau das machen.

1 Like