Home > Artikel > Ausgabe 6/2017 > Handyverwaltung IV: Mobilfunkgeräte verwalten

Handyverwaltung IV: Mobilfunkgeräte verwalten

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

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.

Der Teil des Datenmodells, um den wir uns in diesem Artikel kümmern

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.

Die Beziehung wird als 1:1-Beziehung eingetragen.

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

Eindeutiger Index für das Feld Bezeichnung

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

Datensätze der Tabelle tblHersteller

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.

Datenmodell der Tabellen rund um die Mobilfunkgeräte

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.

Verwaltung der Hersteller

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.

Datenherkunft des Unterformulars sfmMobilfunkgeraeteUebersicht

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.

Hinzufügen der Felder zum Entwurf des Formulars sfmMobilfunkgeraeteUebersicht

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.

Entwurf des Hauptformulars frmMobilfunkgeraeteUebersicht

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.

Das Formular frmMobilfunkgeraeteUebersicht in der Formularansicht

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

Datenherkunft des Formulars frmMobilfunkgeraetdetails

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:

Entwurf des Formulars frmMobilfunkgeraetdetails

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

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!