~~Title: Automatische Auswahllisten aufgrund des DB Modells~~
Eine der aufwändigsten Aufgaben bei der Erstellung von Applikationen ist die Definition von Auswahllisten. Diese verursachen sehr viel Source Code und der Entwickler verschwendet wertvolle Zeit die er bei komplexeren Aufgaben gut gebrauchen könnte.
Im Prinzip können Auswahllisten für Datenbankapplikationen größtenteils automatisch erstellt werden, sofern das zugrundeliegende Datenmodell sauber designed wurde, sprich PKs, UKs, FKs vorhanden sind.
Aufgrund der Beziehungen zwischen den Tabellen übernimmt JVx, auf Wunsch, die Erstellung der Auswahllisten.
== Anwendungsbeispiel ==
Wir verwenden eine einfache Kontakt Verwaltung als Beispiel:
{{:jvx:client:model:databook:contacts_admin.png?nolink|}}
Zu jedem Kontakt werden Anrede, Titel, Ort und Versicherung erfasst. Das Datenmodell sieht wie folgt aus:
{{:jvx:client:model:databook:contacts.png?nolink|}}
Als Auswahllisten sollen Ort, Anrede, Titel und Versicherung angeboten werden.
Für gewöhnlich würden wir pro Tabelle in der Datenbank auch eine DBStorage benötigen. Wir benötigen jedoch nur eine einzige! In unserem Lifecycle Objekt am Server definieren wir also nur noch:
/**
* Returns the contacts storage.
*
* @return the Contacts storage
* @throws Exception if the initialization throws an error
*/
public DBStorage getContacts() throws Exception
{
if (dbsContacts == null)
{
dbsContacts = new DBStorage();
dbsContacts.setDBAccess(getDBAccess());
dbsContacts.setWritebackTable("CONTACTS");
dbsContacts.setAutoLinkReference(true);
dbsContacts.open();
}
return dbsContacts;
}
Der Befehl
setAutoLinkReference(true);
aktiviert die automatische Erkennung von Auswahllisten. Hierbei ist anzumerken das mit dem Befehl:
DBStorage.setDefaultAutoLinkReference(false);
die automatische Erkennung generell akt-/deaktiviert werden kann.
//This option is activated by default!//
\\
Am Client benötigen wir folglich auch nur noch ein einziges RemoteDataBook:
RemoteDataBook rdbContacts = new RemoteDataBook();
rdbContacts.setDataSource(dataSource);
rdbContacts.setName("contacts");
rdbContacts.open();
Die Auswahllisten werden automatisch erstellt und zugewiesen. Der Entwickler muss nur mehr eingreifen, wenn die Spalten die in den Auswahllisten angeboten werden, nicht den gewünschten entsprechen.
== Auswahllisten konfigurieren ==
Die Spalten, die in den automatisch erstellten Auswahllisten angezeigt werden unterliegen folgenden Regeln:
Angezeigt werden PK und UK Spalten bzw. wenn keine UKs vorhanden sind, werden alle Spalten der Tabelle angezeigt.
Im Ausgangs DBStorage wird automatisch eine neue Spalte eingefügt. Diese Spalte wird aus der Auswahl-Tabelle ermittelt und entspricht der ersten Text Spalte.
Um die Spalten der Auswahllisten einzuschränken ist es also ausreichend einen UK in der Auswahl-Tabelle zu definieren. Sollte dies nicht ausreichen, besteht weiters die Möglichkeit die Auswahlliste manuell zu hinterlegen:
/**
* Returns the contacts storage.
*
* @return the Contacts storage
* @throws Exception if the initialization throws an error
*/
public DBStorage getContacts() throws Exception
{
if (dbsContacts == null)
{
dbsContacts = new DBStorage();
dbsContacts.setDBAccess(getDBAccess());
dbsContacts.setFromClause("V_CONTACTS");
dbsContacts.setWritebackTable("CONTACTS");
dbsContacts.setAutoLinkReference(true);
dbsContacts.open();
dbsContacts.getMetaData().getColumnMetaData("COUNTRY").setLinkReference(
new StorageReferenceDefinition(new String[] {"CTRY_ID", "COUNTRY"},
"countries",
new String[] {"ID", "COUNTRY"}));
//another way to set a link reference, for more than one column: CTRY_ID, COUNTRY
dbsContacts.createAutomaticLinkReference(new String[] {"CTRY_ID", "COUNTRY"},
getCountries(),
new String[] {"ID", "COUNTRY"});
}
return dbsContacts;
}
/**
* Returns the countries storage.
*
* @return the Countries storage
* @throws Exception if the initialization throws an error
*/
public DBStorage getCountries() throws Exception
{
...
}
Bei der manuellen Definition von Auswahllisten muss beachtet werden, daß die Referenzspalten ebenfalls manuell definiert werden müssen. Aus diesem Grund verwenden wir eine Datenbank-View für die Selektion der Daten. Diese View beinhaltet das Feld COUNTRY. Das Feld ist in unserer Ausgangstabelle nicht enthalten, soll aber am Client als Auswahlliste angeboten werden!
\\
**Hinweis**
Die Verwendung von automatischen Auswahllisten ist nur bei direktem Gebrauch von Tabellen zu empfehlen, da mit Datenbank-Views die Erkennung der Beziehungen (noch) nicht möglich ist. Verwendet man dennoch die manuelle Definition der Auswahllisten, so entfällt zumindest die Definition der Auswahllisten am Client und spart etwas Zeit.