Home > Artikel > Ausgabe 5/2017 > Detailformular öffnen und abfragen

Detailformular öffnen und abfragen

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).

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

Sie sorgt also im letzten Schritt dafür, dass das Formular unsichtbar geschaltet wird.

Die Prozedur, die beim Anklicken der Schaltfläche cmdVerwerfen ausgelöst wird, schließt das Formularhingegen:

Private Sub cmdVerwerfen_Click()

Me.Undo

SchaltflaechenDeaktivieren

DoCmd.Close acForm, Me.Name

End Sub

In beiden Fällen verliert das Formular den Fokus und die aufrufende Prozedur wird fortgesetzt:

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

Die Funktion IstFormularGeoeffnet ermittelt dabei den Zustand des Formulars beziehungsweise liefert eine Information darüber zurück, ob das Formular noch geöffnet ist (siehe Listing 2).

Public Function IstFormularGeoeffnet(strFormular As String) As Boolean

     IstFormularGeoeffnet = SysCmd(acSysCmdGetObjectState, acForm, strFormular) > 0

End Function

Listing 2: Die Funktion IstFormularGeoeffnet ermittelt, ob ein Formular noch geöffnet ist.

Falls ja, prüft die nächste If...Then-Bedingung, ob der Wert des Kombinationsfeldes cboVertragID des aufrufenden Formulars mit dem Wert des Feldes VertragID des Formulars frmVertragsdetails_Herkoemmlich übereinstimmt.

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!