Navigation in und zwischen Formularen

Wie gelangt man in einem Formular intuitiv zu einem bestimmten Datensatz Wie kann man zum zuletzt angezeigten Datensatz zurückspringen Auf welche Weise lässt sich zu einem Detaildatensatz ohne Umwege ein Hauptformular öffnen Antworten auf diese Fragen versucht dieser Beitrag mit einigen trickreichen Routinen zu geben, die teilweise die Navigation auf Webseiten nachbilden.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1511_FormNavigation.accdb

Datenmodell

Die Beispielanwendung verwendet ein Datenmodell (Bild 1), welches sich um Adressen, Kunden, Bestellungen und Artikel rankt. Dabei handelt es sich nicht um eine ausgefeilte Vertriebslösung, sondern um ein Demonstrationsobjekt, das auf die wesentlichen Teile reduziert ist. Zwei Hauptformulare speisen sich dann aus den Tabellen des Modells – so viel sei schon an dieser Stelle verraten. Das eine verwendet nur die Tabelle tblAdressen und deren Nachschlagetabellen tblAnreden, tblOrte und tblLaender.

Datenmodell der Beispieldatenbank mit den Beziehungen zwischen Adressen, Bestellungen und Artikeln

Bild 1: Datenmodell der Beispieldatenbank mit den Beziehungen zwischen Adressen, Bestellungen und Artikeln

Das andere simuliert eine Kunden- und Bestellverwaltung, wobei hier die Adresstabelle als Kundenbasis zweckentfremdet wird. An ihr hängen die Bestellungen, Bestelldetails und Bestellartikel.

Die Verknüpfung zwischen Kundenadresse und Bestellung geschieht über die ID der Primärtabelle und KundeID der Fremdschlüsseltabelle. ähnlich sieht die Beziehung zwischen Bestellung und Bestelldetail aus. Die Tabelle tblArtikel ist hingegen eher wieder eine Nachschlagetabelle. Zu einer Kundenadresse kann es also mehrere Bestellungen geben und zu jeder Bestellung wiederum mehrere Bestellartikel in den Bestelldetails. Damit die Artikeltabelle etwas aufgepeppt wird, verweist ein Feld Herkunftsland zusätzlich auf die Tabelle tblLaender.

Adressen verwalten

über das Formular frmAdressen in Bild 2 werden nun die Adressen angezeigt und bearbeitet. Es enthält Steuerelemente für alle Felder der Tabelle, wobei die drei Nachschlagefelder IDAnrede, IDOrt und IDLand als Kombinationsfelder daher kommen und sich in ihrer Datenherkunft direkt aus den jeweiligen Tabellen speisen. Gebunden sind diese Felder an die erste unsichtbare Spalte ID der Detailtabellen. Die Datenquelle des Formulars selbst ist ebenfalls direkt die Tabelle tblAdressen. Soweit weist das Formular keinerlei Besonderheiten auf.

Das Adressformular frmAdressen der Beispieldatenbank

Bild 2: Das Adressformular frmAdressen der Beispieldatenbank

Zusätzlich sind ist aber ein Unterformular sfrmKinder integriert, welches ebenfalls auf der Adresstabelle basiert, jedoch deren Felder über eine Abfrage auf Nachname und Vorname beschränkt. Das sollen Kinder des angezeigten Hauptdatensatzes sein. Die Verbindung kommt über das unscheinbare Feld ParentID der Tabelle zustande. Ein Datensatz, der einen Wert in diesem Feld enthält, verweist damit auf den Elterndatensatz mit der verwiesenen ID. In der letzten Ausgabe von Access Basics lernten Sie diese Methode bereits im Beitrag zu Rekursiven Tabellen kennen. Beim Navigieren durch die Hauptdatensätze des Formulars werden also im Unterformular die zugehörigen Kinder angezeigt.

Es gibt nun drei Spezialelemente im Formular. Zum einen listet eine Combobox rechts oben im Kopfbereich alle Adressen namentlich auf. Durch Auswahl eines Eintrags gelangen Sie zum entsprechenden Adressdatensatz, wie Bild 3 demonstriert. Deshalb ist die Navigationsleiste des Formulars auch ausgeblendet. Denn diese ist in den meisten Fällen ohnehin überflüssig. Wer sucht Datensätze schon über Vor- und Zurücksteppen oder über die Eingabe eines Zahlenwerts heraus

Sprung zu anderen Datensätzen im Adressformular über Kombinationsfeld

Bild 3: Sprung zu anderen Datensätzen im Adressformular über Kombinationsfeld

Ebenfalls im Kopfbereich untergebracht ist die Schaltfläche Zurück. Sie ist zunächst deaktiviert. Sobald Sie aber über die Navigations-Combo zu einem anderen Datensatz springen, wird sie aktiv und zeigt die eben verlassene Adresse an, etwa den Karol Wagner (Bild 4). Mit Klick auf diesen Button gelangen Sie wieder zurück zum aufrufenden Datensatz.

Die Zurück-Schaltfläche oben zeigt die zuletzt verlassene Adresse an

Bild 4: Die Zurück-Schaltfläche oben zeigt die zuletzt verlassene Adresse an

Wie der Text unter dem Unterformular bereits erläutert, reagieren die Datenzeilen der Kinder auf einen Doppelklick. Der löst nämlich aus, dass zum Adressdatensatzes dieses Kindes gesprungen wird. Auch in diesem Fall wird die Zurück-Schaltfläche aktiv, damit Sie schnell zum Elterndatensatz zurückgelangen können.

Eingebaut ist hier also eine History ähnlich der des Webbrowsers. Dass all diese Navigationsfunktionen mit nur sehr wenig Aufwand zu realisieren sind, zeigt ein Blick in das Code-Modul des Formulars. Listing 1 gibt den Kopf und die Initialisierung wieder.

Private arrUndo() As String
Private lUndo As Long
Private Sub Form_Load()
     ReDim arrUndo(1, 30)
     lUndo = -1
     Me.Recordset.FindFirst "ID=19"
End Sub
Private Sub Form_Current()
     Me!cbFind = Null
End Sub

Listing 1: Erster Teil des Formularmoduls von frmAdressen

Dort ist ein Array arrUndo deklariert, welches der History-Funktion dient. In diesem Array werden zuletzt verlassene Datensätze anhand ihrer ID und des Adressnamens gespeichert. In der Ereignisprozedur Beim Laden (Form_Load) wird das Array auf zwei Ebenen mit 30 Elementen dimensioniert. 30 ist ein willkürlich gewählter Wert, der die maximale Zahl der Rücksprünge darstellt. Er sollte ausreichen. Die erste Ebene des Arrays enthält die IDs der Datensätze, die zweite die Adressnamen. Wir kommen noch darauf zu sprechen, wie und wo es befüllt wird. Jedenfalls könnte ein Array-Datensatz so aussehen:

arrUndo(0,12) = 78
arrUndo(1,12) ="Karol, Wagner"

Die Variable lUndo ist ein Positionszeiger für das Array. Wäre die aufgeführten Elemente eben erst gespeichert worden, so enthielte lUndo den Wert 12. Im Load-Ereignis jedoch wird lUndo zunächst auf -1 gesetzt, weil es ja noch keinen Array-Eintrag gibt. Nur zur Demonstration wird in diesem Ereignis auch noch der Datensatz mit der ID 19 angesprungen. Diese Zeile ist elementar für das Navigieren zu bestimmten Datensätzen. Statt sich etwa der DoCmd-Methode GotoRecord zu bedienen, ist die Navigation über das Formular-Recordset erheblich einfacher. Dessen Methode FindFirst findet automatisch den Datensatz mit der ID 19 und, das ist der Clou, zeigt ihn auch gleich an.

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar