Formular-Container

Previous  Next

 

 

 

Letzte Änderung 03.02.2010

Formular

Für dieses Beispiel benötigen Sie die Beispiel-Datenbank FAHRZEUGE und das Projekt fahrzeuge.xdev

 

Die Komponente Formular ist ein Container für Formular-Komponenten. Grundsätzlich lassen sich alle Formular-Komponenten zwar auch direkt im Fenster positionieren, die Verwendung eines Formular-Containers bietet jedoch zahlreiche Vorteile. U.a. stellt die Komponente Formular sehr hilfreiche Methoden zur Verfügung, die Ihnen eine Menge Programmierarbeit abnehmen, beispielsweise zum Auslesen und Speichern eines Formulars, zur Durchführung von Formular-Prüfungen und zum automatischen Erzeugen von Abfrage-Bedingungen (Where-Condition) für ein komplettes Formular. Durch das Container-Prinzip werden nebenbei alle zusammengehörenden Formular-Komponenten gruppiert, was für das Designen der Oberfläche praktisch und empfehlenswert ist.

 

 

clip0113

 

» Komponenten müssen im Formular liegen «

Alle Formular-Komponenten, die zu einem Formular gehören sollen, müssen sich innerhalb des Formular-Containers befinden und mit einem entsprechenden Datenfeld der Virtuellen Tabelle verknüpft werden. Alle anderen Formular-Komponenten werden von den Formular-Aktionen ausgeschlossen.

 

 

» Buttons können außerhalb liegen «

Anders als bei den Formular-Komponenten müssen Sie Ihre Formular-Buttons nicht zwingend in den Formular-Container einfügen. Alle Formular-Funktionen lassen sich genauso von außerhalb ausführen. Praktischer ist es dennoch, da Sie bei Änderungen auf der Oberfläche nur den Formular-Container verschieben müssen.

 

 

» Verteilte Formulare «

Zu einem Formular gehören grundsätzlich alle Formular-Komponenten, die sich innerhalb des jeweiligen Formular-Containers befinden. Dabei ist es egal, ob sich die Formular-Komponenten direkt im Formular-Container befinden, oder in einer Komponente die im Formular-Container liegt. D.h. ein Textfield gehört auch dann zum Formular, wenn es sich z.B. in einem TabPane befindet, wenn dieser im Formular-Container liegt. Dies ist vor allem bei umfangreicheren Formularen sehr hilfreich, die Sie mit Hilfe anderer Komponenten zur besseren Übersicht aufteilen können, z.B. mit einem TabPane.

 

Ein Formular lässt sich sogar auf mehrere Internal Frames verteilen, die in einem DesktopPane liegen müssen. Voraussetzung ist, dass der DesktopPane in einem Formular liegt, das jedoch mit Hilfe eines Layout-Managers über das gesamte Anwendungs-Fenster gestreckt werden kann. Das Verteilen eines Formular auf echte Fenster und Dialoge ist jedoch nicht möglich.

 

clip0469

clip0470

clip0472

Vorher: Formulare können in der Praxis sehr groß und unübersichtlich werden. Es ist empfehlenswert, große Formulare aufzuteilen.

Nachher: Formulare lassen sich mit Hilfe eines TabPanes thematisch gliedern und gleichzeitig verkleinern. Der TabPane muss jedoch im Formular liegen.

Nachher. Ein Formular lässt sich auch auf mehrere Internal Frames aufteilen. Internal Frames müssen immer in einem DesktopPane liegen (dunkel). Der DesktopPane wiederum liegt in einem Formular, das im Fenster gelayoutet wird und somit nicht mehr sichtbar ist.

 

 

» Formulare speichern «

clip0406

 

In XDEV 2 erfolgen Datenbank-Zugriffe immer über eine Virtuelle Tabelle. Auch beim Speichern eines Formulars wird der Datensatz zuerst in eine Virtuelle Tabelle übertragen. Erst durch die Synchronisierung der Virtuellen Tabelle mit der entsprechenden Datenbank-Tabelle wird der Datensatz in der Datenbank abgespeichert (persistiert).

 

Um ein Formular abzuspeichern benötigen Sie demnach eine Virtuelle Tabelle, deren Aufbau exakt der Ziel-Tabelle in Ihrer Datenbank entsprechen sollte. Dazu können Sie im Daten Editor, den Sie im Menü Daten finden, nicht nur neue Virtuelle Tabellen anlegen, sondern darüber hinaus auch existierende Datenbank-Tabellen bequem als Virtuelle Tabelle importieren.

 

 

» Datenbank gibt neue ID zurück «

Oftmals wird die von der Datenbank vergebene ID eines gespeicherten Datensatzes sofort wieder benötigt, da diese für das umgehende Speichern ergänzender Daten zwingend notwendig ist. Beispielsweise für das Speichern von Extras (Alu, Leder, Servo, Klima etc.) zu einem gerade erst neu angelegten Fahrzeug-Datensatz, da man dafür neben den Extra-IDs auch die Fahrzeug-ID benötigt (n:m Verknüpfung). Die beim Speichern eines Datensatzes von der Virtuellen Tabelle vergebene ID stimmt jedoch i.d.R. nicht mit der ID überein, die anschließend von der Datenbank vergeben wird, da die Virtuelle Tabelle bei jedem Programmstart wieder mit dem Wert 1 beginnt. Damit Sie jedoch die korrekten Datensatz-ID weiterverarbeiten können, wird die ID eines neuen Datensatzes automatisch von der Datenbank an die Virtuelle Tabelle zurückgegeben und im Datenfeld ID überschrieben. Dies wird jedoch nicht von allen Datenbank-Schnittstellen unterstützt.

 

 

» Formular-Komponenten mit Datenfelder verknüpfen (Daten-Mapping) «

Anschließend müssen Sie nur noch bei allen Formular-Komponenten in den Eigenschaften bei Daten das dazugehörige Datenfeld der Virtuellen Ziel-Tabelle hinterlegen, in das die Daten geschrieben werden sollen. Das Datenfeld wird zusammen mit der Virtuellen Tabelle, getrennt mit Punkt und # Zeichen für Virtuelle Tabellen angegeben, z.B. #ANGEBOTE.PREIS. Die Verknüpfung lässt sich auch bequem per Drag&Drop durchführen, indem Sie im Projektmanagement bei Virtuelle Tabellen die entsprechende Virtuelle Tabelle anwählen und dann die einzelnen Datenfelder per Drag&Drop auf die dazugehörigen Formular-Komponenten im Formular ziehen. Formular-Komponenten, die noch nicht mit einem Datenfeld verknüpft wurden, sind mit einem ! Symbol gekennzeichnet.

 

Hinweis: Formular-Komponenten, die nicht mit einem Datenfeld verknüpft wurden, sind die häufigste Ursache für nicht funktionierende Formulare.

 

 

Die wichtigsten Formular-Methoden:

 

Methode

Erklärung

Formular speichern (anhängend)

 

 

hmtoggle_plus1 save ( ) | XDEV NLS: speichern ( )

Liest alle Werte aus den Komponenten eines Formulars aus, hängt den Datensatz als neue Zeile an die Virtuellen Tabelle und an die gleichnamige Datenbank-Tabelle an (Insert). Alle Formular-Komponenten müssen auf ein entsprechendes Datenfeld der Virtuellen Tabelle verweisen. Der Verweis erscheint bei den Formular-Komponenten in den Eigenschaften bei Daten.

 

hmtoggle_plus1 save (Boolean synchronizeDB) | XDEV NLS: speichern (Wahrheitswert synchronisiereDB)

Mit hmtoggle_plus1 save (false) | XDEV NLS: speichern (FALSCH) wird der Formular-Datensatz zunächst nur an die Virtuellen Tabelle angehängt. Dies kann dann erforderlich sein, wenn eine Speichern-Funktion die Daten mehrerer Formulare gleichzeitig speichern soll, oder wenn sich in der Zwischenzeit weitere Daten in der Virtuellen Tabelle ändern können, die ebenfalls mit gespeichert werden sollen. Für das endgültige Speichern müssen Sie dann die Virtuelle Tabelle mit der namensgleichen Datenbank-Tabelle mit Hilfe der Methode hmtoggle_plus1 synchronizeChangedRows ( ) | XDEV NLS: synchronisiereGeänderteZeilen ( ) synchronisieren, die Sie bei der entsprechenden Virtuellen Tabelle finden.

 

hmtoggle_plus1 insert ( ) | XDEV NLS: einfügen ( ) und hmtoggle_plus1 insert (Boolean synchronizeDB) | XDEV NLS: einfügen (Wahrheitswert synchronisiereDB)

Die hmtoggle_plus1 insert ( ) | XDEV NLS: einfügen ( ) Methoden sind Synonyme der jeweiligen hmtoggle_plus1 save ( ) | XDEV NLS: speichern ( ) Methoden. Sie wurden in Anlehnung an das SQL-Schlüsselwort Insert zusätzlich eingeführt.

 

hmtoggle_plus1 insertRowInVT (VirtualTable vt, Boolean synchronizeDB) | XDEV NLS: einfügen (Virtuelle Tabelle vt, Wahrheitswert synchronisiereDB)

Bei dieser Methode kann ein Formular-Datensatz in eine andere Virtuelle-, bzw. Datenbank-Tabelle gespeichert werden, welche jedoch dieselben Datenfelder besitzen muss wie die mit den Formular-Komponenten verknüpfte Virtuelle Tabelle.

 

» Speichern über die Virtuelle Tabelle «

hmtoggle_plus1 addRow (XdevFormular formular, Boolean synchronizeDB) | XDEV NLS: fügeZeileInHinzu (Virtuelle Tabelle vt, Wahrheitswert synchronisiereDB)

Auch die Virtuelle Tabelle bietet zahlreiche Methoden zum Speichern von Datensätzen, welche aus verschiedenen Quellen stammen können, u.a. aus einem Formular. Diese Methode ist das Pendant zu hmtoggle_plus1 save (Boolean synchronizeDB) | XDEV NLS: speichern (Wahrheitswert synchronisiereDB) und bewirkt exakt dasselbe.

 

Hinweis: Andere Datensätze die sich in der Virtuellen Tabelle ggf. geändert haben, werden von der Methode hmtoggle_plus1 save ( ) | XDEV NLS: speichern ( ) nicht berücksichtigt. Wenn Sie entsprechende Änderungen ebenfalls mit speichern möchten, müssen Sie die Methode hmtoggle_plus1 save (Boolean synchronizeDB) | XDEV NLS: speichern (Wahrheitswert synchronisiereDB) verwenden und die Virtuelle Tabelle anschließend mit der Methode hmtoggle_plus1 synchronizeChangedRows ( ) | XDEV NLS: synchronisiereGeänderteZeilen ( ) mit der Datenbank-Tabelle synchronisieren, die Sie bei der entsprechenden Virtuellen Tabelle finden.

 

Achtung: Die Daten eines Formulars müssen immer als 1 Datensatz in 1 einzigen Datenbank-Tabelle abgespeichert werden. Ansonsten kommt es mit hoher Wahrscheinlichkeit zu inkonsistenten Daten und folglich zu fehlerhaften Abfrage-Ergebnissen.

 

Daten, die auf den ersten Blick zusammen gehören und daher auch auf der Benutzeroberfläche gerne zusammengefasst werden, gehören oftmals nicht zu 1 einzigen Datensatz, sondern zu mehreren. Zum Beispiel handelt es sich bei den Werten VW, Golf, 15.04.2007, 12.350, schwarz, Gebrauchtwagen, 28.000, Klima, Leder, Schiebedach, Alu, Boardcomputer nicht um 1 Datensatz, sondern um die 2 Datensätze VW, Golf, 15.04.2007, 12.350, schwarz, Gebrauchtwagen, 28.000 sowie Klima, Leder, Schiebedach, Alu, Boardcomputer. Auf der Oberfläche würde man das Formular jedoch so gestalten, dass es für den Anwender wie ein zusammenhängender Datensatz aussieht. D.h. die Datensätze müssen demnach mit 2 verschiedenen Formularen in 2 verschiedene Datenbank-Tabellen abgespeichert werden.

 

Mit einem Button-Klick können Sie auch mehrere Formulare nacheinander abspeichern. Dazu müssen Sie lediglich mehrere hmtoggle_plus1 save ( ) | XDEV NLS: speichern ( ) Methoden nacheinander aufrufen. Der Anwender wird jedoch das Gefühl haben nur 1 Formular zu speichern.

 

Hinweis: Die ID eines Datensatzes ist i.d.R. ein Autowert der von der Datenbank automatisch vergeben wird. Beim Speichern eines Datensatzes wird dieser immer zuerst in eine Virtuelle Tabelle übertragen, sodass die Virtuelle Tabelle zunächst eine professorisch ID vergeben muss. Erst beim Übertragen und Anlegen des Datensatzes in der Datenbank-Tabelle kann die Datenbank die echte ID vergeben.

 

In der Praxis werden die von der Virtuellen Tabelle erzeugten IDs nur beim Anlegen der ersten Datensätze mit den von der Datenbank erzeugten IDs übereinstimmen. Bereits bei einem Programm-Neustart wird die Virtuellen Tabelle erneut mit dem Wert 1 von vorne beginnen, während die Datenbank regulär weiter zählen wird. Auch das zwischenzeitliche Löschen von Datensätzen in der Datenbank führt zwangsläufig dazu, dass die von der Virtuellen Tabelle vergebenen IDs nicht mehr mit den IDs in der Datenbank übereinstimmen.

 

Deshalb wird nach dem Speichern in der Datenbank-Tabelle die von der Datenbank generierte ID automatisch an die Virtuelle Tabelle zurückgegeben, wodurch die professorische ID überschrieben wird. Diese Funktionsweise wird jedoch nicht von allen Datenbank-Schnittstellen unterstützt, z.B. HSQL.

 

clip0463

 

Datensatz aktualisieren

hmtoggle_plus1 update ( ) | XDEV NLS: überschreiben ( )

Ein bereits existierender Datensatz wird mit den aktuellen Formular-Daten in der Virtuellen Tabelle und in der dazugehörigen Datenbank-Tabelle überschrieben und somit aktualisiert. Das Formular muss vorher mit einem bereits existierenden Datensatz aus der Virtuellen Tabelle gefüllt werden. Das Formular kann mit der Methode hmtoggle_plus1 fillFromVT (VirtualTable vt, Int row) | XDEV NLS: fülleAusVT (Virtuelle Tabelle vt, Ganzzahl zeile) gefüllt werden. Es ist empfehlenswert, unmittelbar vor dem Aktualisieren des Datensatzes eine Datenbankabfrage durchzuführen, um die Virtuelle Tabelle und das Formular mit möglichst aktuellen Daten zu füllen.

 

hmtoggle_plus1 update (Boolean synchronizeDB) | XDEV NLS: überschreiben (Wahrheitswert synchronisiereDB)

Mit hmtoggle_plus1 update (false) | XDEV NLS: überschreiben (FALSCH) wird der geänderte Formular-Datensatz zunächst nur in der Virtuellen Tabelle aktualisiert. Dies kann dann erforderlich sein, wenn mehrerer Formulare gleichzeitig aktualisiert  werden sollen oder wenn sich in der Zwischenzeit weitere Daten in der Virtuellen Tabelle ändern können, die ebenfalls mit gespeichert werden sollen. Für das endgültige Aktualisieren der Daten in der Datenbank-Tabelle müssen Sie die Virtuelle Tabelle mit der namensgleichen Datenbank-Tabelle mit Hilfe der Methode  hmtoggle_plus1 synchronizeChangedRows ( ) | XDEV NLS: synchronisiereGeänderteZeilen ( ) synchronisieren, die Sie bei der entsprechenden Virtuellen Tabelle finden.

 

Datensatz

löschen

hmtoggle_plus1 delete ( ) | XDEV NLS: löschen ( )

Ein bereits existierender Datensatz wird in der Virtuellen Tabelle und in der dazugehörigen Datenbank-Tabelle entfernt. Das Formular muss vorher mit einem bereits existierenden Datensatz aus der Virtuellen Tabelle gefüllt werden. Das Formular kann mit der Methode hmtoggle_plus1 fillFromVT (VirtualTable vt, Int row) | XDEV NLS: fülleAusVT (Virtuelle Tabelle vt, Ganzzahl zeile) gefüllt werden. Es ist empfehlenswert, vor dem Aktualisieren des Datensatzes eine Datenbank-Abfrage durchzuführen, um die Virtuelle Tabelle und das Formular mit möglichst aktuellen Daten zu füllen.

 

hmtoggle_plus1 delete (Boolean synchronizeDB) | XDEV NLS: löschen (Wahrheitswert synchronisiereDB)

Funktioniert wie die Methode delete() void. Entfernt den existierenden Datensatz aus der Virtuellen Tabelle und nur dann auch in der Datenbank-Tabelle, wenn true übergeben wird.

Mit hmtoggle_plus1 delete (false) | XDEV NLS: löschen (FALSCH) wird der Formular-Datensatz zunächst nur in der Virtuellen Tabelle entfernt. Dies kann dann erforderlich sein, wenn Daten mehrerer Formulare gleichzeitig gelöscht werden sollen oder wenn sich in der Zwischenzeit weitere Daten in der Virtuellen Tabelle ändern können, die ebenfalls aktualisiert werden sollen. Für das endgültige Aktualisieren der Daten in der Datenbank-Tabelle müssen Sie die Virtuelle Tabelle mit der namensgleichen Datenbank-Tabelle mit Hilfe der Methode  hmtoggle_plus1 synchronizeChangedRows ( ) | XDEV NLS: synchronisiereGeänderteZeilen ( ) synchronisieren, die Sie bei der entsprechenden Virtuellen Tabelle finden.

 

Hinweis: Überprüfen Sie unbedingt die Auswirkungen einer hmtoggle_plus1 delete ( ) | XDEV NLS: löschen ( ) Methode auf Ihre Datenbank. Wenn Sie zum Beispiel in der Tabelle Modelle ein Fahrzeugmodell mit der ID 15 löschen möchten, weil dieses Modell nicht mehr verkauft wird, dann müssen Sie vorher zwingend prüfen, ob in anderen Tabellen noch Datensätze existieren, bei denen das Modell mit der ID 15 vorkommt und diese ggf. unbedingt löschen (referenziertes Löschen). Ansonsten werden die Daten in Ihrer Datenbank inkonsistent und Sie erhalten bei Abfragen fehlerhafte Daten.

 

Tipp: Alternativ können Sie Daten in der Datenbank auch mit der Anweisung hmtoggle_plus1 XDEV DeleteDB | XDEV NLS: Aus Datenbank löschen löschen.

 

Datensatz im Formular ausgeben

hmtoggle_plus1 fillFromVT (VirtualTable vt, Int row) | XDEV NLS: fülleAusVT (Virtuelle Tabelle vt, Ganzzahl zeile)

Überträgt einen Datensatz aus der Virtuellen Tabelle in das Formular. Bei den Formular-Komponenten muss bei der Eigenschaft Datenfeld jeweils das dazugehörige Datenfeld hinterlegt werden, damit die Daten übertragen werden können.

 

Durch den Index row legen Sie fest, welcher Datensatz übertragen werden soll. Der Index einer Virtuellen Tabelle nummeriert die Datensätze beginnt mit 0 lückenlos. Achtung, der Index ist nach Außen hin nicht sichtbar und ist nicht mit der Datensatz-ID zu verwechseln.

 

Falls der Index row bereits bekannt ist, wird dieser mit einer Variable übergeben. In der Praxis muss der Index row jedoch erst von einer anderen Komponente abgefragt werden, z.B. von einer Table, einem DataGrid oder DataControl. Die entsprechenden hmtoggle_plus1 get ( ) | XDEV NLS: hole ( ) Methode dafür finden Sie bei der jeweiligen Komponente, z.B.  hmtoggle_plus1 getSelectedRow ( ) | XDEV NLS: holeSelektierteZeile ( ) bei der Table und beim DataGrid sowie  hmtoggle_plus1 getIndex ( ) | XDEV NLS: holeIndex ( ) beim DataControl.

 

Beispiele:

 

1

Formular.fillFromVT(#Modelle, Formular.getSelectedRow());

Die Funktion füllt ein Formular mit einem Datensatz, der in einer Table angeklickt wurde und somit selektiert ist. Mit Hilfe von getSelectedRow ( ) wird der Index des selektierten Datensatzes ermittelt. Mit #Modelle wird die Virtuelle Tabelle übergeben, aus der der Datensatz ausgelesen werden soll.

1

Formular.fillFromVT(#Modelle, Formular.getSelectedRow())

Die Funktion füllt ein Formular mit einem Datensatz, der in einer Table angeklickt wurde und somit selektiert ist. Mit Hilfe von getSelectedRow ( ) wird der Index des selektierten Datensatzes ermittelt. Mit #Modelle wird die Virtuelle Tabelle übergeben, aus der der Datensatz ausgelesen werden soll.

1

Formular\fülleAusVT(#Modelle, Formular\holeSelectierteZeile())

Die Funktion füllt ein Formular mit einem Datensatz, der in einer Table angeklickt wurde und somit selektiert ist. Mit Hilfe von holeSelektierteZeile ( ) wird der Index des selektierten Datensatzes ermittelt. Mit #Modelle wird die Virtuelle Tabelle übergeben, aus der der Datensatz ausgelesen werden soll.

 

1

Formular.fillFromVT(#Modelle, DataControl.getIndex());

Die Funktion füllt ein Formular mit einem Datensatz, der mit einem DataControl angesteuert wurde. Mit Hilfe von getIndex() wird der Index des aktuellen Datensatzes ermittelt. Mit #Modelle wird die Virtuelle Tabelle übergeben, aus der der Datensatz ausgelesen werden soll.

1

Formular.fillFromVT(#Modelle, DataControl.getIndex())

Die Funktion füllt ein Formular mit einem Datensatz, der mit einem DataControl angesteuert wurde. Mit Hilfe von getIndex() wird der Index des aktuellen Datensatzes ermittelt. Mit #Modelle wird die Virtuelle Tabelle übergeben, aus der der Datensatz ausgelesen werden soll.

1

Formular.fülleAusVT(#Modelle, DataControl\holeIndes())

Die Funktion füllt ein Formular mit einem Datensatz, der mit einem DataControl angesteuert wurde. Mit Hilfe von holeIndex ( ) wird der Index des aktuellen Datensatzes ermittelt. Mit #Modelle wird die Virtuelle Tabelle übergeben, aus der der Datensatz ausgelesen werden soll.

 

 

Hinweis: Da Ihre Datenbank-Tabelle in der Praxis Schlüssel-Felder besitzen werden, wird ein Formular nicht in der sichtbaren Form gespeichert. Bei den Auswahl-Komponenten List- und Combobox werden immer nur die unsichtbaren Zusatzwerte gespeichert. Als Zusatzwerte hinterlegen Sie die jeweiligen Datensatz-IDs. Bei Checkbox und Radiobutton dagegen werden die in den Eigenschaften definierten Werte für die Selektierung hinterlegt, z.B. true, yes oder on.

 

Hinweis: Beide Funktionen setzen voraus, dass alle Formular-Komponenten mit den dazugehörigen Spalten der Virtuellen Tabelle verknüpft wurden.

 

Tipp: Wenn Sie dem Formular keinen Hintergrund vergeben, bleibt es während der Laufzeit Ihrer Anwendung unsichtbar, sodass nur die Formular-Komponenten dargestellt werden.