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.
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.
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. |
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.
| 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.