Detailformular öffnen und abfragen

Wenn Sie von einem übersichtsformular oder einem Listenfeld- oder Kombinationsfeld eines Formulars ein Detailformular öffnen, um einen der Datensätze aus der übersicht oder einer Liste im Detail anzuzeigen, lässt sich das mit einem Einzeiler programmieren. Kniffliger wird es, wenn Sie in dem Detailformular änderungen vornehmen oder gar einen anderen Datensatz auswählen und die änderungen oder die Auswahl in das aufrufende Formular übernehmen wollen. Wir stellen zwei Techniken vor – die gängige und eine nicht so oft verwendete, aber grundsätzlich bessere Technik.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1705_Handyverwaltung.accdb.

Beispiel

Wir wollen uns am Beispiel der Formular frmSIMKarten und frmVertragsdetails der Beispieldatenbank Handyverwaltung ansehen, wie Sie die Detaildaten zu einem Datensatz in einem Kombinationsfeld des Formulars frmSIMKarten per Doppelklick im Formular frmVertragsdetails öffnen (siehe Bild 1).

Beispiel für das Aufrufen eines Detailformulars

Bild 1: Beispiel für das Aufrufen eines Detailformulars

Hier gibt es nun im Detailformular die Möglichkeit, einen anderen Datensatz, also einen anderen Vertrag, auszuwählen. Die Auswahl in diesem Formular soll dann beim Schließen in das aufrufende Formular übernommen werden – gegebenenfalls auch erst nach Rückfrage an den Benutzer, da dieser sich möglicherweise nicht im Klaren darüber ist, dass er damit auch den Eintrag im Kombinationsfeld manipuliert.

Herkömmliche Technik

Normalerweise würden Sie, wenn Sie wie hier per Doppelklick auf ein Kombinationsfeld von einem Formular aus ein Detailformular öffnen, eine bewährte Vorgehensweise nutzen.

Damit wir die Originalformulare der Beispieldatenbank nicht bearbeiten müssen, haben wir die beiden Formulare unter den Namen frmSIMKarten_Herkoemmlich und frmVertragsdetails_Herkoemmlich kopiert.

Die Vorgehensweise sieht so aus, dass wir beim Doppelklick auf das Kombinationsfeld das Formular frmVertragsdetails_Herkoemmlich als modalen Dialog öffnen.

Die beiden Schaltflächen cmdSpeichern und cmdVerwerfen statten wir dabei mit entsprechenden Funktionen aus: cmdSpeichern speichert den Datensatz und macht das Formular dann unsichtbar. cmdVerwerfen verwirft die änderungen und schließt das Formular.

Warum Weil die Prozedur, die das Formular frmVertragsdetails_Herkoemmlich als modalen Dialog geöffnet hat, erst nach dem Fokusverlust von frmVertragsdetails_Herkoemmlich fortgesetzt wird. Der Fokusverlust tritt sowohl beim Schließen als auch beim Verbergen des Formulars ein. In der aufrufenden Prozedur prüfen wir dann, ob das Formular noch geöffnet ist. Falls nicht, ist der Fall klar: Der Benutzer hat die änderungen verworfen und es sind keine weiteren Schritte im aufrufenden Formular nötig. Ist das Formular jedoch noch geöffnet, muss es zumindest unsichtbar sein, denn sonst würde die aufrufende Prozedur nicht weiter ausgeführt werden.

In diesem Fall haben wir von dieser Prozedur aus vollen Zugriff auf das Formular – auch wenn dieses nicht mehr sichtbar ist. Wir können dann prüfen, ob der Benutzer einen anderen Datensatz im Formular ausgewählt hat und diesen dann entweder in das Kombinationsfeld im aufrufenden Formular übernehmen oder Rücksprache mit dem Benutzer halten, ob dies gewünscht ist.

Schauen wir uns den benötigten Code an. Wir starten mit der Prozedur, die durch das Ereignis Beim Doppelklicken auf das Kombinationsfeld cboVertragID ausgelöst wird und die wie in Listing 1 aussieht.

Private Sub cboVertragID_DblClick(Cancel As Integer)
     Dim strFormular As String
     strFormular = "frmVertragdetails_Herkoemmlich"
     If Not IsNull(Me!cboVertragID) Then
         DoCmd.OpenForm strFormular, WindowMode:=acDialog, OpenArgs:=Me!cboVertragID
         If IstFormularGeoeffnet(strFormular) Then
             If Not Me!cboVertragID = Forms(strFormular)!VertragID Then
                 If MsgBox("Es wurde ein anderer Vertrag ausgewählt. übernehmen", vbYesNo) = vbYes Then
                     Me!cboVertragID = Forms(strFormular).VertragID
                 End If
             End If
             DoCmd.Close acForm, strFormular
         End If
     End If
End Sub

Listing 1: Aufrufen des Formulars frmVertragsdetails_Herkoemmlich und Auswerten des dort selektierten Vertrags

Hier ist zunächst nur interessant, wie wir das Formular frmVertragsdetails_Herkoemmlich aufrufen. Wir übergeben dabei nämlich keinen WhereCondition-Parameter, denn dies würde die Datenherkunft des Formulars einschränken und man könnte nicht mehr leicht über das Kombinationsfeld einen anderen Vertrag auswählen.

Stattdessen übergeben wir mit dem Parameter OpenArgs den Wert der gebundenen Spalte des Kombinationsfeldes cboVertragID, also die VertragID des anzuzeigenden Vertrags.

Entscheidend ist auch, dass wir für den Parameter WindowMode den Wert acDialog angeben, wodurch das Formular frmVertragsdetails_Herkoemmlich als modaler Dialog geöffnet wird – die aufrufende Prozedur wird erst dann fortgesetzt, wenn das Formular geschlossen oder unsichtbar gemacht wird.

Damit gelangen wir zur Ereignisprozedur Form_Load, die beim Laden des Formulars frmVertragsdetails_Herkoemmlich ausgelöst wird.

Diese prüft, ob Me.OpenArgs einen Wert enthält (Not IsNull(Me.OpenArgs)) und verschiebt dann den Datensatzzeiger zu dem Datensatz, dessen Feld Vertrag-ID den Wert von Me.OpenArgs aufweist:

Private Sub Form_Load()
    If Not IsNull(Me.OpenArgs) Then
        Me.Recordset.FindFirst "VertragID = " & Me.OpenArgs
    End If
End Sub

Damit zeigt das Formular beim öffnen den beim Doppelklick in das Kombinationsfeld ausgewählten Vertrag an. Nun kann der Benutzer die Werte der gebundenen Felder im Formular frmVertragsdetails_Herkoemmlich ändern oder auch mit dem Kombinationsfeld cboSchnellauswahl einen ganz anderen Vertrag auswählen.

In jedem Fall sollte er eine der Schaltflächen cmdSpeichern oder cmdVerwerfen anklicken, um die änderungen zu übernehmen oder zu verwerfen. Die Schaltfläche cmdSpeichern_Click löst die folgende Ereignisprozedur aus:

Private Sub cmdSpeichern_Click()
    Me.Dirty = False
    SchaltflaechenDeaktivieren
    Me.Visible = False
End Sub

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