Im vierten Teil der Artikelreihe zum Thema “Handyverwaltung” setzten wir die Arbeit an den Formularen der Lösung fort. Dieser Teil kümmert sich um die Verwaltung der Mobilfunkgeräte. Dazu legen wir wieder ein Übersichtsformular und ein Detailformular an. Das Detailformular wird etwas anspruchsvoller, da wir darin auch die zum jeweiligen Mobilfunkgerät gehörende SIM-Karte verwalten wollen.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1706_Handyverwaltung.accdb.
Vorbereitungen
Den Teil des Datenmodells, den wir uns in diesem Teil der Artikelreihe ansehen, finden Sie in Bild 1. Diesmal geht es um die Mobilfunkgeräte, zu denen ja nicht nur Handys, sondern auch Tablets gehören. Nach aktuellem Stand muss man der Tabelle der Mobilfunkgerätearten (tblMobilfunkgeraetearten) ja auch noch Uhren hinzurechnen (Stichwort AppleWatch). Dies ist das erste Lookup-Feld, welches wir bei der Eingabe von Mobilfunkgeräten berücksichtigen müssen.
Bild 1: Der Teil des Datenmodells, um den wir uns in diesem Artikel kümmern
Die zweite Art von zusätzlichen Daten betrifft die SIM-Karten, die in den Geräten stecken. Hierbei ist zu berücksichtigen, dass es Geräte gibt, in denen keine SIM-Karte steckt, aber auch SIM-Karten, die in keinem Gerät stecken. Der Regelfall wird aber sein, dass eine SIM-Karte auch einem Gerät zugeordnet ist.
Dem tragen wir durch eine Tabelle Rechnung, die wie eine Verknüpfungstabelle zur Herstellung einer m:n-Beziehung angezeigt wird und die tblMobilfunkgeraeteSIMKarten benannt wird. Aber handelt es sich tatsächlich um eine m:n-Tabelle Immerhin gibt es ja noch eine weitere Einschränkung: jede SIM-Karte kann nämlich nur in einem einzigen Gerät stecken, und jedes Gerät kann auch nur eine SIM-Karte aufnehmen. (Ups: Stimmt das wirklich, oder gibt es vielleicht sogar Geräte, welche mehr als eine SIM-Karte aufnehmen – etwa, um verschiedene Netze abzudecken Wie auch immer: Wir werden diesen Fall außen vor lassen.)
Die Beziehungen zwischen der Tabelle tblMobilfunkgeraeteSIMKarten und den Tabellen tblMobilfunkgeraete und tblSIMKarten sehen im Beziehungen-Fenster wie normale 1:n-Beziehungen aus. Wenn wir allerdings doppelt auf den Beziehungspfeil klicken, erkennen wir beispielsweise im Dialog zum Bearbeiten der Beziehung aus Bild 2, dass hier in der Tat eine 1:1-Beziehung angelegt wurde.
Bild 2: Die Beziehung wird als 1:1-Beziehung eingetragen.
Das ist auch kein Wunder, denn wir haben für die beiden Fremdschlüsselfelder der Verknüpfungstabelle, also für MobilfunkgeraetID und SIMKarteID, nicht etwa einen zusammengesetzten, eindeutigen Index angelegt, sondern jedes Fremdschlüsselfeld für sich mit einem eindeutigen Index versehen. Deshalb legt Access standardmäßig eine 1:1-Beziehung für diese Beziehungen an. Interessant ist jedoch, dass Access diese im Beziehungen-Fenster nicht als 1:1-Beziehung, sondern als 1:n-Beziehungen abbildet.
Erweiterung des Datenmodells
Nun, da wir uns dem Formular für die Mobilfunkgeräte zuwenden wollen, werfen wir einen genauen Blick auf die Tabelle tblMobilfunkgeraete und stellen fest, dass diese doch noch ein wenig mager ausgestattet ist. MobilfunkgeraetID, Bezeichnung, Anschaffungspreis und MobilfunkgeraeteartID sind wohl doch etwas wenig Informationen. Als Erstes fehlt uns der Hersteller des Geräts. Ist es ein iPhone Ein Samsung Hier stellt sich die allerdings die Frage, ob wir den Hersteller gleich mit den Datensätzen der Tabelle tblMobilfunkgeraete verknüpfen wollen. Immerhin gibt es ja auch noch die einzelnen Modelle und Baureihen der verschiedenen Geräte. Wollen wir also den Hersteller in der Tabelle speichern und auch noch die Angabe des Modells Das macht eigentlich keinen Sinn, denn es gibt ja jedes Modell auch nur von einem Hersteller. Wenn wir dann den Hersteller zu den Modellen speichern und nochmals zu den Mobilfunkgeräten, hätten wir redundante Daten, die später zu Inkonsistenzen führen könnten. Dann wäre ein Mobilfunkgerät beispielsweise ein iPhone, aber ein unaufmerksamer Benutzer stellt vielleicht als Hersteller des Geräts Samsung ein.
Also gehen wir noch einen Schritt weiter und fügen der Tabelle tblMobilfunkgeraete zunächst ein Fremschlüsselfeld namens ModellID hinzu, welches seine Daten aus der Tabelle tblModelle bezieht. Die Tabelle tblModelle wiederum enthält beispielsweise Felder mit der Bezeichnung des Modells, der Angabe des Speicherplatzes des Modells und mehr.
Außerdem legen wir hier ein Fremdschlüsselfeld für den Hersteller namens HerstellerID an. Den Hersteller wollen wir aus einer Lookup-Tabelle auswählen, die wir zunächst hinzufügen. Die Tabelle heißt tblHersteller und enthält die Felder HerstellerID, Bezeichnung, Webseite, EMailSupport und TelefonSupport – diese können Sie natürlich nach Bedarf erweitern. Für das Feld Bezeichnung legen wir einen eindeutigen Index fest (siehe Bild 3).
Bild 3: Eindeutiger Index für das Feld Bezeichnung
Wir können der Tabelle auch gleich einige Datensätze hinzufügen, damit wir etwas Material zum Testen haben (siehe Bild 4).
Bild 4: Datensätze der Tabelle tblHersteller
Mobilfunkgeräteart verschieben
Wenn wir schon dabei sind, einen genauen Blick auf das Datenmodell zu werfen, sollten wir auch noch schauen, ob das Fremdschlüsselfeld MobilfunkgeraeteartID wirklich in die Tabelle tblMobilfunkgeraete gehört. In der Tat sollten wir es wohl auch in die Tabelle tblModelle verschieben, denn sonst hätten wir das gleiche Problem wie mit den Herstellern – ein iPhone ist nun einmal ein Smartphone und kein Tablet.
Genau das wäre aber bei fehlerhafter Eingabe in den aktuellen Stand der Tabelle tblMobilfunkgeraete eine mögliche Kombination. Um uns möglichst wenig Arbeit zu machen, nutzen wir die Zwischenablage, um das Feld zu verschieben: Markieren Sie das Feld MobilfunkgeraeteartID über den Datensatzmarkierer in der Entwurfsansicht der Tabelle tblMobilfunkgeraete, betätigen Sie die Tastenkombination Strg + C, wechseln Sie zum Entwurf der Tabelle tblModelle und fügen Sie die Zeile dort nach vorheriger Markierung der Zielzeile mit der Tastenkombination Strg + V ein. Dies kopiert das Feld mit allen Eigenschaften, also auch mit den Angaben zum Nachschlagefeld. Sie müssen lediglich im Beziehungen-Dialog die alte Beziehung zwischen der Tabelle tblMobilfunkgeraete und tblMobilfunkgeraetearten löschen, bevor Sie das Feld MobilfunkgeraeteartID aus der Tabelle tblMobilfunkgeraete entfernen können. Anschließend fügen Sie die passende Beziehung zwischen dem Feld MobilfunkgeraeteartID der Tabelle tblModelle und dem gleichnamigen Feld der Tabelle tblMobilfunkgeraetearten hinzu.
Der aktuelle Zustand dieses Teils des Datenmodells sieht nun wie in Bild 5 aus.
Bild 5: Datenmodell der Tabellen rund um die Mobilfunkgeräte
Hersteller verwalten
Für die Hersteller bauen wir uns ein Haupt- und ein Unterformular, wobei beide Formulare wieder die gleiche Datenherkunft nutzen – eine Abfrage, welche die Daten der Tabelle tblHersteller nach dem Feld Bezeichnung sortiert. In diesem Fall haben wir einige Feinheiten eingebaut, durch die der im Haupt- und im Unterformular angezeigte Datensatz synchron gehalten wird. Das heißt, wenn Sie im Unterformular zwischen den Datensätzen navigieren, wird jeweils der passende Datensatz im Hauptformular angezeigt und umgekehrt.
Detailinformationen dazu finden Sie im Artikel Haupt- und Unterformular synchron. Das Formular sieht anschließend wie in Bild 6 aus.
Bild 6: Verwaltung der Hersteller
Formular zur Verwaltung der Mobilfunkgeräte
Für die Verwaltung der Mobilfunkgeräte wollen wir diesmal wieder ein Übersichtsformular erstellen und ein Detailformular zur Anzeige der Einzelheiten der Geräte. Das Übersichtsformular bauen wir als Haupt- und Unterformular auf.
Das Unterformular sfm-Mobil-funk-geraete-Ueber-sicht
Das Unterformular sfmMobilfunkgeraeteUebersicht verwendet die Abfrage qryMobilfunkgeraeteUebersicht als Datenherkunft. Das Unterformular soll alle wichtigen Informationen über das Gerät anzeigen, also binden wir auch die verknüpften Tabellen wie tblModelle, tblHersteller und tblMobilfunkgeraetearten ein. Den Entwurf der Abfrage finden Sie in Bild 7. Da in diesem Unterformular keine neuen Modelle, Hersteller oder Mobilfunkgerätearten zugewiesen werden sollen, fügen wir nicht die Nachschlagefelder der jeweiligen Tabellen hinzu, sondern nur die in den Tabellen enthaltenen Felder. Da wir in den Tabellendefinitionen die Bezeichnungen der enthaltenen Objekte, also etwa in der Tabelle tblMobilfunkgeraete, tblModelle oder tblHersteller auch mit dem Feldnamen Bezeichnung versehen haben, fügen wir den Feldern im Abfrageentwurf noch eine entsprechende Beschriftung hinzu, die dann beim Hinzufügen der Felder in die jeweiligen Formulare berücksichtigt wird. Dies erledigen wir über die Eigenschaft Beschriftung im Eigenschaften-Fenster der entsprechenden Eigenschaft.
Bild 7: Datenherkunft des Unterformulars sfmMobilfunkgeraeteUebersicht
Wenn wir diese Abfrage dem Formular sfmMobilfunkgeraeteUebersicht zuweisen und in der Entwurfsansicht die Feldliste einblenden, zeigt diese bei den mehrfach vorkommenden Feldern namens Bezeichnung jeweils zusätzlich den Tabellennamen an (siehe Bild 8). Wenn wir die Felder jedoch in den Detailbereich des Entwurfs ziehen, werden die Beschriftungen in den Bezeichnungsfeldern entsprechend der in der Eigenschaft Beschriftung der Felder der Abfrage angepasst. Über das Unterformular direkt sollen keine Datensätze bearbeitet, hinzugefügt oder gelöscht werden, daher stellen wir die Eigenschaften Anfügen zulassen, Löschen zulassen und Bearbeitungen zulassen auf den Wert Nein ein.
Bild 8: Hinzufügen der Felder zum Entwurf des Formulars sfmMobilfunkgeraeteUebersicht
Wir brauchen nun nur noch die Eigenschaft Standardansicht auf den Wert Datenblatt einzustellen und können das Formular dann speichern und schließen.
Das Hauptformular frm-Mobil-funk-geraete-Ueber-sicht
In das Hauptformular frmMobilfunkgeraeteUebersicht ziehen wir zunächst das Unterformular sfmMobilfunkgeraeteUebersicht. Dann stellen wir die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten des Formulars auf Nein und die Eigenschaft Automatisch zentrieren auf Ja ein.
Außerdem soll das Unterformular-Steuerelement automatisch vergrößert werden, wenn der Benutzer das Hauptformular vergrößert. Dazu stellen wir die Eigenschaften Horizontaler Anker und Vertikaler Anker jeweils auf Beide ein. Nicht vergessen, die Eigenschaften für das Bezeichnungsfeld zum Unterformular, die automatisch mit geändert werden, wieder auf Links und Oben einzustellen!
Außerdem fügen wir dem Formular drei Schaltflächen namens cmdDetailsAnzeigen, cmdNeuesGeraet und cmdGeraetLoeschen hinzu. Der Entwurf des Hauptformulars sieht dann wie in Bild 9 aus.
Bild 9: Entwurf des Hauptformulars frmMobilfunkgeraeteUebersicht
Die Schaltfläche cmdDetailsAnzeigen ruft die Prozedur aus Listing 1 auf. Diese ermittelt den Primärschlüsselwert des aktuell im Unterformular markierten Datensatzes und ruft dann das Formular frmMobilfunkgeraetDetails auf, welches wir im Anschluss erstellen. Als Parameter übergeben wir mit der DoCmd.OpenForm-Methode unter anderem eine Bedingung, welche festlegt, welchen Datensatz wir im zu öffnenden Formular anzeigen wollen. Durch das Setzen des Parameters WindowMode auf den Wert acDialog wird der Code der aufrufenden Prozedur erst weiter ausgeführt, wenn das geöffnete Formular den Fokus wieder abgibt, also geschlossen oder unsichtbar gemacht wurde.
Private Sub cmdDetailsAnzeigen_Click() Dim lngMobilfunkgeraetID As Long lngMobilfunkgeraetID = Me!sfmMobilfunkgeraeteUebersicht.Form!MobilfunkgeraetID DoCmd.OpenForm "frmMobilfunkgeraetdetails", WindowMode:=acDialog, WhereCondition:="MobilfunkgeraetID = " & lngMobilfunkgeraetID End Sub
Listing 1: Anzeigen der Details zu einem Mobilfunkgerät
Die Schaltfläche cmdNeuesGeraet soll beim Anklicken ebenfalls dieses Formular aufrufen, allerdings nicht zur Anzeige eines bestehenden Datensatzes, sondern zum Anlegen eines neuen. Auch hier verwenden wir die Methode DoCmd.OpenForm, übergeben hier jedoch für den Parameter DataMode den Wert acFormAdd. Damit zeigt das zu öffnende Formular gleich einen neuen, leeren Datensatz an (siehe Listing 2).
Private Sub cmdNeuesGeraet_Click() DoCmd.OpenForm "frmMobilfunkgeraetdetails", WindowMode:=acDialog, DataMode:=acFormAdd Me!sfmMobilfunkgeraeteUebersicht.Form.Requery SteuerelementeAktivieren End Sub
Listing 2: Anzeigen des Formulars frmMobilfunkgeraetdetails zum Anlegen eines neuen Geräts
Die dritte Schaltfläche namens cmdGeraetLoeschen ruft die Prozedur aus Listing 3 auf. Diese ermittelt die Bezeichnung des zu löschenden Gerätes und schreibt sie in die Variable strGeraet. Damit stattet sie die Meldung einer MsgBox-Anweisung aus und fragt den Benutzer, ob er das aktuell markierte Gerät wirklich löschen will. Falls ja, ermittelt die Prozedur den Primärschlüsselwert des zu löschenden Geräts und führt eine entsprechende DELETE-Abfrage mit der Execute-Methode des aktuellen Database-Objekts aus. Anschließend aktualisiert sie die im Unterformular angezeigten Daten mit der Requery-Methode.
Private Sub cmdGeraetLoeschen_Click() Dim lngMobilfunkgeraetID As Long Dim strGeraet As String Dim db As DAO.Database strGeraet = Me!sfmMobilfunkgeraeteUebersicht.Form!Bezeichnung If MsgBox("Möchten Sie das Gerät '" & strGeraet & "' löschen", vbCritical + vbOKCancel, "Gerät löschen") = vbOK Then lngMobilfunkgeraetID = Me!sfmMobilfunkgeraeteUebersicht.Form!MobilfunkgeraetID Set db = CurrentDb db.Execute "DELETE FROM tblMobilfunkgeraete WHERE MobilfunkgeraetID = " & lngMobilfunkgeraetID, dbFailOnError Me!sfmMobilfunkgeraeteUebersicht.Form.Requery SteuerelementeAktivieren End If End Sub
Listing 3: Löschen des aktuell markierten Mobilfunkgeräts
Steuer-elemente aktivieren und deaktivieren
Die Prozedur SteuerelementeAktivieren, die in allen drei erwähnten Ereignisprozeduren aufgerufen wird, haben wir noch nicht beschrieben. Diese sorgt dafür, dass die Schaltflächen zum Anzeigen der Details und zum Löschen des aktuell markierten Elements deaktiviert werden, wenn gar kein Datensatz im Unterformular markiert ist (was aber auch nur dann vorkommt, wenn die Datenherkunft leer ist).
Diese Prozedur finden Sie in Listing 4. Sie prüft mit der RecordCount-Eigenschaft des Recordset-Objekts des Unterformulars, ob Datensätze vorhanden sind. Die Variable bolMobilfunkgeraetVorhanden wir auf True eingestellt, wenn die Anzahl ungleich 0 ist, sonst auf False. Dieser Wert wird dann der Eigenschaft Enabled der beiden Schaltflächen cmdDetailsAnzeigen und cmdMobilfunkgeraet-Loeschen zugewiesen, welche dann wie in Bild 10 deaktiviert werden.
Bild 10: Das Formular frmMobilfunkgeraeteUebersicht in der Formularansicht
Fehlt noch die Prozedur Form_Load, die beim Laden des Formulars ausgelöst wird und die Prozedur SteuerelementeAktivieren einmal direkt beim Öffnen des Formulars aufruft:
Private Sub Form_Load() SteuerelementeAktivieren End Sub
Das Formular frmMobilfunkgeraetdetails
Das Formular frmMobilfunkgeraetDetails verwendet eine Abfrage basierend auf der Tabelle tblMobilfunkgeraetID als Datenherkunft (siehe Bild 11).
Bild 11: Datenherkunft des Formulars frmMobilfunkgeraetdetails
Das Formular selbst zeigt alle Felder dieser Abfrage an und enthält zusätzlich eine Schaltlfäche namens cmdOK (siehe Bild 12). Diese ruft die folgende Prozedur auf:
Bild 12: Entwurf des Formulars frmMobilfunkgeraetdetails
Private Sub cmdOK_Click() DoCmd.Close acForm, Me.Name End Sub
Das in der Tabelle tblMobilfunkgeraete als Nachschlagefeld definierte Feld ModellID wird hier automatisch als Kombinationsfeld angelegt. Für dieses wollen wir nun wiederum ein paar Funktionen hinterlegen – zum Beispiel, um den aktuellen Eintrag per Doppelklick auf das Kombinationsfeld zu öffnen.
Das Kombinationsfeld benennen wir daher zunächst in cboModellID um. Dann legen wir eine Variable fest, mit der wir das zu öffnende Formular frmModelldetails referenzieren wollen:
Private WithEvents objFrmModelldetails As Form
Schließlich fügen wir die Prozedur hinzu, die durch das Ereignis Beim Doppelklicken des Kombinationsfeldes cboModellID ausgelöst wird:
Private Sub ModellID_DblClick(Cancel As Integer) Dim strFormular As String strFormular = "frmModelldetails" If Not IsNull(Me!cboModellID) Then DoCmd.OpenForm strFormular, WhereCondition:=Me!cboModellID Set objFrmModelldetails = Forms(strFormular) With objFrmModelldetails .OnUnload = "[Event Procedure]" .Modal = True End With End If End Sub
Die Prozedur speichert den Namen des zu öffnenden Formulars, also frmModelldetails, in der Variablen strFormular. Danach prüft sie, ob cboModellID überhaupt einen Wert enthält. Ist dies der Fall, wird dieser beim folgenden Aufruf der DoCmd.OpenForm-Methode als Vergleichswert der WhereCondition übergeben.
Das nun geöffnete Formular weisen wir der Variablen objFrmModelldetails zu und stellen dessen Eigenschaft OnUnload auf [Event Procedure] sowie Modal auf True ein. Erstere sorgt dafür, dass wir das Ereignis Beim Entladen im aktuellen Klassenmodul implementieren können, zweiteres versetzt das Formular in den modalen Modus, sodass die übrigen Elemente der Anwendung erst wieder verwendet werden können, wenn der Benutzer das Formular frmModelldetails wieder geschlossen hat.
Was aber, wenn wir noch gar keine Datensätze in der Tabelle tblModelle eingegeben haben Dann zeigt das Kombinationsfeld cboModellID auch noch keine Datensätze an und ein Doppelklick auf das Kombinationsfeld zeigt auch keine Wirkung, da wir ja auf den Wert Null testen.
Also fügen wir noch einen Else-Zweig zur Bedingung hinzu und erweitern die Prozedur um eine Funktion zum Öffnen des Formulars frmModelldetails zum Anlegen eines neuen, leeren Datensatzes. Da dann auf jeden Fall ein Formular geöffnet wird, können wir gleichzeitig die übrigen Anweisungen aus der If…Then-Bedingung herausnehmen:
Private Sub cboModellID_DblClick(Cancel As Integer) Dim strFormular As String strFormular = "frmModelldetails" If Not IsNull(Me!cboModellID) Then DoCmd.OpenForm strFormular, WhereCondition:="ModellID = " & Me!cboModellID Else DoCmd.OpenForm strFormular, DataMode:=acFormAdd End If Set objFrmModelldetails = Forms(strFormular) With objFrmModelldetails .OnUnload = "[Event Procedure]" .Modal = True End With End Sub
Das Formular frmModelldetails
Das so zu öffnende Formular frmModelldetails verwendet die Tabelle tblModelle als Datenherkunft und zeigt alle Felder dieser Tabelle im Detailbereich an (siehe Bild 13). Dieses Formular enthält gleich zwei Kombinationsfelder.
Bild 13: Entwurf des Formulars frmModelldetails
Eines wollen wir mit dem gleichen Mechanismus ausstatten wie bereits das Kombinationsfeld cboModellID im Formular frmMobilfunkgeraetDetails. Dazu stellen wir zunächst die Namen dieser beiden Steuer-elemente auf cboHerstellerID und cboGeraeteartID ein.
Dann legen wir für das Kombinationsfeld cboHerstellerID eine Ereignisprozedur für das Ereignis Beim Doppelklicken an. Die Prozedur zum Öffnen von frmHersteller sieht ähnlich aus wie die vorherige Prozedur:
Private Sub cboHerstellerID_DblClick(Cancel As Integer) Dim strFormular As String strFormular = "frmHersteller" If Not IsNull(Me!cboHerstellerID) Then DoCmd.OpenForm strFormular, OpenArgs:=Me!cboHerstellerID Else DoCmd.OpenForm strFormular, OpenArgs:=0 End If Set objFrmHersteller = Forms(strFormular) With objFrmHersteller .OnUnload = "[Event Procedure]" .Modal = True End With End Sub
Allerdings ist das Formular frmHersteller dafür ausgelegt, eine Übersicht der Hersteller im Unterformular anzuzeigen und den aktuell markierten Hersteller im Detailbereich des Hauptformulars. Wir wollen also nicht einfach nur das Formular nach den Herstellern filtern, sondern das Formular mit allen Daten öffnen und den im Kombinationsfeld des aufrufenden Formulars gewählten Eintrag anzeigen.
Dazu übergeben wir die ID dieses Datensatzes per Öffnungsargument (OpenArgs) an das aufgerufene Formular. Dazu fügen wir im Formular frmHersteller eine Prozedur für das Ereignis hinzu, dass durch die Ereigniseigenschaft Beim Öffnen ausgelöst wird und wie folgt gefüllt wird:
Private Sub Form_Open(Cancel As Integer) If Me.OpenArgs > 0 Then Me!sfmHersteller.Form.Recordset.FindFirst "HerstellerID = " & Me.OpenArgs ElseIf Me.OpenArgs = 0 Then Me.Bezeichnung.SetFocus DoCmd.GoToRecord Record:=acNewRec End If End Sub
Dies zeigt dann direkt den im Kombinationsfeld gewählten Eintrag an. Sollte das Kombinationsfeld noch leer sein, verschiebt das Formular den Datensatzzeiger auf einen leeren, neuen Datensatz und setzt den Fokus auf das Textfeld Bezeichnung.
Wenn der Benutzer nun einen neuen Datensatz in diesem Formular anlegt oder einen der bestehenden Datensätze auswählt und das Formular schließt, löst dies das Ereignis Beim Entladen aus. Dazu haben wir im aufrufenden Formular ja bereits die Eigenschaft OnUnload auf den Wert [Event Procedure] eingestellt. Nun müssen wir das Ereignis noch implementieren, damit es auch ausgeführt wird, wenn der Benutzer das Formular schließt. Das Ereignis definieren wir wie folgt (um die leere Prozedur anzulegen, wählen Sie im linken Kombinationsfeld oben im Code-Fenster der Klasse Form_frmModelldetails den Eintrag objFrmHersteller und im rechten Kombinationsfeld den Wert Unload aus):
Private Sub objFrmHersteller_Unload(Cancel As Integer) Me!cboHerstellerID = objFrmHersteller!HerstellerID End Sub
Wenn das Formular nun geschlossen wird, stellt die Prozedur den Wert des Kombinationsfeldes cboHerstellerID auf den Wert des aktuell im Formular frmHersteller angezeigten Datensatzes ein. Erst danach wird dieses Formular dann endgültig geschlossen.
Im Detail sieht die Abfolge dann wie in Bild 14 aus. Ein Doppeklick auf das Kombinationsfeld cboModellID im Formular frmMobilfunkgeraetdetails öffnet das Formular frmModelldetails, welches wiederum ein Kombinationsfeld namens cboHerstellerID bereithält, um per Doppelklick das Formlar frmHersteller zu öffnen.
Bild 14: Öffnen der jeweiligen Detailformulare per Doppelklick auf die Kombinationsfelder
Geräteart für Modell auswählen
Bei der Geräteart gehen wir einen etwas einfacheren Weg, da es sich dabei schlicht um eine Lookup-Tabelle ohne weitere Felder handelt. Daher erlauben wir dem Benutzer, neue Einträge direkt über das Kombinationsfeld einzugeben. Dazu benötigen wir das Ereignis Bei nicht in Liste. Für dieses legen wir die Ereignisprozedur aus Listing 5 an.
Private Sub cboMobilfunkgeraeteartID_NotInList(NewData As String, Response As Integer) Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb If MsgBox("Der Eintrag '" & NewData & "' ist noch nicht vorhanden. Möchten Sie ihn anlegen", vbOKCancel, "Neuer Eintrag") = vbOK Then Response = acDataErrAdded db.Execute "INSERT INTO tblMobilfunkgeraetearten(Mobilfunkgeraeteart) VALUES('" & NewData & "')", dbFailOnError Else Response = acDataErrContinue Me!cboMobilfunkgeraeteartID.Undo End If Set db = Nothing End Sub
Listing 5: Anlegen neuer Eintrag in der Tabelle tblMobilfunkgeraetearten
Die Prozedur wird immer dann ausgelöst, wenn der Benutzer einen Eintrag in das Kombinationsfeld eingibt, der noch nicht in der Datenherkunft enthalten ist. Sie fragt dann den Benutzer per MsgBox-Anweisung, ob er den neuen Eintrag tatsächlich anlegen möchte. Falls ja, erledigt die Prozedur dies mit einer INSERT INTO-Aktionsabfrage. In diesem Fall wird der Rückgabeparameter Response auf die Konstante acDataErrAdded eingestellt, was dazu führt, dass der neue Eintrag direkt als Wert eingestellt wird.
Möchte der Benutzer den Wert nicht als neuen Eintrag zur Tabelle hinzufügen, erhält der Rückgabeparameter Response den Wert acDataErrContinue und die Eingabe in das Kombinationsfeld wird mit der Undo-Methode verworfen.
Zusammenfassung und Ausblick
Damit schließt sich der Kreis: Vom Formular frmMobilfunkgeraetdetails öffnen wir per Doppelklick auf das Kombinationsfeld cboModellID das Formular frmModelldetails, von dem wir wiederum per Doppelklick auf das Kombinationsfeld cboHerstellerID das Formular frmHersteller öffnen.
Jeweils beim Schließen der als modale Dialoge geöffneten Formulare wird der darin angelegte oder ausgewählte Wert als Wert in das jeweilige Kombinationsfeld eingetragen.
Es gibt noch einen kleinen Schönheitsfehler: Wenn Sie das Formular frmMobilfunkgeraetdetails vom Formular frmMobilfunkgeraeteUebersicht aus aufrufen, funktioniert beim Öffnen der folgenden Formulare das Einstellen des modalen Modus nicht mehr korrekt. Aber das schauen wir uns später an.
Downloads zu diesem Beitrag
Enthaltene Beispieldateien:
1706_Handyverwaltung.accdb