This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Referenzen in einer Tabelle

Allgemeine Fragen zur Entwicklung von und mit JVx.

Referenzen in einer Tabelle

Postby jsmw » Thu Jun 02, 2011 11:00 am

Ich habe die Tabellen "users <-n:1-> countries <-n:1-> currencies" mit entsprechenden FK in den Tabellen. Wenn ich im JVx die Tabelle users darstelle, dann löst JVx den Fremdschlüssel schön auf (wegen *_id) und es wird die Spalte aus countries mit der Bezeichnung 'Name' angezeigt. Wie kann ich die Spaltenbezeichnung ändern? (Die letzte Zeile im BeispielCode macht es nicht.)

Code: Select all
rdbUsers.setDataSource(dataSource);
rdbUsers.setName("users");
rdbUsers.open();
rdbUsers.getRowDefinition().getColumnView(null).removeColumnNames("email");
rdbUsers.getRowDefinition().getColumnDefinition("country_id").setLabel("countries.name");



Wenn ich nun zusätzlich bei jedem user den Währungs-ISO-Code aus currencies anzeigen mögchte (2 Ebene Ref.), was ist hier die empfohlene Vorgehensweise und evtl. warum?

a) Auf eine entsprechende View zugreifen?
create view v_users as
select u.firstname, u.lastname, c.name as country, cu.iso as currencyISO from
users u
inner join countries c on c.id = u.country_id
inner join currencies cu on cu.id = c.currency_id

b) Im Code definieren und JVx auflösen lassen?
Wie kann ich weiters mehrere Spalten oder eine gewisse aus einer referenzierten Tabelle in einer Zeile anzeigen lassen. Z.B. zusätzlich zum Namen von countries die Hauptstadt oder statt Name die Hauptstadt. Und das bezogen auf die zweite, dritte ... Ref.Ebene, wenn nicht über eine View mit joins.
Ist dann die Tabelle bei so einer verknüften Darstellung noch editierbar?

FG
Jan
jsmw
 
Posts: 38
Joined: Tue May 24, 2011 6:33 pm

Re: Referenzen in einer Tabelle

Postby Support@SIB » Thu Jun 02, 2011 11:27 am

Mit JVx wurde ein einheitlicher Zugriff auf Columns definiert. Siehe folgende Infos.

Sie müssten bei Ihrem Aufruf eigentlich eine Exception erhalten? Bitte immer die kompletten Infos posten denn "geht nicht" macht es schwierig die richtige Antwort zu geben.
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Referenzen in einer Tabelle

Postby Support@SIB » Thu Jun 02, 2011 11:48 am

Um die currencies anzuzeigen ist empfohlen eine View zu verwenden, da Änderungen damit problemloser durchzuführen sind. Wenn Ihre DB keine Views unterstützen sollte, können Sie das Statement auch direkt an die DBStorage übergeben.

Die Spaltenermittlung wird von JVx automatisch durchgeführt. Sollten die Spalten nicht die gewünschten sein, so muss das Mapping manuell geändert werden wie z.B. hier beschrieben. Wenn Sie keine Auswahlliste benötigen, dann ist die View alleine schon auch ausreichend für die Anzeige. Sie können auch einen Mischmodus verwenden, wobei die automatisch ermittelten Auswahllisten verwendet werden und für zusätzliche Spalten keine Auswahllisten vorhanden sind. Dafür eine View fürs lesen verwenden und die Tabelle als writebackTable definieren. Sie müssen in der View jedoch die korrekten Spaltenbezeichnungen wählen, damit die Auswahllisten aufgelöst werden können (am einfachsten vor dem Umbau die Spalten aus den MetaDaten ausgeben lassen).

Wenn Sie eine View erstellen, die Daten aus unterschiedlichen Ebenen anzeigt, so ist die Tabelle zwar editierbar, aber nur die Spalten der writebackTable können gespeichert werden. Es ist auch nicht die Daten aus tieferen Ebenen direkt zu ändern, da damit für ALLE Datensätze die Änderung durchgeführt werden würde. Das ist für den aktuellen User dann auch nicht ersichtlich. Die Stammdaten sollten immer gesondert behandelt werden!

Wenn Sie Änderungen dennoch durchführen "müssen" bieten sich Serverseitige Trigger an.
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Referenzen in einer Tabelle

Postby jsmw » Thu Jun 02, 2011 12:04 pm

Vielen Dank für die Antworten! Die nachstehende Zeile wirft keine Exception. Der angezeigte Tabellenname entspricht der DB-Tabelle, also 'countries.name' .

Code: Select all
rdbUsers.getRowDefinition().getColumnDefinition("country_id").setLabel("countries.name");



Ich verwende PostgreSQL und alle Tabellen- und Columnnamen sind in Kleinbuchstaben definiert. Beitrag über UPPER case habe ich gelesen.
jsmw
 
Posts: 38
Joined: Tue May 24, 2011 6:33 pm

Re: Referenzen in einer Tabelle

Postby Support@SIB » Thu Jun 02, 2011 1:55 pm

Die *_id Spalten sind im Normalfall nicht sichtbar, da müssten Sie schon die Defaults oder die RowDefinition geändert haben um die Spalte zu sehen? In Ihrem Codebeispiel ist das nicht zu sehen.

Sofern es keine Exception gibt, existiert der Spalten-Name und der Label sollte auch übernommen werden, sofern die Spalte sichtbar ist z.B. in einer Tabelle? Der Bezeichner countries.name ist für Benutzer allerdings nicht sehr praktisch.

Falls Sie den Namen ev. für Übersetzungen gewählt haben, dann können Sie ohne Probleme auch mit lesbaren Bezeichnern arbeiten.
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Referenzen in einer Tabelle

Postby jsmw » Thu Jun 02, 2011 10:30 pm

Info zu UPPER-Case und PostgreSQL:

Code: Select all
rdbUsers.getRowDefinition().getColumnView(null).removeColumnNames("EMAIL", "CITY");
rdbUsers.getRowDefinition().getColumnDefinition("STREET").setLabel("Straße");

bei 1. Zeile keine Wirkung und bei 2. Zeile Exception: Column 'STREET' doesn't exists in RowDefinition!

Nachstehendes funktioniert wie erwartet:
Code: Select all
rdbUsers.getRowDefinition().getColumnView(null).removeColumnNames("email", "city");
rdbUsers.getRowDefinition().getColumnDefinition("street").setLabel("Straße");


auch hier bekomme ich eine Exception, wenn Großbuchstaben: Column 'USER_ID' doesn't exist in detail DataBook 'usersRoles' ! (Mit Kleinbuchstaben lt. db-name funktioniert es.)
Code: Select all
masterUser.setReferencedColumnNames(new String[] { "ID" });
masterUser.setColumnNames(new String[] { "USER_ID" });


Grundsätzlich sind mir die Kleinbuchstaben wegen der Durchgängigkeit symphatischer und des Bezugs auf Methoden-Schreibweise:
Code: Select all
rdbUsers.setName("users");
...
public DBStorage getUsers() throws Exception { ...}
jsmw
 
Posts: 38
Joined: Tue May 24, 2011 6:33 pm

Re: Referenzen in einer Tabelle

Postby Support@SIB » Fri Jun 03, 2011 9:51 am

Vielen Dank für die Infos.
Unsere Unit tests mit einer PostgreSql DB und JVx 0.9, liefern die Spalten jedoch in Großbuchstaben.

Die Änderung ist erst in der Version JVx 0.9 enthalten und fehlte in den Betas bis inkl. beta-4.

Es wäre hilfreich wenn Sie uns die genaue JVx Version übermitteln könnten z.B.

Code: Select all
System.out.println(javax.rad.IPackageSetup.JVX_OS_VERSION);

Außerdem wären wir dankbar für die Ausgabe von

Code: Select all
System.out.println(rdbUsers);

direkt nach open.
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Referenzen in einer Tabelle

Postby jsmw » Sat Jun 04, 2011 9:06 pm

Danke! Zwei gute Hinweise mit
Code: Select all
System.out.println(javax.rad.IPackageSetup.JVX_OS_VERSION);
System.out.println(rdbUsers);


Es war die Version 0.8 aus dem Paket "Firstapp". Habe die Libs auf 0.9 geändert und nun funktioniert Upper-Case. Mit dem Befehl 'System.out.println(rdbUsers);' werden verschiedene, interessante Infos dargestellt, die bei der Entwicklung hilfreich sein können. Wenn Sie noch andere hilfreiche Debug-Befehle zur Analyse verwenden, bitte posten.

Werde ab nun die 1.0 Beta zum Ausprobieren verwenden.

Entspricht die Ausgabe von 'System.out.println(rdbUsers);' etwa der Serialisierungsform zwischen Client und Server? Oder verwenden Sie hier für XML bzw Json?
jsmw
 
Posts: 38
Joined: Tue May 24, 2011 6:33 pm

Re: Referenzen in einer Tabelle

Postby rjahn » Sun Jun 05, 2011 10:18 am

Für Debug Zwecke verwendet JVx ein Standard Logging. Sie können pro Klasse oder Package die Log Levels setzen:
Weitere Infos siehe Logging.

Die System.out Ausgabe ist eine simple Darstellung der Tabelle - ein simples toString(). Die Werte bzw. Daten haben keinen Bezug zur Serialisierung. Die Serialisierung arbeitet Byte optimiert um die bestmögliche Performance zu erzielen. Dafür kommt weder JSON noch XML zum Einsatz.
rjahn
 
Posts: 41
Joined: Sun Sep 13, 2009 1:54 pm


Return to Development (DE)