|
01.11.2009
Aktuelle Zeile ermitteln
Für dieses Beispiel benötigen Sie die Beispiel-Datenbank FAHRZEUGE und das Projekt fahrzeuge.xdev.
Für das Editieren von Daten können Sie in die Zellen des DB-Containers beliebige Formular-Komponenten einbinden. Die Komponenten lassen sich dabei wahlweise frei positionieren oder layouten. Im Füll-Assistenten müssen Sie dann an Stelle der Zellen, die Formular-Komponenten mit den entsprechenden Datenfeldern verknüpfen. Anders als eine Table kann ein DB-Container auch mit Werten aus unterschiedlichen Virtuellen Tabellen gefüllt werden.
» Satzweise Speichern «
Ein weiterer Unterschied zur Table besteht darin, dass Änderungen an den Daten vom DB-Container nicht automatisch an die Virtuelle(n) Quell-Tabelle(n) weiter geleitet werden. Jede Änderung muss daher satzweise gespeichert werden. Dafür bietet jede Zelle des DB-Containers die Methode saveRow ( ) | XDEV NLS: speichereZeile ( ), welche nach demselben Prinzip wie die Methode save ( ) | XDEV NLS: speichern ( ) bei einem Formular funktioniert. saveRow ( ) | XDEV NLS: speichereZeile ( ) betrachtet eine Zeile im DB-Container jeweils als einen zusammen gehörenden Datensatz, selbst wenn die Zeile aus mehreren Spalten besteht. Die Methode liest alle Formular-Komponenten in der jeweiligen Zeile aus, speichert die Werte in die Virtuelle Quell-Tabelle die zum Füllen des DB-Containers verwendet wurde und synchronisiert diese anschließend mit der entsprechenden Datenbank-Tabelle (Update). Voraussetzung dafür ist, dass Sie im Entwurf wie bei einem Formular alle betroffenen Formular-Komponenten mit den entsprechenden Datenfeldern verknüpfen.
Hinweis: Die Methode saveRow ( ) | XDEV NLS: speichereZeile ( ) kann die geänderten Werte nur in die zur Füllung verwendete Quell-Tabelle zurück speichern. Sie können daher keine Virtuelle Tabelle verwenden, die Werte enthält, die Sie aus unterschiedlichen Datenbank-Tabellen zusammen geführt, sprich gejoint haben. Denn Virtuelle Tabellen mit gejointen Werten dienen nur zur Ansicht auf dem Bildschirm - in der Datenbank existiert diese jedoch nicht.
|
Tipp: Die zum Speichern notwendige Datensatz-ID ermittelt die Methode automatisch anhand des Zeilen-Index. Dieser wird nur intern verwaltet, kann jedoch beim Erzeugen der Zeile, also während dem Füllen des DB-Containers, ermittelt und beispielsweise in den Zusatz-Daten einer Zelle gespeichert werden, welche sich wiederum zu jeder Zeit bei Bedarf abfragen lassen.
|
» Änderungen nur in die Virtuelle Tabelle speichern «
Mit der Methode saveRow ( Boolean synchronizeDB ) | XDEV NLS: speichereZeile ( Wahrheitswert synchronisiereDB ) lassen sich die Änderungen zunächst nur in die Virtuelle Tabelle übertragen. Mit einer Methode der Virtuellen Tabelle, synchronizeChangedRows ( ) | XDEV NLS: synchronisiereGeänderteZeilen ( ), können die Änderungen dann zu einem beliebigen Zeitpunkt in die entsprechende Datenbank-Tabelle übertragen werden. Diese Vorgehensweise bietet sich an, wenn das Speichern erst dann erfolgen soll, wenn der Anwender alle Änderungen im DB-Container abgeschlossen hat oder wenn zum Speicher-Vorgang auch Änderungen außerhalb des DB-Containers gehören, z.B. ein weiteres Formular.
Fortsetzung des Beispiels DB-Container füllen:
Datensatz-Schablone konstruieren:
| 4. | Vergeben Sie allen Spalten ein Rand-Layout (Border-Layout), damit sich die anschließend eingefügten Formular-Komponenten automatisch an die Zellengröße anpassen. Halten Sie dazu die Shift Taste gedrückt und klicken Sie nacheinander alle Spalten an, klicken Sie dann in den Eigenschaften bei Layout auf , klicken Sie im folgenden Dialog auf RandLayout und dann auf OK. |
| 5. | Fügen Sie nun in Spalte 1 und 2 eine Combobox, in Spalte 3 bis 6 ein Textfield und in Spalte 7 einen Button ein. |

| 6. | Selektieren Sie nun den DB-Container, wechseln Sie in die Code-Ansicht und wählen Sie im Code-Editor das Ereignis ON_SHOW ( ) | XDEV NLS: Nach der Darstellung ( ). |
Datenbankabfrage:
| 7. | Fügen Sie eine Datenbankabfrage XDEV Query | XDEV NLS: XDEV Datenbankabfrage in den Code-Editor ein und klicken Sie diese an, um den SQL-Assistenten aufzurufen. Selektieren Sie bei der Datenbank-Tabelle FAHRZEUGE die Datenfelder MODELL_ID, FAHRZEUGTYP_ID, ERSTZULASSUNG, KILOMETERSTAND, LEISTUNG und PREIS. Wählen Sie bei Ziel (Virtuelle Tabelle) die bereits existierende Virtuelle Tabelle #FAHRZEUGE aus und beenden Sie den SQL-Assistenten mit OK. |
| 8. | Fügen Sie für die beiden Comboboxen jeweils eine weitere Datenbankabfrage in den Code-Editor ein. Selektieren Sie in der ersten Datenbankabfrage bei der Datenbank-Tabelle MODELLE die Datenfelder ID und MODELL und wählen die bereits existierende Virtuelle Tabelle #MODELLE als Ziel-Tabelle aus. Klicken Sie in der zweiten Datenbankabfrage die Datenbank-Tabelle FAHRZEUGTYP an, um alle Datenfelder zu selektieren und übernehmen Sie die bereits vorhandene Virtuelle Tabelle #FAHRZEUGTYP als Ziel-Tabelle. |
DB-Container füllen:
| 9. | Fügen Sie die Anweisung DB-Container füllen in den Code-Editor ein und klicken Sie diese an, um den DB-Container Füll-Assistenten aufzurufen. Klicken Sie den DB-Container nochmals an, wenn Sie der folgende Dialog dazu auffordert. |
| 10. | Wählen Sie im folgenden Dialog die Virtuelle Quell-Tabelle #FAHRZEUGE aus und klicken Sie auf Weiter. |
| 11. | Verknüpfen Sie zuerst alle Textfields nacheinander mit Datenfeldern ERSTZULASSUNG, KILOMETERSTAND, LEISTUNG und PREIS der Virtuellen Quell-Tabelle #FAHRZEUGE. Klicken Sie dazu jeweils zuerst das Textfield an, klicken Sie im Assistenten auf Virtuelle Quell-Tabelle, klicken Sie dann das entsprechende Datenfeld an und abschließend auf Übernehmen, um die Verknüpfung zu übernehmen. |
Comboboxen füllen:
| 12. | Verknüpfen Sie anschließend die beiden Comboboxen mit den Virtuellen Quell-Tabellen #MODELLE und #FAHRZEUGTYP, die zuvor mit eigenen Abfragen gefüllt wurden, wodurch die Comboboxen zur Laufzeit gefüllt werden. Klicken Sie dazu die erste Combobox an, klicken Sie im Assistenten auf Andere Virtuelle Tabelle, wählen Sie die Virtuelle Tabelle #MODELLE aus, klicken Sie auf das Datenfeld MODELL und abschließend auf Übernehmen. Klicken Sie dann die Combobox erneut an, klicken Sie im Assistenten nun auf Daten, erneut auf Andere Virtuelle Tabelle, wählen Sie erneut die Virtuelle Tabelle #MODELLE aus, klicken Sie das Datenfeld ID und abschließend auf Übernehmen. Klicken Sie die Combobox nochmals an, klicken Sie schließlich auf Selektiert, klicken Sie dieses Mal auf Virtuelle Quell-Tabelle, klicken Sie auf das Datenfeld MODELL_ID und abschließend auf Übernehmen. |
| 13. | Klicken Sie die zweite Combobox an, klicken Sie im Assistenten auf Andere Virtuelle Tabelle, wählen Sie die Virtuelle Tabelle #FAHRZEUGTYP aus, klicken Sie auf das Datenfeld Typ und abschließend auf Übernehmen. Klicken Sie die Combobox erneut an, klicken Sie im Assistenten nun auf Daten, erneut auf Andere Virtuelle Tabelle, wählen Sie erneut die Virtuelle Tabelle #FAHRZEUGTYP aus, klicken Sie das Datenfeld ID und abschließend auf Übernehmen. Klicken Sie die Combobox nochmals an, klicken Sie schließlich auf Selektiert, klicken Sie dieses Mal auf Virtuelle Quell-Tabelle, klicken Sie auf das Datenfeld FAHRZEUGTYP_ID und abschließend auf Übernehmen. |
| 14. | Wenn Sie alle Verknüpfungen durchgeführt haben, klicken Sie abschießend auf Übernehmen, um den Assistenten zu schließen. |
Datensatz speichern:
| 15. | Klicken Sie den Button mit Mehrfachklick an, um zum Code des Buttons zu gelangen. |
| 16. | Geben Sie die den Methoden-Aufruf Zelle.saveRow ( ) | XDEV NLS: Zelle\speichereZeile ( ) in den Code-Editor ein. |
Daten-Mapping:
| 17. | Verknüpfen Sie schließlich noch alle Formular-Komponenten mit den dazugehörigen Datenfeldern der Virtuellen Tabelle #FAHRZEUGE. Wechseln Sie dazu in den GUI-Builder und klicken Sie im Projektmanagement auf Virtuelle Tabellen. Klicken Sie mit Mehrfachklick auf die Virtuelle Tabelle #FAHRZEUGE. Ziehen Sie die Datenfelder MODELL_ID, FAHRZEUGTYP_ID, ERSTZULASSUNG, KILOMETERSTAND, LEISTUNG und PREIS nacheinander per Drag&Drop auf die Formular-Komponenten im DB-Container. |
DBContainer:
|
1
2
3
4
5
6
7
|
ON_SHOW ( )
{
XDEV Query #FAHRZEUGE << FAHRZEUGE;
XDEV Query #MODELLE << MODELLE;
XDEV Query #FAHRZEUGTYP << FAHRZEUGTYP;
XDEV FillDBContainer DBContainer;
}
|
Button:
|
1
2
3
4
|
ACTION_PERFORMED ( )
{
Zelle.saveRow ( );
}
|
|
DBContainer:
|
1
2
3
4
5
|
ON_SHOW
XDEV Query #FAHRZEUGE << FAHRZEUGE
XDEV Query #MODELLE << MODELLE
XDEV Query #FAHRZEUGTYP << FAHRZEUGTYP
XDEV FillDBContainer DBContainer
|
Button:
|
1
2
|
ACTION_PERFORMED
Zelle.saveRow ( )
|
|
DBContainer:
|
1
2
3
4
5
|
Nach der Darstellung ( )
XDEV Datenbankabfrage #FAHRZEUGE << FAHRZEUGE
XDEV Datenbankabfrage #MODELLE << MODELLE
XDEV Datenbankabfrage #FAHRZEUGTYP << FAHRZEUGTYP
XDEV DBCointainerFüllen DBContainer
|
Button:
|
1
2
|
Bei Mausklick ( )
Zelle\speichereZeile ( )
|
|
Tipp: Die Methode zum Speichern sollten Sie innerhalb eines Try-Catch | XDEV NLS: Versuche - Bei Fehler Blocks ausführen, da Sie mögliche Fehler beim Speichern registrieren und ggf. eine entsprechende Fehlermeldung ausgeben können.
|
Tipp: Die Methode saveRow ( ) | XDEV NLS: speichereZeile ( ) liefert die neue Datensatz-ID zurück, die beim Anlegen des neuen Datensatzes in der Datenbank von der Datenbank generiert wird (sofern die Datensatz-ID ein Autowert ist), und speichert diese automatisch in die Virtuelle Tabelle. Für nachfolgende Speicher-Funktionen, welche die ID des neu angelegten Datensatzes benötigen, können Sie die ID mit der Methode getValueAt ( ) | XDEV NLS: holeWert ( ) aus der Virtuellen Tabelle auslesen. Die Methode finden Sie in der Bibliothek bei der jeweiligen Virtuellen Tabelle.
|
|