Home > Artikel > Ausgabe 3/2018 > Details aus dem Unterformular öffnen

Details aus dem Unterformular öffnen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Ein Unterformular kann einige Daten anzeigen, aber oft ist die Breite des Unterformulars begrenzt und der Benutzer muss scrollen, um die nicht sichtbaren Spalten zu lesen. Das ist nicht unbedingt komfortabel. Manchmal soll dann doch ein Detailformular die Daten zu einem Datensatz in übersichtlicher Form anzeigen. Wie aber öffnen wir das Detailformular zu einem Datensatz vom Unterformular aus? Und wie aktualisieren wir das Unterformular, wenn wir den geöffneten Datensatz im Detailformular geändert haben? All dies zeigt der vorliegende Artikel.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1803_OeffnenAusUnterformular.accdb.

Haupt- und Unterformular erstellen

Das Unterformular soll den Namen sfmArtikel erhalten und alle Datensätze der Tabelle tblArtikel anzeigen. Dazu stellen Sie die Eigenschaft Datenherkunft des Unterformulars auf die Tabelle tblArtikel ein. Wechseln Sie dann zur Anzeige der Feldliste und ziehen Sie alle Einträge dieser Liste in den Detailbereich der Entwurfsansicht des Formulars (siehe Bild 1). Die Anordnung spielt in diesem Fall kenie besondere Rolle, da wir durch Einstellen der Eigenschaft Standardansicht auf den Wert Datenblatt ohnehin dafür sorgen, dass die Datensätze im Unterformular in der Datenblatt-Ansicht erscheinen.

Formular-Entwurf des Unterformulars sfmArtikel

Bild 1: Formular-Entwurf des Unterformulars sfmArtikel

Schließen Sie dann das Formular und öffnen Sie ein neues, leeres Formular in der Entwurfsansicht. Dieses speichern wir unter dem Namen frmArtikel. Fügen Sie dann das Unterformular hinzu, in dem Sie dieses aus dem Navigationsbereich in den Detailbereich des Formularentwurfs ziehen (siehe Bild 2).

Hinzufügen des Unterformulars zum Hauptformular

Bild 2: Hinzufügen des Unterformulars zum Hauptformular

Damit das Unterformular beim Vergrößern des Hauptformulars mitwächst, stellen wir seine beiden Eigenschaften Horizontaler Anker und Vertikaler Anker auf Beide ein.

Detailformular erstellen

Das Detailformular erstellen Sie ebenfalls als neues, leeres Formular, das Sie unter dem Namen frmArtikeldetails speichern. Fügen Sie der Datenherkunft ebenfalls die Tabelle tblArtikel hinzu und ziehen Sie alle Felder der Datenquelle aus der Feldliste in den Formularentwurf. Außerdem legen wir im Detailformular noch eine OK-Schaltfläche namens frmOK an (siehe Bild 3).

Entwurf des Detailformulars

Bild 3: Entwurf des Detailformulars

Details per Schaltfläche anzeigen

Schließen Sie das Detailformular und öffnen Sie erneut das Formular mit dem Unterformular. Über dem Formular fügen wir nun eine Schaltfläche zum Anzeigen der Details des jeweils markierten Datensatzes im Unterformular ein. Sie erhält den Text Details anzeigen und den Namen cmdDetailsAnzeigen.

Außerdem stellen Sie den Wert der Eigenschaft Beim Klicken auf [Ereignisprozedur] ein und legen durch einen Klick auf die Schaltfläche mit den drei Punkten (...) rechts von der Eigenschaft die Ereignisprozedur cmdDetailsAnzeigen_Click an. Um einfach nur das Detailformular mit dem aktuell im Unterformular markierten Datensatz zu öffnen, ergänzen Sie die Prozedur wie folgt:

Private Sub cmdDetailsAnzeigen_Click()

Dim lngArtikelID As Long

lngArtikelID = Me!sfmArtikel.Form!ArtikelID

DoCmd.OpenForm "frmArtikeldetails", WhereCondition:="ArtikelID = " & lngArtikelID

End Sub

Die Prozedur ermittelt den Wert des Primärschlüsselfeldes des aktuell im Unterformular ausgewählten Datensatzes. Das Unterformular-Steuerelement referenzieren wir mit Me!sfmArtikel, das darin enthaltene Unterformular mit Me!sfmArtikel.Form und das Feld schließlich mit Me!sfmArtikel.Form!ArtikelID. Diesen Wert speichern wir in der Variablen lngArtikel. Diese nutzen wir in der folgenden DoCmd.OpenForm-Anweisung als Teil des Kriteriums "ArtikelID = " & lngArtikelID. Damit öffnen wir per Mausklick das Detailformular mit dem aktuellen Datensatz, was wie in Bild 4 aussieht.

Aufruf des Detailformulars

Bild 4: Aufruf des Detailformulars

Ein Problem kann hier auftreten, nämlich dann, wenn der Benutzer die Schaltfläche betätigt, wenn sich der Datensatzzeiger gerade auf einem neuen, leeren Datensatz befindet. Dann erscheint nämlich die Fehlermeldung aus Bild 5. Der Fehler resultiert daraus, dass das Feld ArtikelID für den neuen, leeren Datensatz noch den Wert Null enthält. Wenn wir dies einer Variable des Typs Long zuweisen, erhalten wir den hier vorliegenden Fehler.

Fehler beim Aufruf eines leeren Datensatzes

Bild 5: Fehler beim Aufruf eines leeren Datensatzes

Wie können wir das verhindern? Die einfachste Methode ist es, mit der Nz-Methode dafür zu sorgen, dass die Variable lngArtikel­ID im Falle des Wertes Null im Feld ArtikelID mit dem Wert 0 gefüllt wird (siehe Listing 1).

Private Sub cmdDetailsAnzeigen_Click()

     Dim lngArtikelID As Long

     lngArtikelID = Nz(Me!sfmArtikel.Form!ArtikelID, 0)

     If Not lngArtikelID = 0 Then

         DoCmd.OpenForm "frmArtikeldetails", WhereCondition:="ArtikelID = " & lngArtikelID

     Else

         MsgBox "Wählen Sie einen Artikel aus."

     End If

End Sub

Listing 1: Details anzeigen nur für vorhandene Datensätze

Dann können wir in einer folgenden If...Then-Bedingung prüfen, ob lngArtikelID den Wert 0 aufweist und gegebenenfalls eine entsprechende Meldung ausgeben (siehe Bild 6).

Meldung beim Aufruf ohne markierten Datensatz

Bild 6: Meldung beim Aufruf ohne markierten Datensatz

Details anzeigen-Schaltfläche aktivieren oder deaktivieren

Noch eleganter wäre es natürlich, wenn wir die Schaltfläche zum Anzeigen der Details eines Artikels gar nicht erst aktivieren, wenn diese nicht funktioniert. Dazu fügen wir dem Ereignis Beim Anzeigen des Unterformulars sfmArtikel die folgende Ereignisprozedur hinzu:

Private Sub Form_Current()

If Me.NewRecord Then

Me.Parent!cmdDetailsAnzeigen.Enabled = False

Else

Me.Parent!cmdDetailsAnzeigen.Enabled = True

End If

End Sub

Dies führt dann dazu, dass die Schaltfläche tatsächlich beim Verschieben des Datensatzzeigers im Unterformular auf den neuen, leeren Datensatz deaktiviert wird (siehe Bild 7).

Deaktivieren der Schaltfläche cmdDetailsAnzeigen, wenn kein Datensatz markiert ist

Bild 7: Deaktivieren der Schaltfläche cmdDetailsAnzeigen, wenn kein Datensatz markiert ist

Diese Prozedur können wir natürlich noch erheblich kürzen, indem wir die Bedingung der If...Then-Bedingung direkt der Eigenschaft Enabled zuweisen:

Private Sub Form_Current()

Me.Parent!cmdDetailsAnzeigen.Enabled = Not Me.NewRecord

End Sub

Öffnen per Doppelklick

Das Öffnen per Mausklick auf eine Schaltfläche nach Markieren des betroffenen Datensatzes ist eine passende Lösung. Komfortabler wäre es noch, wenn man den angeklickten Datensatz gleich per Doppelklick im Detailformular öffnen könnte.

Dazu hinterlegen wir zunächst für die Ereigniseigenschaft Beim Doppelklicken die folgende Ereignisprozedur aus Listing 2.

Private Sub ArtikelID_DblClick(Cancel As Integer)

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!