Tabellendaten mit Übersicht und Details anzeigen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Die gewünschten Formulare

Bild 1: Die gewünschten Formulare

Eine gute Basis für das Anzeigen und Bearbeiten von Daten ist die folgende Konstellation: Wir verwenden ein Haupt- und Unterformular, um die Daten einer Tabelle in einer Übersichtsansicht anzuzeigen. Dabei können wir die Daten, die im Unterformular angezeigt werden, filtern und sortieren. Außerdem stellen wir Schaltflächen bereit, mit denen wir die Datensätze anlegen, bearbeiten und löschen können. Zum Bearbeiten verwenden wir ein weiteres Formular, das die Daten in einer übersichtlichen Ansicht darstellt. Zusätzlich fügen wir noch ein den Code hinzu, der für das Interagieren der Formulare untereinander notwendig ist. Diese Konstellation von Formularen können wir für alle möglichen Tabellen verwenden und schaffen so die Basis einer professionellen Anwendung. Anpassungen können schließlich dort vorgenommen werden, wo m:n- oder 1:n-Beziehungen dargestellt werden sollen.

Eine oft verwendete Konstellation aus Formularen zur Darstellung der Daten einer Tabelle sehen wir in Bild 1. Links finden wir ein aus Haupt- und Unterformular bestehendes Formular, das im Unterformular die Daten in der Datenblattansicht anzeigt und im Hauptformular Steuerelemente, um mit den Daten zu arbeiten. Hier können wir nach den Daten im Unterformular suchen, einen neuen Datensatz hinzufügen, einen Datensatz zur Bearbeitung öffnen oder den markierten Datensatz löschen. Ein Doppelklick auf einen der Einträge im Unterformular soll ebenfalls das Bearbeitungsformular öffnen.

Die gewünschten Formulare

Bild 1: Die gewünschten Formulare

Dieses sieht wie das Formular rechts in der Abbildung aus. Es liefert einfach die Felder der zugrunde liegenden Tabelle und bietet zwei Schaltflächen, mit denen Änderungen übernommen oder verworfen werden können.

Übersichtsformular programmieren

Die Erstellung dieser Formulare beginnen wir immer mit dem Unterformular des Übersichtsformulars. Warum das? Weil wir dieses, wenn wir es fertiggestellt haben, direkt in das im Anschluss erstellte Hauptformular einbauen können.

Das Unterformular erstellen wir als neues, leeres Formular. Diesem weisen wir für die Eigenschaft Datensatzquelle die Tabelle mit den anzuzeigenden Daten zu, in diesem Fall tblMitglieder.

Dann ziehen wir aus dem Bereich Feldliste alle Felder in den Detailbereich, die das Unterformular anzeigen soll (siehe Bild 2).

Erstellen des Unterformulars der Übersicht

Bild 2: Erstellen des Unterformulars der Übersicht

Damit das Unterformular seine Daten in der Datenblattansicht präsentiert, stellen wir die Eigenschaft Standardansicht auf den Wert Datenblatt ein.

Details anzeigen per Doppelklick

Außerdem wollen wir, dass der Benutzer mit einem Doppelklick auf einen der Einträge im Unterformular das Formular mit der Detailansicht öffnen kann. Dazu hinterlegen wir für die Ereigniseigenschaft Beim Doppelklicken eines jeden Steuerelements den Wert [Ereignisprozedur] und legen durch einen Klick auf die Schaltfläche mit den drei Punkten die entsprechende Ereignisprozedur an (siehe Bild 3). Die hier hinzugefügte Ereignisprozedur füllen wir wie folgt mit einer einzigen Anweisung:

Ereignis Beim Doppelklicken implementieren

Bild 3: Ereignis Beim Doppelklicken implementieren

Private Sub MitgliedID_DblClick(Cancel As Integer)
     Call EditDetails
End Sub

Auf die gleiche Weise hinterlegen wir eine solche Ereignisprozedur für die übrigen Steuerelemente. Die hier aufgerufene Prozedur EditDetails finden wir in Listing 1. Sie öffnet das Detailformular namens frmMitgliederDetails mit der DoCmd.OpenForm-Methode. Dabei stellt sie den Öffnungsmodus auf einen modalen Dialog ein. Als Datenmodus verwenden wir den Bearbeitungsmodus. Außerdem übergibt die Prozedur eine Bedingung an das Formular, die dafür sorgt, dass es genau den Datensatz anzeigt, der soeben doppelt angeklickt wurde.

Private Sub EditDetails()
     Dim strForm As String
     strForm = "frmMitgliederDetails"
     DoCmd.OpenForm strForm, WindowMode:=acDialog, WhereCondition:="MitgliedID = " & Me!MitgliedID, DataMode:=acFormEdit
     If IstFormularGeoeffnet(strForm) Then
         Me.Requery
         DoCmd.Close acForm, Me.Name
     End If
End Sub

Listing 1: Öffnen der Detailansicht eines Datensatzes

Wenn der Benutzer das Formular geschlossen hat, läuft die aufrufende Prozedur weiter und prüft, ob das Formular geschlossen ist. Falls nicht, und das ist der Fall, wenn der Benutzer im Detailformular die OK-Schaltfläche gedrückt hat, aktualisiert die Prozedur seine eigene Datenquelle und schließt das Detailformular mit DoCmd.Close endgültig.

Hat der Benutzer hingegen die Abbrechen-Schaltfläche gedrückt, was bedeutet, das Änderungen verworfen und das Formular geschlossen werden soll, wird das Formular direkt richtig geschlossen. In diesem Fall müssen im aufrufenden Formular keine Daten aktualisiert werden.

Danach können wir das Unterformular schließen und es unter dem Namen sfmMitgliederUebersicht speichern.

Hauptformular programmieren

Das Hauptformular öffnen wir ebenfalls als neues, leeres Formular. Dieses benötigte keine Datensatzquelle, da die Daten ja bereits im Unterformular angezeigt werden. Stattdessen fügen wir vier Schaltflächen namens cmdAdd, cmdEdit, cmdDelete und cmdOK hinzu. Außerdem legen wir ein Textfeld namens txtSearch an.

Dann ziehen wir das Unterformular sfmMitgliederUebersicht aus dem Navigationsbereich in das Hauptformular und positionieren alle Elemente ungefähr wie in Bild 4.

Das Unterformular im Hauptformular

Bild 4: Das Unterformular im Hauptformular

Flexible Größe des Übersichtsformulars

In der aktuellen Ansicht ist das Formular recht klein gehalten. Der Benutzer soll es aber vergrößern können und dabei sollen sich auch bestimmte Elemente vergrößern beziehungsweise verschoben werden. In diesem Fall ist das Unterformular sfmMitgliederUebersicht das Element, das sowohl vertikal als auch horizontal angepasst werden soll, wenn der Benutzer das Hauptformular vergrößert oder verkleinert. Deshalb stellen wir die Eigenschaften Horizontaler Anker und Vertikaler Anker auf den Wert Beide ein. Das wirkt sich automatisch auch auf das Bezeichnungsfeld des Unterformular-Steuerelements aus, für das die Eigenschaften nun auf Rechts und Unten eingestellt sind. Diese legen wir wieder auf Links und Oben fest.

Da sich das Unterformular-Steuerelement beim Vergrößern der Höhe nach unten ausdehnt, müssen wir die darunter liegenden Steuerelemente ebenfalls nach unten verschieben. Deshalb stellen wir für die Schaltfläche cmdOK den Wert der Eigenschaft Vertikaler Anker auf Unten ein.

Design der Schaltflächen

Die Schaltflächen haben wir ein wenig angepasst, da das Standarddesign etwas altbacken daherkommt. Dazu haben wir zunächst Bilder hinzugefügt. Das gelingt am schnellsten, indem man im Entwurf die jeweilige Schaltfläche anklickt und den Befehl Bild einfügen aus dem Ribbon-Tab Formularentwurf auswählt. Danach können wir das gewünschte Icon, am besten im PNG-Format, selektieren und es wird direkt der Schaltfläche zugeordnet. Einmal zur Anwendung hinzugefügte Schaltflächen sind danach über die Bildergalerie verfügbar (siehe Bild 5).

Hinzufügen von Icons zu Schaltflächen

Bild 5: Hinzufügen von Icons zu Schaltflächen

Damit der Text rechts vom Icon erscheint, stellen wie die Eigenschaft Anordnung der Bildbeschriftung auf Rechts ein.

Den Rahmen haben wir durch Einstellen der Eigenschaft Rahmenart auf den Wert Transparent ausgeblendet. Für die Schrift haben wir eine andere Farbe gewählt, außerdem wird diese nun fett dargestellt. Außerdem haben wir auch den Hintergrund durch Einstellen der Eigenschaft Hintergrundart auf Transparent ausgeblendet.

Ereignisprozeduren im Übersichtsformular

Nun fügen wir die Ereignisprozeduren für die Schaltflächen im Hauptformular hinzu. Wie beginnen mit der einfachsten Schaltfläche cmdOK. Diese löst die folgende Prozedur aus, die einfach das Formular schließt:

Private Sub cmdOK_Click()
     DoCmd.Close acForm, Me.Name
End Sub

Suchfunktion programmieren

Damit kommen wir zur Suchfunktion. Das Suchfeld txtSearch soll auf die Eingabe eines jeden Zeichens reagieren und die angezeigten Datensätze im Unterformular filtern. Dazu reicht es nicht aus, mit dem Ereignis Nach Aktualisierung auf das Betätigen der Eingabetaste oder das Verlassen des Steuerelements zu reagieren. Wir verwenden hier das Ereignis Bei Änderung, das bei der Eingabe jedes einzelnen Zeichens und auch beim Löschen von Zeichen ausgelöst wird.

Dafür hinterlegen wir die Prozedur aus Listing 2. Hier lesen wir zuerst den aktuellen Text aus dem Textfeld txtSearch ein. Es reicht nicht, einfach mit Me!txtSearch oder Me!txtSearch.Value den Wert des Textfeldes auszulesen, denn dieser ändert sich erst mit dem Speichern des Inhalts beispielsweise durch Verlassen.

Private Sub txtSearch_Change()
     Dim strSearch As String
     Dim strFilter As String
     strSearch = Me!txtSearch.Text
     If Not Len(strSearch) = 0 Then
         strFilter = strFilter & "OR Vorname LIKE ''*" & strSearch & "*''"
         strFilter = strFilter & "OR Nachname LIKE ''*" & strSearch & "*''"
         strFilter = strFilter & "OR Strasse LIKE ''*" & strSearch & "*''"
         strFilter = strFilter & "OR PLZ LIKE ''*" & strSearch & "*''"
         strFilter = strFilter & "OR Ort LIKE ''*" & strSearch & "*''"
         strFilter = strFilter & "OR EMail LIKE ''*" & strSearch & "*''"
         strFilter = strFilter & "OR Telefon LIKE ''*" & strSearch & "*''"
         If Not Len(strFilter) = 0 Then
             strFilter = Mid(strFilter, 4)
         End If
         Me!sfmMitgliederUebersicht.Form.Filter = strFilter
         Me!sfmMitgliederUebersicht.Form.FilterOn = True
     Else
         Me!sfmMitgliederUebersicht.Form.FilterOn = False
     End If
End Sub

Listing 2: Code für die Suchfunktion

Stattdessen verwenden wir die Eigenschaft Text, die den tatsächlich angezeigten Text liefert. Den damit ermittelten Wert tragen wir in die Variable strSearch ein.

Erst wenn die Länge dieser Zeichenkette größer als 0 ist, stellen wir einen Filterausdruck zusammen. Bei einer leeren Zeichenketten setzen wir den Filter für das Unterformular einfach mit FilterOn = False zurück, sodass dieses alle Datensätze der Datenquelle anzeigt.

Finden wir jedoch einen Text in strSearch, beginnen wir mit dem Zusammenstellen des Filterausdrucks, den wir in der Variablen strFilter verwalten. In diesem Beispiel wollen wir die Felder Vorname, Nachname, Strasse, PLZ, Ort, EMail und Telefon nach dem Suchbegriff durchsuchen und alle Datensätze zurückliefern, in denen der Suchbegriff in irgendeinem der Felder auftritt.

Deshalb verbinden wir den Suchausdruck für das jeweilige Feld, also beispielsweise Vorname LIKE ”*Suchbegriff*”, mit dem OR-Operator. Die Sternchen verwenden wir, damit der Suchbegriff an beliebiger Stelle vorkommen kann.

Am Ende erhalten wir ein Kriterium, das alle Felder nach dem angegebenen Suchbegriff durchsucht.

Diesen weisen wir schließlich der Eigenschaft Filter des mit der Form-Eigenschaft des Unterformular-Steuerelements referenzierten Formulars zu. Mit FilterOn = True stellen wir dann den Filter scharf.

Dies führt dazu, dass die Ergebnismenge tatsächlich nach der Eingabe eines jeden Zeichens angepasst wird (siehe Bild 6).

Die Suchfunktion in Aktion

Bild 6: Die Suchfunktion in Aktion

Neuen Datensatz hinzufügen

Zum Hinzufügen eines neuen Datensatzes soll der Benutzer die Schaltfläche cmdAdd mit der Beschriftung Neu betätigen.

Die löst die Prozedur aus Listing 3 aus. Diese trägt den Namen des Detailformulars in die Variable strForm ein. Warum verwenden wir hier eine Variable? Weil der Name des Formulars gleich an mehreren Stellen verwendet wird. Sollten wir diesen Namen einmal ändern oder gar den hier verwendeten Code noch in einem anderen Formular verwenden, brauchen wir den Formularnamen nur an einer Stelle zu ändern.

Private Sub cmdAdd_Click()
     Dim strForm As String
     Dim lngID As Long
     strForm = "frmMitgliederDetails"
     DoCmd.OpenForm strForm, WindowMode:=acDialog, DataMode:=acFormAdd
     If IstFormularGeoeffnet(strForm) Then
         lngID = Forms(strForm)!MitgliedID
         DoCmd.Close acForm, strForm
         Me!sfmMitgliederUebersicht.Form.Requery
         Me!sfmMitgliederUebersicht.Form.Recordset.FindFirst "MitgliedID = " & lngID
     End If
End Sub

Listing 3: Code zum Anlegen eines neuen Datensatzes

In diesem Fall nutzen wir die Variable, um das Formular frmMitgliederDetails mit der DoCmd.OpenForm-Methode zu öffnen. Dieses öffnen wir als modalen Dialog (WindowMode:=acDialog), damit der aufrufende Code angehalten wird und erst nach dem Schließen oder Ausblenden des geöffneten Formulars weiterläuft. Außerdem stellen wir den Datenmodus zum Anlegen eines neuen Datensatzes ein (DataMode:=acFormAdd).

Dadurch erscheint das Formular frmMitgliederDetails wie in Bild 7 mit einem neuen, leeren Datensatz. Nachdem wir dort einen neuen Datensatz eingetragen haben und die OK-Schaltfläche betätigen, wird das Formular mit Me.Visible = False ausgeblendet und der aufrufende Code wird fortgesetzt.

Das automatisch generierte Formular

Bild 7: Das automatisch generierte Formular

Dieser stellt mit der Hilfsfunktion IstFormularGeoeffnet fest, dass das Formular noch geöffnet ist. Daraufhin liest sie den Primärschlüsselwert des neu angelegten Datensatzes in die Variable lngID ein und schließt das Detailformular. Dann aktualisiert sie die Daten im Unterformular sfmMitgliederUebersicht mit der Requery-Methode und stellt den Datensatzzeiger des Recordsets des Unterformulars auf den neuen Datensatz ein.

Wenn der Benutzer das aufgerufene Formular mit der Schaltfläche cmdCancel schließt, wird dieses mit DoCmd.Close direkt geschlossen. In diesem Fall sind keine Aktualisierungen im aufrufenden Formular nötig.

Bearbeiten eines Datensatzes

Die Schaltfläche cmdEdit ruft ebenfalls das Formular frmMitgliederDetails auf (siehe Listing 4). Auch hier verwenden wir wieder eine Variable mit dem Namen des zu öffnenden Formulars. Außerdem ermitteln wir den Primärschlüsselwert des aktuell im Unterformular sfmMitgliederUebersicht markierten Datensatzes und speichern diesen in der Variablen lngID. Ist dort aktuell kein Datensatz markiert, landet der Wert 0 in der Variablen. Ob lngID den Wert 0 enthält, prüft die folgende If…Then-Bedingung. Nur wenn diese nicht den Wert 0 enthält, öffnet die Prozedur das Formular frmMitgliederDetails. Wir verwenden wieder den Parameter WindowMode:=acDialog, um das Formular als modalen Dialog zu öffnen.

Private Sub cmdEdit_Click()
     Dim lngID As Long
     Dim strForm As String
     strForm = "frmMitgliederDetails"
     lngID = Nz(Me!sfmMitgliederUebersicht.Form.MitgliedID, 0)
     If Not lngEdit = 0 Then
         DoCmd.OpenForm strForm, WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:="MitgliedID = " & lngID
         If IstFormularGeoeffnet(strForm) Then
             DoCmd.Close acForm, strForm
             Me!sfmMitgliederUebersicht.Form.Refresh
         End If
     End If
End Sub

Listing 4: Code zum Bearbeiten eines Datensatzes

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar