UITable und postgres function mit Parametern

Allgemeine Fragen zur Entwicklung von und mit JVx.

UITable und postgres function mit Parametern

Postby mzeller » Fri Dec 30, 2016 10:07 am

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
mzeller
 
Posts: 22
Joined: Tue Apr 19, 2016 10:48 am
Location: Vienna

Re: UITable und postgres function mit Parametern

Postby Support@SIB » Mon Jan 02, 2017 11:07 am

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
User avatar
Support@SIB
 
Posts: 200
Joined: Mon Sep 28, 2009 1:56 pm

Re: UITable und postgres function mit Parametern

Postby mzeller » Thu Jan 05, 2017 5:04 pm

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?
mzeller
 
Posts: 22
Joined: Tue Apr 19, 2016 10:48 am
Location: Vienna

Re: UITable und postgres function mit Parametern

Postby Support@SIB » Mon Jan 09, 2017 12:14 pm

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.
User avatar
Support@SIB
 
Posts: 200
Joined: Mon Sep 28, 2009 1:56 pm

Re: UITable und postgres function mit Parametern

Postby mzeller » Mon Jan 09, 2017 1:14 pm

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.
mzeller
 
Posts: 22
Joined: Tue Apr 19, 2016 10:48 am
Location: Vienna

Re: UITable und postgres function mit Parametern

Postby Support@SIB » Mon Jan 09, 2017 1:40 pm

OK, der Anwendungsfall ist klar.

Zur Vollständigkeit:
Warum genau benötigen Sie die Funktion und verwenden keine View bzw. direkt ein Statement?
User avatar
Support@SIB
 
Posts: 200
Joined: Mon Sep 28, 2009 1:56 pm

Re: UITable und postgres function mit Parametern

Postby mzeller » Mon Jan 09, 2017 3:39 pm

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?
mzeller
 
Posts: 22
Joined: Tue Apr 19, 2016 10:48 am
Location: Vienna

Re: UITable und postgres function mit Parametern

Postby Development@SIB » Tue Jan 10, 2017 1:12 pm

So trivial ist das leider nicht.

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.
User avatar
Development@SIB
 
Posts: 311
Joined: Mon Sep 28, 2009 1:54 pm


Return to Entwicklung