Geräteeinweisungen verwalten 2: Formulare

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.

Datensatzherkunft des Listenfeldes für die Mitarbeiter

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.

Entwurf des Formulars frmMitarbeiterUebersicht

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.

Das Formular frmMitarbeiterUebersicht, hier noch ohne Daten

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.

Das Formular frmMitarbeiterDetail in der Entwurfsansicht

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

Anlegen eines neuen Mitarbeiters

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=, wobei mit der Variablen lngID gefüllt wird.

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:

Schreibe einen Kommentar