eva/3 Application BuilderEntwicklung eigener eva/3 KomponentenEntwicklung eigener Datenquellen 

Praktischer Einsatz des RecordSet

Filterung

Die Filterung wird in den meisten Fällen über FormattedField ausgelöst, welche eine FilteredTableSource und FilteredControlSource gesetzt haben. Hierbei werden für alle die auf das zu filternde TableElement verweisen, HSRecordSetCondition erzeugt und im RecordSet über FormattedField HSRecordSetCondition erzeugt und im setRecordSetConditions(RecordSetCondition[] conditions) gesetzt.

Bei Änderung eines Filterwertes wird vom TableElement anschließend ein refresh() auf das zugrunde liegende RecordSet abgesetzt.
Die refresh() Methode des RecordSets kann diese HSRecordSetCondition`s nun über getRecordSetConditions() auslesen und die Ergebnismenge dementsprechend einschränken.

Sortierung

Die Sortierung wird üblicherweise vom TableElement bestimmt, oder aber vom evtl. benutzten SScrollTable definiert. Hierbei wird für jede Sortierauswahl eine RecordSetOrderCondition generiert und im RecordSet über setRecordSetOrderConditions(RecordSetOrderCondition[] conditions) gesetzt.
Diese können dann z.B. in der refresh() Methode des RecordSet über getRecordSetOrderConditions() ausgelesen und verarbeitet werden.

Positionierung

Bei der Positionierung wird der Cursor innerhalb der verfügbaren Datenmenge auf einen anderen Satz platziert. Mit Cursor ist im folgenden die aktuell selektierte Zeile gemeint welche über getRow() auslesbar sein muss. Dieser befindet sich bei initialisierung vor dem ersten Datensatz. Hierbei werden folgende Methoden angesprochen

Methode Aufgabe
previos() der Cursor wird um eine Position nach unten verschoben
next() der Cursor wird um eine Position nach oben verschoben
first() der Cursor wird auf die erste Position gesetzt
last() der Cursor wird auf die letzte Position gesetzt
absolute(int i) der Cursor wird auf die übergebene Zeile gesetzt.
beforeFirst() setzt den Cursor vor den ersten Datensatz
afterLast() setzt den Cursor nach den letzten Datensatz
search(RecordSetCondition[] searchConditions) Positioniert den Datensatz anhand der übergebenen
RecordSetCondition`s. Nur in diesem Fall handelt es sich nicht um eine
Filterung, sondern es wird innerhalb der Ergebnismenge nach den
Bedingungen gesucht und dann der Cursor auf den ersten gefundenen Satz
positioniert. Hierbei wird also auch kein refresh() aufgerufen. Meistens
ist hierfür die SearchedTableSource im FormattedField
verantwortlich.
moveToInsertRow() Positioniert auch nach dem letzten Datensatz wobei allerdings
inserted auf true gesetzt werden sollte. Dies wird im nächsten
Abschnitt noch etwas näher erläutert.

Datenbearbeitung

Bei der Datenverarbeitung sollte mit einem extra cache für die aktuelle Zeile gearbeitet werden um Änderungen auch wieder zurücknehmen zu können. Wenn ein Objekt geupdatet wurde sollte setRowUpdated() auf true gesetzt werden.

Durch einen Aufruf von next() wird nämlich zuerst überprüft ob die aktuelle Zeile überhaupt geändert wurde. Ist im TableElement die Eigenschaft UpdateConfirm aktiviert kommt dann ein Dialog der für die Speicherung nachfragt.

Wird dieser bejaht wird ein updateRow() aufgerufen und die Daten aus dem cache müssen in den Originaldatenbestand übernommen werden.

Die Funktion insertRow() wird dann aufgerufen wenn isInserted() true zurückliefert. Dieses muss vom Benutzer in moveToInsertRow() gesetzt werden. moveToInsertRow() wird von eva/3 aufgerufen wenn dieses einen neuen Datensatz anlegen möchte. isInserted() muss nach dem Aufruf von moveToInsertRow() true zurückliefern, diese darf erst wieder false zurückliefern wenn der Datensatz entweder gespeichert wurde oder der Cursor neu positioniert wurde. Im insert Modus (isInserted()) selber sollte man drauf achten das getRowCount() auch einen Datensatz mehr zurückliefert.

Methodenaufgaben

Methode Aufgabe
getObject(int columnIndex) Gibt das Objekt für übergebene Spalte der aktuellen Zeile wieder.
updateObject(int columnIndex,Object x) Setzt das Objekt für übergebene Spalte der aktuellen Zeile. Hier sollte geprüft werden ob sich das übergebene Objekt von dem gesetzten
unterscheidet und erst dann setRowUpdated(true) gesetzt werden.
updateRow() Speichert die Änderungen der aktuell geänderten Zeile wenn isUpdated() true ergibt
insertRow() Fügt die neue Zeile hinzu wenn isUpdated() und isInserted() true ergibt.
moveToInsertRow() Erhöht die Zeilenanzahl temporär um 1 und positioniert auf die Letzte neue Zeile. Ausserdem sollte isInserted true zurückliefern.
cancelRowUpdates() Bricht die aktuellen Änderungen ab, setzt updated und inserted wieder auf false und leert den update cache. Hierbei wird wieder der letzte Datensatz Positioniert.

Siehe auch CSVRecordSource Referenzimplementierung.