UITable und postgres function mit Parametern
8 posts
• Page 1 of 1
UITable und postgres function mit Parametern
Hallo,
mir ist das Konzept UITable im Zusammenhang mit z.B. Views klar.
Jetzt stehe ich aber vor der Herausforderung, dass die Daten für eine UITable von einer psql function, die Parameter erwartet, kommen sollen. Ich kann leider aus Performancegründen nicht den Umweg über eine View gehen, die alle Ergebnisse der psql function ausliest...
Was fällt euch dazu ein? Wie könnte ich das lösen?
Danke
Martin Zeller
mir ist das Konzept UITable im Zusammenhang mit z.B. Views klar.
Jetzt stehe ich aber vor der Herausforderung, dass die Daten für eine UITable von einer psql function, die Parameter erwartet, kommen sollen. Ich kann leider aus Performancegründen nicht den Umweg über eine View gehen, die alle Ergebnisse der psql function ausliest...
Was fällt euch dazu ein? Wie könnte ich das lösen?
Danke
Martin Zeller
- mzeller
- Posts: 27
- Joined: Tue Apr 19, 2016 10:48 am
- Location: Vienna
Re: UITable und postgres function mit Parametern
Sie können jederzeit eine eigene Storage erstellen und CRUD implementieren wie Sie es benötigen. Der Aufwand ist relativ gering im Normalfall. Sie können von der AbstractMemStorage ableiten bei Bedarf oder IStorage selbst implementieren.
Wenn Sie nur die Fetch Methode benötigen, können Sie auch nur diese von der DBStorage überschreiben.
Eventuell ist aber dieser Artikel interessant: Stored Procedures statt Tables oder Views
Wenn Sie nur die Fetch Methode benötigen, können Sie auch nur diese von der DBStorage überschreiben.
Eventuell ist aber dieser Artikel interessant: Stored Procedures statt Tables oder Views
-
Support@SIB - Posts: 353
- Joined: Mon Sep 28, 2009 1:56 pm
Re: UITable und postgres function mit Parametern
Ok, das ist mir klar.
Was ich aber nicht verstehe, ist, wie ich die Parameter übergeben kann. Der UITable gebe ich ein RemoteDataBook, wo ich per setName sagen kann, welche Methode der DataSource verwendet werden soll. Aber wie übergebe ich nun Parameter an diese Methode?
Was ich aber nicht verstehe, ist, wie ich die Parameter übergeben kann. Der UITable gebe ich ein RemoteDataBook, wo ich per setName sagen kann, welche Methode der DataSource verwendet werden soll. Aber wie übergebe ich nun Parameter an diese Methode?
- mzeller
- Posts: 27
- Joined: Tue Apr 19, 2016 10:48 am
- Location: Vienna
Re: UITable und postgres function mit Parametern
Sind die Parameter fix pro Benutzer/Session oder können die Werte vom Benutzer eingegeben werden?
Bei fixen Werten kann am Server eine eigene Storage verwendet werden, die fetch überschreibt und die Parameter ausliest aus zB dem SessionContext?
Sie können vom Client via Filter oder Master Reference bestimmte Werte an die Fetch Methode der Storage "senden". Die Auswertung erfolgt dann in der fetch Methode, siehe Search column in Condition.
Es besteht auch die Möglichkeit, das Sie vor der Aktualisierung der Daten, eine Methode vom LifeCycle Objekt oder von der gewünschten Storage aufrufen. Dadurch wird das Objekt zwar stateful, aber das stellt kein Problem dar in ihrem Fall... sofern der Aufruf immer vor der Datenaktualisierung erfolgt.
Es gibt verschiedenste Möglichkeiten das zu lösen, aber ohne genaue Beschreibung des Anwendungsfalles wird es jetzt schwer.
Bei fixen Werten kann am Server eine eigene Storage verwendet werden, die fetch überschreibt und die Parameter ausliest aus zB dem SessionContext?
Sie können vom Client via Filter oder Master Reference bestimmte Werte an die Fetch Methode der Storage "senden". Die Auswertung erfolgt dann in der fetch Methode, siehe Search column in Condition.
Es besteht auch die Möglichkeit, das Sie vor der Aktualisierung der Daten, eine Methode vom LifeCycle Objekt oder von der gewünschten Storage aufrufen. Dadurch wird das Objekt zwar stateful, aber das stellt kein Problem dar in ihrem Fall... sofern der Aufruf immer vor der Datenaktualisierung erfolgt.
Es gibt verschiedenste Möglichkeiten das zu lösen, aber ohne genaue Beschreibung des Anwendungsfalles wird es jetzt schwer.
-
Support@SIB - Posts: 353
- Joined: Mon Sep 28, 2009 1:56 pm
Re: UITable und postgres function mit Parametern
Der Anwendungsfall ist, vereinfacht gesagt, folgender:
In der Postgres-Db habe ich eine Funktion, die zwei Parameter erwartet. Ein Von- und ein Bis-Datum.
Am Client soll der Benutzer aus Performancegründen das Von- und Bis-Datum auswählen bevor noch irgendein Datenbankzugriff geschieht. Die ausgewählten Daten werde an die Postgres-Funktion übergeben und am Client die UITable mit den Ergebnisdatensätzen befüllt.
Das SQL-Statement hat dann vereinfacht diese Form:
select get_methode(vondatum, bisdatum);
Danke.
In der Postgres-Db habe ich eine Funktion, die zwei Parameter erwartet. Ein Von- und ein Bis-Datum.
Am Client soll der Benutzer aus Performancegründen das Von- und Bis-Datum auswählen bevor noch irgendein Datenbankzugriff geschieht. Die ausgewählten Daten werde an die Postgres-Funktion übergeben und am Client die UITable mit den Ergebnisdatensätzen befüllt.
Das SQL-Statement hat dann vereinfacht diese Form:
select get_methode(vondatum, bisdatum);
Danke.
- mzeller
- Posts: 27
- Joined: Tue Apr 19, 2016 10:48 am
- Location: Vienna
Re: UITable und postgres function mit Parametern
OK, der Anwendungsfall ist klar.
Zur Vollständigkeit:
Warum genau benötigen Sie die Funktion und verwenden keine View bzw. direkt ein Statement?
Zur Vollständigkeit:
Warum genau benötigen Sie die Funktion und verwenden keine View bzw. direkt ein Statement?
-
Support@SIB - Posts: 353
- Joined: Mon Sep 28, 2009 1:56 pm
Re: UITable und postgres function mit Parametern
Es handelt sich hier um komplexe statistische Berechnungen und da die Teile, die ich für meinen Fall zusammensetzen muss, bereits als Postgres-Funktionen implementiert sind, muss ich diese in einer eigenen Funktion nutzen. Eine Neuimplementierung kommt leider nicht in Frage.
Ich habe mir bereits überlegt, ob ich diese Daten nicht einfach in eine Tabelle schreibe (weil sie sich ohnehin historisch nicht mehr ändern) und dann per View auslese. Aber ich dachte mir eigentlich, dass mein Fall ja nicht so speziell sein kann, dass das Problem noch niemand hatte.
Also was würdet ihr vorschlagen?
Ich habe mir bereits überlegt, ob ich diese Daten nicht einfach in eine Tabelle schreibe (weil sie sich ohnehin historisch nicht mehr ändern) und dann per View auslese. Aber ich dachte mir eigentlich, dass mein Fall ja nicht so speziell sein kann, dass das Problem noch niemand hatte.
Also was würdet ihr vorschlagen?
- mzeller
- Posts: 27
- Joined: Tue Apr 19, 2016 10:48 am
- Location: Vienna
Re: UITable und postgres function mit Parametern
So trivial ist das leider nicht.
Es gibt seit JVx 2.5 den Support für dynamische Parameter, z.B:
Die Parameter werden aus der Fetch Condition ermittelt und "ignoriert" fürs eigentliche Statement.
Es wird komplex bei der Verwendung von dynamischen Parametern in der FROM clause, weil die DBStorage die Metadaten ermittelt und zu diesem Zeitpunkt noch keine Condition vorhanden ist. Somit müsste die Funktion mit null Werten aufgerufen werden. Allerdings ist nicht bekannt um welchen Datentyp es sich beim Parameter handelt (Integer, String, Datum, ...). Im Moment ist es bei der DBStorage nicht möglich, die Typen für dynamische Parameter zu definieren.
Um zum Ziel zu kommen, sollten Sie auf jeden FAll JVx 2.6 einsetzen da damit die dynamischen Parameter besser behandelt werden als mit 2.5.
Sie müssen aber etwas tricksen um die Typ-Probleme zu umgehen, sprich sie müssen null vermeiden:
Server Code
Vor dem open() call müssen fixe Werte übergeben werden, die nicht null sind. Das wird für die Ermittlung der Metadaten benötigt.
Danach kann auf dynamische Parameter gewechselt werden. Allerdings sollten Sie immer darauf achten, das die Werte ungleich null sind. Sie sollten also Leerstring oder -1 verwenden.
Client Code
Wir werden die Unterstützung für dynamische Parameter weiter verbessern, aber im Moment müssen Sie sich an obiges halten. Natürlich können Sie jederzeit eine eigene Storage implementieren, wie bereits vorgeschlagen. Dann hätten Sie keinerlei Einschränkungen.
Es gibt seit JVx 2.5 den Support für dynamische Parameter, z.B:
- Code: Select all
dbs.setFromClause("getVIP(:FROM, :TO)");
Die Parameter werden aus der Fetch Condition ermittelt und "ignoriert" fürs eigentliche Statement.
Es wird komplex bei der Verwendung von dynamischen Parametern in der FROM clause, weil die DBStorage die Metadaten ermittelt und zu diesem Zeitpunkt noch keine Condition vorhanden ist. Somit müsste die Funktion mit null Werten aufgerufen werden. Allerdings ist nicht bekannt um welchen Datentyp es sich beim Parameter handelt (Integer, String, Datum, ...). Im Moment ist es bei der DBStorage nicht möglich, die Typen für dynamische Parameter zu definieren.
Um zum Ziel zu kommen, sollten Sie auf jeden FAll JVx 2.6 einsetzen da damit die dynamischen Parameter besser behandelt werden als mit 2.5.
Sie müssen aber etwas tricksen um die Typ-Probleme zu umgehen, sprich sie müssen null vermeiden:
Server Code
- Code: Select all
DBStorage dbs = new DBStorage();
dbs.setDBAccess(dba);
dbs.setFromClause("getVIP(0, 0)");
dbs.open();
dbs.setFromClause("getVIP(:FROM, :TO)");
Vor dem open() call müssen fixe Werte übergeben werden, die nicht null sind. Das wird für die Ermittlung der Metadaten benötigt.
Danach kann auf dynamische Parameter gewechselt werden. Allerdings sollten Sie immer darauf achten, das die Werte ungleich null sind. Sie sollten also Leerstring oder -1 verwenden.
Client Code
- Code: Select all
dataBook.setFilter(new Equals("FROM", BigDecimal.valueOf(300)).and(new Equals("TO", BigDecimal.valueOf(1000))));
Wir werden die Unterstützung für dynamische Parameter weiter verbessern, aber im Moment müssen Sie sich an obiges halten. Natürlich können Sie jederzeit eine eigene Storage implementieren, wie bereits vorgeschlagen. Dann hätten Sie keinerlei Einschränkungen.
-
Development@SIB - Posts: 325
- Joined: Mon Sep 28, 2009 1:54 pm
8 posts
• Page 1 of 1