XdevTable

Anfang  Zurück  Vor

Letzte Änderung 13.02.2014

 

Die Komponente XdevTable ist eine leistungsfähige Tabellen-Komponente, mit der sich Datensätze ausgeben, sortieren, selektieren und editieren lassen. Nach dem Einfügen einer XdevTable im GUI-Builder wird die Komponente zunächst nur als Dummy dargestellt, da noch keine Informationen über die Tabellenstruktur vorliegen, u.a. Anzahl, Breite, Beschriftung und Datentyp der einzelnen Spalten. Erst mit Zuweisung einer Virtuellen Tabelle werden diese Informationen an die XdevTable übergeben und die Tabelle wird im GUI-Builder entsprechend angezeigt.

 

Gefüllt wird eine XdevTable i.d.R. mit den Daten einer Virtuellen Tabelle, die der XdevTable mit der Methode setModel( ) zugewiesen wird, z.B. table.setModel(Fahrzeuge.VT). Die Beschriftung der Spalten wird standardmäßig von den Datenfeldern der Virtuellen Tabelle übernommen. Die für Endanwender oft nur schwer nachvollziehbaren Datenfeld-Bezeichnungen lassen sich im VT-Editor durch individuelle Beschriftungen oder im Falle einer mehrsprachigen Oberfläche durch Variablen ersetzen.

 

Beim Füllen einer XdevTable werden keine Datensätze zwischen Virtueller Tabelle und XdevTable übertragen. Die Komponente XdevTable besitzt keinen eigenen Datenspeicher. XdevTable und Virtuelle Tabelle werden lediglich miteinander verknüpft. Die Virtuelle Tabelle wird dadurch zum Datenspeicher (Datenschicht bzw. Datenmodel) für die bis dahin noch unvollständige und deshalb noch nicht funktionsfähige XdevTable (MVC-Konzept - Model-View-Control). Die von einer XdevTable angezeigten Daten sind somit immer die Daten einer Virtuellen Tabelle.

 

 

 

Standard-Funktionen

 

Die Komponente XdevTable kann jedoch weit aus mehr als nur Daten anzeigen. Die interne Steuerungseinheit (Controller) bietet bereits einen respektablen Umfang an Standardfunktionen, u.a.

Reihenfolge der Zeilen auf- und absteigend sortierbar.

Spaltenbreite per drag&drop individuell einstellbar.

Reihenfolge der Spalten per drag&drop vertauschbar.

Zeilen selektierbar. Auch Mehrfachauswahl ist möglich.

Daten editierbar. Dabei werden je nach Datentyp automatisch entsprechend geeignete Editoren angezeigt, z.B. ein einfaches Texteingabefeld für Strings, eine ComboBox für Foreign-Keys (Integer) oder ein Datepicker für Date und Timestamps.

 

Wenn sich Daten in der Virtuellen Tabelle ändern, z.B. durch Hinzufügen oder Löschen von Zeilen, dann wird diese Änderung automatisch in der XdevTable auf dem Bildschirm angezeigt. Entsprechende Aktualisierungen (Refresh) laufen bei der XdevTable vollautomatisch im Hintergrund ab, sodass Sie sich darum nicht kümmern müssen.

 

Die Verbindung zwischen einer XdevTable und einer Virtuellen Tabelle wird nur dann aufgelöst, wenn die Table mit einer anderen Virtuellen Tabelle gefüllt wird, wodurch die XdevTable ein neues Model erhält.

 

Nach Erstzulassungsdatum sortierte Tabelle

clip0082

Die Steuerungseinheit der Table-Komponente ermöglicht u.a. auf- und absteigendes Sortieren der Daten.

 

Nach Marke sortierte Tabelle

clip0083

Die Sortierung der Datensätze erfolgt nur in der Table, nicht in der Virtuellen Tabelle.

 

 

Hinweis: Das Sortieren mit der XdevTable-Sortierfunktion wirkt sich nicht auf die Virtuelle Tabelle aus. Die Reihenfolge der Daten in der Virtuellen Tabelle bleibt dabei völlig unverändert. Änderungen an der Virtuellen Tabelle werden dagegen in der Table angezeigt. Für das Sortieren der Daten direkt in der Virtuellen Tabelle stellt die Virtuelle Tabelle die Methode sortByCol( ) zur Verfügung.

 

 

 

Lazy-Loading

 

Mit Hilfe der Eigenschaft Lazy Loading lässt sich für die XdevTable Lazy-Loading aktivieren.

 

clip0534

 

 

 

Spalten-Beschriftung

 

Die XdevTable verwendet standardmäßig die Datenfeld-Namen der Virtuellen Tabelle als Spaltennamen. Entwickler vergeben ihren Datenfeldern jedoch meist fachbezogene, technische Bezeichnungen wie MODELL_ID oder für Außenstehende kaum mehr nachvollziehbare, intern verwendete Abkürzungen wie LstEkPr für Listeneinkaufspreis, sodass die Datenfeldnamen als Spaltennamen meist ungeeignet sind. Im Virtuellen Tabellen Editor können Sie deshalb für jede Tabellenspalte bei Beschriftung eine passende Beschriftung festlegen. Für mehrsprachige Oberflächen können Sie hier auch Textvariablen angeben, z.B. {$model}, sodass die Beschriftungen aus einer Sprachdatei ausgelesen werden. Bei Format können Sie zudem einzelne Datenfelder ausblenden, was i.d.R. bei der Datensatz-ID notwendig ist und darüber hinaus Formatierungen festlegen, z.B. Währungszeichen, Datum etc.

 

clip0089

 

 

 

Daten editieren

 

clip0084

 

Die XdevTable lässt auch das Editieren von Daten zu. Wählen Sie dazu XdevTable > Eigenschaften > Editierbar an. Nach Abschluss der Eingabe mit Enter erfolgt automatisch eine Eingabeprüfung, die an Hand des Datentyps nur plausible Eingaben zulässt. Unpassende Eingaben werden dagegen automatisch verworfen. Anders als bei einem Formular lassen sich mit einer editierbaren XdevTable beliebig viele Datensätze in beliebiger Reihenfolge ändern und sämtliche Änderungen auf einmal abspeichern. Dafür bietet die Virtuelle Tabelle die Methode synchronizeChangedRows( ). Damit werden alle Änderungen, die in der Virtuellen Tabelle vorgenommen wurden, in der dazugehörigen Datenbanktabelle gespeichert. Zwischenzeitliche Änderungen in der Datenbanktabelle werden jedoch nicht berücksichtigt. D.h., die Synchronisierung erfolgt nur in Richtung Virtuelle Tabelle > Datenbanktabelle. Da bei dieser Methode der Datenänderung viele Datensätze betroffen sein können, erfolgt die Speicherung der Daten automatisch als Transaktion.

 

try
{
   Fahrzeuge.VT.synchronizeChangedRows();
}
catch(DBException e)
{
   // TODO Auto-generated code
   e.printStackTrace();
}

 

Um eine Synchronisierung der Daten auch in Richtung Datenbanktabelle > Virtuelle Tabelle zu erreichen, müssen Sie die XdevTable mit Hilfe der XdevTable-Methode setModel( ) aktualisieren.

 

try
{
   Fahrzeuge.VT.synchronizeChangedRows();

   table.setModel(Fahrzeuge.VT, "*", true);
}
catch(DBException e)
{
   // TODO Auto-generated code
   e.printStackTrace();
}

 

 

Hinweis: Der Einsatz editierbarer Tabellen kann erhebliche Probleme mit sich bringen, da diese Variante nicht nur jedem Anwender die Änderung beliebiger Datensätze auf einmal, sondern auch die zeitgleiche Änderung derselben Daten erlaubt und darüber hinaus zwischenzeitliche Änderungen in der Datenbank nicht automatisch in der Tabelle angezeigt werden. In Folge dessen kann es an unzähligen Stellen zu konkurrierenden Schreibzugriffen und inkonsistenten Daten kommen, was bei Multi-User-Anwendungen sehr schnell zu einem fatalen Datenchaos führen kann.

 

Tipp: Deutlich unproblematischer ist das Editieren von Daten mit Hilfe der Formular-Komponente XdevFormular, da zum einen immer nur 1 Datensatz bearbeitet wird und die Komponente zum anderen ein pessimistisches Sperrverfahren für editierte Datensätze zur Verfügung stellt. Die dazugehörige API wurde so konzipiert, dass Sie dieses Sperrverfahren mit nur geringem Programmieraufwand auch auf editierbare Tabellen anwenden können.

 

 

 

Selektierte Zeile auslesen

 

clip0550

 

Für das Auslesen der selektierten Zeile bietet Ihnen die XdevTable die Methode getSelectedVirtualTableRow( ).

 

VirtualTableRow row = table.getSelectedVirtualTableRow();

 

Als Ergebnis erhalten Sie alle Werte dieser Zeile als VirtualRableRow, z.B. [8, BMW, 3, M3, 420, 2009-08-21, 0, 7, Coupe, 1, Neuwagen, 1, Benzin, 3, Schaltgetriebe, 3, schwarz, 66000.0].

 

Mit der Methode get( ) und der Angabe der Spalte können Sie anschließend gezielt Werte aus der VirtualTableRow auslesen. Die Spalte kann dabei wahlweise als Index (Reihenfolge der Spalte in der Virtuellen Tabelle, beginnend mit 0), als String oder als VT-Datenfeld-Konstante angegeben werden, wobei die Angabe als VT-Konstante empfehlenswert ist.

 

double preis;
preis = row.get(17);

 

double preis;
preis = row.get("PREIS");

 

double preis;
preis = row.get(Fahrzeuge.VT.PREIS);

 

 

 

Achtung: Für das Auslesen von Werten in einer XdevTable sind die, auf den ersten Blick als Alternative geeigneten Methoden der Virtuellen Tabelle, u.a. getRow( ), getRowAsList( ), getRowData( ) oder getValueAt( ), nicht geeignet. Denn um mit diesen VT-Methoden auf einen Wert in einer Virtuellen Tabelle zugreifen zu können, muss man die Zeile, bzw. den Index der Zeile angeben (Parameter row), in der sich der gewünschte Wert befindet.

 

int row = table.getSelectedRow();
double preis = Fahrzeuge.VT.getValueAt(row,Fahrzeuge.VT.PREIS);

 

Den Zeilen-Index row für diesen Zweck von der selektierten Zeile der XdevTable mit der XdevTable-Methode getSelectedRow( ) abzuleiten ist jedoch problematisch. Bei der XdevTable kann sich nämlich durch Anwendung der Sortierfunktion die Reihenfolge der Zeilen ändern, während die Reihenfolge der Zeilen in der Virtuellen Tabelle jedoch immer gleich bleibt. Da gem. MVC-Pattern das Model (Virtuelle Tabelle) nicht von der View (XdevTable) verändert werden darf, erzeugt die XdevTable für die Sortierung intern eine Kopie der Virtuellen Tabelle.

 

Das bedeutet, dass nach einer Sortierung der XdevTable die Zeilen der XdevTable und der Virtuellen Tabelle eine völlig andere Reihenfolge besitzen. Ein in der XdevTable selektierter Datensatz wird nicht mehr mit dem Datensatz übereinstimmen, der sich in der Virtuellen Tabelle an derselben Zeilen-Position befindet, obwohl beide Datensätze denselben Zeilen-Index row besitzen. Wenn Sie nun die selektierte Zeile mit einer VT-Methode wie getValueAt( ) auslesen und dabei den Zeilen-Index row der XdevTable mit getSelectedRow( ) ermitteln, werden Sie einen völlig anderen Datensatz erhalten.

 

Vor dem Sortieren:

 

clip0365

 

 

 

 

clip0359

clip0368   clip0366


Virtuelle Tabelle Modelle


Reihenfolge der Zeilen der Virtuellen Tabelle und der XdevTable sind zunächst identisch.


 

Nach dem Sortieren:

 

clip0368   clip0367

 

 

 

 

clip0359

clip0365


Neue Reihenfolge der Zeilen nach dem Sortieren über die Spalte MODELL.


Die Reihenfolge der Zeilen in der Virtuellen Tabelle Modelle bleibt unverändert.


 

Beim Auslesen der in der XdevTable selektierten Zeile 54, 2 Sport, Mazda, erhält man die Werte, die an derselben Stelle in der Virtuellen Tabelle stehen: 2,5er, BMW.

 

 

 

Tabelle drucken

 

Mit der Methode print( ) können Sie eine XdevTable ausdrucken. Wie bei einem Screenshot wird das gesamte Aussehen der Tabelle inklusive Kopfzeile, Linien und individuellen Einfärbungen von der XdevTable übernommen. Da die Daten der View verwendet werden, wird auch die aktuelle Sortierung sowie eine vorausgehende Filterung übernommen. Die Tabelle wird für den Druck automatisch so skaliert, dass alle Spalten auf die Seite passen. Je mehr Spalten die XdevTable besitzt, desto kleiner wird dadurch die Schriftgröße. Anders als bei einem Screenshot werden nicht nur die sichtbaren, sondern tatsächlich alle Zeilen der XdevTable übernommen. Anders als bei den Spalten wird nicht versucht, alle Zeilen auf 1 Seite unter zu bringen. Sobald das Seitenende erreicht ist, erfolgt automatisch ein Seitenumbruch. Auch das Festlegen sämtlicher Druckeinstellungen ist möglich. Dazu erscheint automatisch das Standardfenster für die Druckeinstellungen. Der print( ) Aufruf muss in einem Try-Catch Block stehen.

 

try
{
   table.print();
}
catch(PrinterException e)
{
   // TODO Auto-generated code
   e.printStackTrace();
}

 

 

 

Wichtigste Methoden

 

setModel

 

Legt das Model, d.h. die angezeigten Spalten und Datensätze für die Tabelle fest.

 

Wichtigste Überladungen:

setModel(VirtualTable vt)

vt - Die Virtuelle Tabelle, welche als Model für diese XdevTable genutzt werden soll. Es werden alle in der VT vorgenommenen Einstellungen für die Anzeige berücksichtigt, z.B. Sichtbare Spalten oder Währungsformatierungenetc.

// Hier wird die Virtuelle Tabelle "Fahrzeuge" als Model für die Tabelle festgelegt
table.setModel(Fahrzeuge.VT);

 

Keine statische VT als Model festlegen:

// Virtuelle Tabelle erstellen und befüllen
VirtualTable vt = XDEV.Query(new Query()
{
   @Override
   public void init()
   {
      setDataSource(InternH2DataSource.DB);
      
      from("FAHRZEUGE");
      select("FAHRZEUGE","ID").into(Fahrzeuge.ID);
      select("FAHRZEUGE","MODELL_ID").into(Fahrzeuge.MODELL_ID);
      select("FAHRZEUGE","PREIS").into(Fahrzeuge.PREIS);
      
      setVirtualTable(Fahrzeuge.VT);
      setFillMethod(VirtualTableFillMethod.OVERWRITE);               
   }
});
 
// Hier wird die Virtuelle Tabelle "vt" als Model für die Tabelle festgelegt
table.setModel(vt);

 

Die Dokumentation zu der in diesem Beispiel genutzten Methode XDEV.Query() können Sie hier einsehen.

 

 

setModel(VirtualTable vt, String columns, boolean queryData) 

vt - Die Virtuelle Tabelle, welche als Model für diese XdevTable genutzt werden soll.

columns - Mit columns geben Sie Tabellenspalten an, welche in der XdevTable angezeigt werden sollen. Diese werden mit Kommas getrennt und als eine Zeichenkette übergeben.

queryData: Legt fest, ob ein Datenbank-Query auf der Datenbank ausgeführt werden soll. Steht z.B. queryData auf false und wurde die VT im Vorhinein noch nicht befüllt, so ist das Model leer und es werden nur die Spaltenüberschriften ohne Datensätze angezeigt.

// Hier wird die Virtuelle Tabelle "vt" als Model für die Tabelle festgelegt
table.setModel(Fahrzeuge.VT, "MODELL_ID, PREIS", false);

 

 

setModel(VirtualTable vt, String columns, SELECT select, Object... params) 

vt - Die Virtuelle Tabelle, welche als Model für diese XdevTable genutzt werden soll.

columns - Mit columns geben Sie Tabellenspalten an, welche in der XdevTable angezeigt werden sollen. Diese werden mit Kommas getrennt und als eine Zeichenkette übergeben.

select: Das SELECT-Objekt, durch welches die Tabelle gefiltert werden soll.

params: Etwaige Parameter, welche für das SELECT-Objekt benötigt werden. Kann null sein.

// Erstellt ein SELECT-Objekt und legt eine Abfrage fest
// Es sollen alle Fahrzeuge, die einen höheren Kilometerstand als 10000 haben, ausgelesen werden
SELECT select = new SELECT();
select.FROM(Fahrzeuge.VT);
select.WHERE(Fahrzeuge.KILOMETERSTAND.gt("?"));
 
//Hier wird der Select auf die Datenbank ausgeführt und der Parameter für den Kilometerstand > 10000 übergeben
//Danach wird die Virtuelle Tabelle "vt" als Model für die Tabelle festgelegt
table.setModel(Fahrzeuge.VT,"MODELL_ID, PRES, KILOMETERSTAND",select, 10000);

 

Ohne Parameter ist dies ebenfalls möglich:

// Erstellt ein SELECT-Objekt und legt eine Abfrage fest
// Es sollen alle Fahrzeuge, die einen höheren Kilometerstand als 10000 haben, ausgelesen werden
SELECT select = new SELECT();
select.FROM(Fahrzeuge.VT);
select.WHERE(Fahrzeuge.KILOMETERSTAND.gt(10000));
 
//Hier wird der Select auf die Datenbank ausgeführt
//Danach wird die Virtuelle Tabelle "vt" als Model für die Tabelle festgelegt
table.setModel(Fahrzeuge.VT,"MODELL_ID, PRES, KILOMETERSTAND",select, null);

 

 

setModel(TableModel model) 

model: Das TableModel, das als Model für die XdevTable definiert werden soll.

// Legt ein benutzerdefiniertes TableModel als Model für die XdevTable fest.
table.setModel(TableModel model);

 

Diese Methodenüberladung ist für erfahrene Java-Nutzer gedacht und setzt fortgeschrittenes Java-Wissen voraus.

Die Dokumentation zu dieser Methode mit einer Anleitung zur Erstellung eines benutzerdefinierten TableModels finden Sie hier.

 

 

getSelectedVirtualTableRow()

 

Gibt die Zeile der Virtuellen Tabelle zurück, welche gerade in der XdevTable selektiert ist.

Diese Methode wird benötigt, um z.B. das Locking programmatisch zu implementieren, ein Formular zu befüllen oder Datensätze zu löschen.

Rückgabewert - Die in der Tabelle ausgewählte Zeile der verknüpften Virtuellen Tabelle.

//Liest die akutell ausgewählte Tabellenzeile aus
VirtualTableRow row = table.getSelectedVirtualTableRow();
 
//Lädt den ausgewählten Datensatz zur Bearbeitung in ein Formular
formular.setModel(row);

 

 

getVirtualTable()

 

Gibt die verbundene Virtuelle Tabelle zurück, welche als TableModel für die Tabelle dient.

Rückgabewert - Die Virtuelle Tabelle als VirtualTable-Objekt, welche als TableModel für die XdevTable festgelegt ist.

//Gibt die Virtuelle Tabelle, welche als TableModel für die Tabelle dient, zurück
VirtualTable vt = table.getVirtualTable();