Die Einweisung in Geräte für verschiedene Mitarbeiter ist ein tolles Beispiel für eine m:n-Beziehung. Wir werden uns in dieser Artikelreihe ansehen, wie das Datenmodell für die m:n-Beziehung aufgebaut wird, wie Sie die Formulare zur Verwaltung der Einweisungen gestalten und wie Sie mit Berichten verschiedene Listen ausgeben können – zum Beispiel, welcher Mitarbeiter welche Einweisungen erhalten hat oder für welches Gerät welcher Mitarbeiter geschult wurde. Im vorliegenden zweiten Teil schauen wir uns an, wie Sie die Daten der Tabellen der Anwendung in Formularen verwalten können.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 2103_GeraeteeinweisungenVerwalten2.accdb.
Benötigte Formulare
Wenn wir eine Anwendung mit zwei Tabellen zum Speichern von Objekten wie Mitarbeitern und Geräten und einer Tabelle zum Herstellen von Beziehungen zwischen diesen beiden Objekttypen mit einer Benutzeroberfläche versehen wollen, benötigen wir zumindest die folgenden Elemente:
- ein Detailformular zum Anlegen und Bearbeiten von Mitarbeitern
- ein Detailformular zum Anlegen und Bearbeiten von Geräten
- ein Übersichtsformular zur Verwaltung der Mitarbeiter
- ein Übersichtsformular zur Verwaltung der Geräte
Das waren die grundlegenden Formulare. Darüber hinaus wollen wir noch die Möglichkeit einbauen, die Mitarbeiter aufzulisten, die an einem bestimmten Gerät geschult wurden sowie die Geräte anzugeben, an denen ein bestimmter Mitarbeiter geschult wurde.
Dazu können wir natürlich die Detailformulare zum Anlegen und Bearbeiten der Mitarbeiter und Geräte nutzen. Wir würden dann in einem Unterformular des Formulars zur Anzeige der Mitarbeiter die Geräte ausgeben, für deren Bedienung er geschult wurde und umgekehrt. Wir können die Verknüpfungsinformationen also grundsätzlich in den grundlegenden Formularen unterbringen, indem wir entsprechende Unterformulare hinzufügen.
Übersichtsformular für die Mitarbeiter
Das erste Übersichtsformular soll die Mitarbeiter anzeigen sowie Schaltflächen zum Hinzufügen eines neuen Mitarbeiters, zum Bearbeiten und zum Löschen des aktuell markierten Mitarbeiters bereitstellen. Offen ist noch, wie wir die Liste der Mitarbeiter in das Formular integrieren. Hier verwendet man üblicherweise ein Unterformular in der Datenblattansicht oder ein Listenfeld. Da wir die Mitarbeiter in der Übersicht nicht bearbeiten wollen, wählen wir das Listenfeld.
Also erstellen wir ein neues Formular namens frmMitarbeiterUebersicht in der Entwurfsansicht. Diesem fügen wir ein Listenfeld namens lstMitarbeiter hinzu. Für das Listenfeld stellen wir als Datensatzherkunft eine Abfrage ein, welche die Daten der Tabelle tblMitarbeiter enthält und deren Entwurf wie in Bild 1 aussieht.
Bild 1: Datensatzherkunft des Listenfeldes für die Mitarbeiter
Die Eigenschaft Spaltenanzahl stellen wir auf 2 ein und Spaltenbreiten auf 0cm. Dies blendet die erste Spalte mit dem Primärschlüsselwert aus und zeigt nur die Mitarbeiter im Format Nachname, Vorname an.
Steuerelemente anordnen
Das Listenfeld lstMitarbeiter ordnen wir wie in Bild 2 an. Darunter platzieren wir die drei Schaltflächen Neu, Bearbeiten und Löschen.
Bild 2: Entwurf des Formulars frmMitarbeiterUebersicht
Außerdem legen wir für die Steuerelemente verschiedene Werte für die Eigenschaften Horizontaler Anker und Vertikaler Anker fest. Für das Listenfeld erhalten beide Eigenschaften den Wert Beide.
Für die Schaltflächen stellen wir für Vertikaler Anker den Wert Unten ein, damit diese beim Vergrößern der Höhe des Formulars am unteren Rand verbleiben und nicht vom vergrößerten Listenfeld überdeckt werden.
Für das Bezeichnungsfeld des Listenfeldes müssen wir den Wert von Vertikaler Anker, der automatisch auf Unten eingestellt wurde, wieder den Wert Oben festlegen und Horizontaler Anker auf Links.
Außerdem stellen wir für das Formular die Eigenschaften Navigationsschaltflächen, Datensatzmarkierer, Trennlinien und Bildlaufleisten auf den Wert Nein ein sowie die Eigenschaft Automatisch zentrieren auf Ja.
Das Formular sieht nun in der Formularansicht wie in Bild 3 aus. Allerdings ist das Listenfeld natürlich noch leer.
Bild 3: Das Formular frmMitarbeiterUebersicht, hier noch ohne Daten
Detailformular für die Mitarbeiter anlegen
Damit wir neue Mitarbeiter anlegen können, fügen wir der Datenbank ein weiteres Formular namens frmMitarbeiterDetail hinzu. Dieses verwendet als Datensatzquelle die Tabelle tblMitarbeiter. Aus dieser ziehen wir aus der Feldliste alle Felder in den Detailbereich des Formularentwurfs. Auch für dieses Formular stellen wir die Eigenschaft Automatisch zentrieren auf den Wert Ja ein.
Schließlich fügen wir noch eine Schaltfläche namens cmdOK hinzu, welche die folgende Ereignisprozedur auslöst und so das aktuelle Formular schließt:
Private Sub cmdOK_Click() DoCmd.Close acForm, Me.Name End Sub
Das Zwischenergebnis sieht wie in Bild 4 aus.
Bild 4: Das Formular frmMitarbeiterDetail in der Entwurfsansicht
Detailformular zum Anlegen eines neuen Mitarbeiters öffnen
Damit die Schaltfläche Neu des Formulars frmMitarbeiterUebersicht, der wir den Namen cmdNeu geben, das Formular frmMitarbeiterDetail zum Anlegen eines neuen Datensatzes öffnet, hinterlegen wir die folgende Ereignisprozedur für diese Schaltfläche:
Private Sub cmdNeu_Click() DoCmd.OpenForm "frmMitarbeiterDetail", DataMode:=acFormAdd, WindowMode:=acDialog Me!lstMitarbeiter.Requery End Sub
Die DoCmd.OpenForm-Anweisung öffnet das Formular frmMitarbeiterDetail. Dabei gibt es für den Parameter DataMode den Wert acFormAdd an, was das Formular mit einem neuen, leeren Datensatz öffnet.
Der Parameter WindowMode mit dem Wert acDialog sorgt dafür, dass das Formular als modaler Dialog geöffnet wird. Dadurch setzt Access die aufrufende Prozedur erst fort, wenn der Benutzer das Formular wieder schließt (oder unsichtbar macht).
Das führt dazu, dass die anschließende Requery-Methode des Listenfeldes nach dem Anlegen eines neuen Mitarbeiters aktualisiert wird.
Wenn wir nun das Formular frmMitarbeiterDetail schließen, können wir es vom Formular frmMitarbeiterUebersicht mit der Schaltfläche cmdNeu erneut öffnen.
Dort geben wir dann den neuen Mitarbeiter ein und schließen das Formular mit einem Klick auf die Schaltfläche OK. Im aufrufenden Formular frmMitarbeiter-Uebersicht erscheint dann postwendend der neue Mitarbeiter (siehe Bild 5).
Bild 5: Anlegen eines neuen Mitarbeiters
Mitarbeiter bearbeiten
Um einen Mitarbeiter zu bearbeiten, haben wir die Schaltfläche cmdBearbeiten im Formular frmMitarbeiterUebersicht hinterlegt. Ein Klick auf diese löst die Prozedur aus Listing 1 aus. Hier ermitteln wir zuerst den Primärschlüsselwert des aktuell im Listenfeld markierten Eintrags.
Private Sub cmdBearbeiten_Click() Dim lngID As Long lngID = Nz(Me!lstMitarbeiter, 0) If Not lngID = 0 Then DoCmd.OpenForm "frmMitarbeiterDetail", DataMode:=acFormEdit, WindowMode:=acDialog, WhereCondition:="MitarbeiterID = " & lngID Me!lstMitarbeiter.Requery End If End Sub
Listing 1: Öffnen eines Mitarbeiters zum Bearbeiten
Ist dieser Null, was der Fall ist, wenn kein Eintrag markiert ist, liefert die Nz-Funktion statt dem Wert Null den Zahlenwert 0 zurück. Anderenfalls landet der Wert des Primärschlüsselfeldes des markierten Eintrags in der Variablen lngID.
Bei dem OpenForm-Aufruf übergeben wir wieder den Namen des zu öffnenden Formulars. Diesmal soll das Formular den aktuell markierten Datensatz anzeigen statt eines neuen – das geben wir mit dem Wert acFormEdit für den Parameter DataMode an.
Das Formular soll wieder als modaler Dialog geöffnet werden. Damit es nur den angeklickten Mitarbeiter anzeigt, übergeben wir diesen als Kriterium mit dem Parameter WhereCondition und dem Wert MitarbeiterID=
Bevor wir das Formular frmMitarbeiterDetail um die Anzeige der Geräteeinweisungen in einem Unterformular erweitern, wollen wir erst einmal die Funktionen zum Verwalten der Mitarbeiter hinzufügen.
Mitarbeiter löschen
Um einen Mitarbeiter zu löschen, muss der Benutzer diesen markieren und dann auf die Schaltfläche cmdLoeschen klicken.
Diese löst dann im einfachsten Fall die Prozedur aus Listing 2 aus.
Private Sub cmdLoeschen_Click() Dim db As DAO.Database Dim lngID As Long Dim strBezeichnung As String Set db = CurrentDb lngID = Nz(Me!lstMitarbeiter, 0) If Not lngID = 0 Then On Error Resume Next db.Execute "DELETE FROM tblMitarbeiter WHERE MitarbeiterID = " & lngID, dbFailOnError If Err.Number = 3200 Then strBezeichnung = Me!lstMitarbeiter.Column(1) MsgBox "Der Mitarbeiter '" & strBezeichnung & "' konnte nicht gelöscht werden, da bereits Einweisungen für " _ & "diesen hinterlegt wurden.", vbOKOnly + vbExclamation, "Löschen nicht möglich" Else Me!lstMitarbeiter.Requery End If On Error GoTo 0 End If End Sub
Listing 2: Löschen eines Mitarbeiters
Die Prozedur ermittelt den Primärschlüsselwert des im Listenfeld markierten Mitarbeiters. Sofern dieser vorhanden ist, deaktiviert die Prozedur die eingebaute Fehlerbehandlung und führt dann eine DELETE-Anweisung aus. Diese soll den Mitarbeiter mit der angegebenen MitarbeiterID aus der Tabelle tblMitarbeiter löschen.
Fehler durch Löscheinschränkung
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: