In diesem Beitrag kümmern wir uns um die Verwaltung von Weiterbildungen für Mitarbeiter. Dabei soll man für jede Weiterbildung mehrere Einheiten beziehungsweise Termine festlegen können, die dann beliebig oft angeboten werden können. Den Mitarbeitern teilt man mit der Beispielanwendung die Weiterbildungen zu und kann die Teilnahme eines jeden Mitarbeiters an den einzelnen Terminen protokollieren.
Die Datenbank zur Verwaltung von Weiterbildungen soll zunächst die Mitarbeiter verwalten, die an den Weiterbildungen teilnehmen. Dazu erstellen wir zunächst zwei Tabellen namens tblMitarbeiter und tblAnreden. Die Tabelle tblMitarbeiter soll dabei die üblichen Daten enthalten wie Anrede, Vorname, Nachname, Straße, PLZ, Ort, Telefon, Telefax, E-Mail und noch ein Bemerkungen-Feld – für alle Fälle. Die Tabelle tblAnreden speichert die Anreden und ist über das Fremdschlüsselfeld AnredeID der Tabelle tblMitarbeiter mit dieser verknüpft. Da solche Tabellen quasi in jedem Beispiel vorkommen, an dieser Stelle nur der überblick über die beiden Tabellen samt Beziehung im Datenmodell (s. Bild 1).
Bild 1: Die Tabellen tblMitarbeiter und tblAnreden im Beziehungen-Fenster
Weiterbildungen verwalten
Wesentlich spannender wird das Verwalten der Weiterbildungen. Jede Weiterbildung soll einen Anbieter haben, der in der Tabelle tblAnbieter gespeichert wird. Außerdem legen wir zwei Felder namens Standardintervall und Standardtag an. Das Feld Standardintervall gibt ein Intervall in Wochen vor, in dem die Veranstaltungen stattfinden. Standardtag legt den Wochentag fest, an dem die Weiterbildung üblicherweise stattfindet. Beide können später individuell angepasst werden.
Das war der einfache Teil. Nun kommen nämlich noch einige weitere Informationen, die in Tabellen gegossen werden wollen. Dabei verstehen wir unter Weiterbildung zunächst die Bezeichnung einer Weiterbildungsmaßnahme. Legen wir diese Tabelle, die im Entwurf wie in Bild 2 aussieht, schon einmal an. Sie enthält ein Feld zum Eintragen der Bezeichnung der Weiterbildung sowie ein Fremdschlüsselfeld zur Tabelle tblAnbieter. Das Feld Weiterbildung erhält außerdem einen eindeutigen Index, damit jede Bezeichnung nur einmal vergeben werden kann.
Bild 2: Entwurf der Tabelle tblWeiterbildungen
Wei-ter-bil-dungs-veranstaltungen
Jede Weiterbildung hat eine gewisse Anzahl von Veranstaltungen – manche haben vielleicht nur eine, andere laufen über mehrere Monate mit wöchentlichen Terminen.
Jede Weiterbildung mit ihren Veranstaltungen wird aber in der Regel nicht nur einmalig ausgeführt, sondern startet beispielsweise einmal im Jahr oder alle paar Monate. Vielleicht läuft eine Weiterbildung auch gleich in mehreren Auflagen parallel oder zeitlich versetzt.
Also haben wir nun schon Weiterbildungen mit jeweils mehreren Veranstaltungen, die gegebenenfalls immer wieder neu starten. Also müssen wir auch noch irgendwie die konkreten Termine verwalten, an denen die einzelnen Weiterbildungsveranstaltungen ausgeführt werden.
Um ehrlich zu sein: Das eigentliche Problem war hier nicht, die Tabellen und ihre Inhalte zu erstellen und in Beziehung zu setzen, sondern diese mit sinnvollen Bezeichnungen zu versehen. Im Prinzip gibt es ja jede Weiterbildung einmal als eine Art Vorlage mit ihren einzelnen Veranstaltungen und einmal als Instanz mit den tatsächlichen Terminen. Also legen wir die folgende Aufteilung fest: Wir erstellen eine Tabelle namens tblWeiterbildungen, welche die Bezeichnung der Weiterbildung und weitere Informationen wie den Anbieter aufnimmt. Als Bezeichnungen dienen dann etwa „VBA mit Access für Einsteiger“ oder „VBA mit Access für Fortgeschrittene“. Außerdem nimmt die Tabelle zwei Felder namens Standardintervall und Standardtag auf – dazu später mehr.
Als nächstes legen wir in einer Tabelle namens tblWeiterbildungsveranstaltungen die einzelnen Veranstaltungen fest, die im einfachsten Fall einfach mit der Weiterbildungsveranstaltung und einer laufenden Nummer versehen werden, also etwa VBA mit Access für Einsteiger I, VBA mit Access für Einsteiger II und so weiter. Diese Einträge müssen natürlich mit der Tabelle tblWeiterbildungen verknüpft werden. Den Entwurf für diese Tabelle finden Sie in Bild 3. Die Tabelle enthält ein Feld zur Bezeichnung der Weiterbildungsveranstaltung und das Fremdschlüsselfeld zur Tabelle tblWeiterbildungen.
Bild 3: Entwurf der Tabelle tblWeiterbildungsveranstaltungen
Weiterbildungstermine
Nun fehlen noch die Termine, an denen die einzelnen Veranstaltungen tatsächlich stattfinden. Diese speichern wir in einer Tabelle namens tblWeiterbildungstermine. Hier stellt sich nun die Frage: Mit welcher Tabelle verknüpfen wir die Datensätze dieser Tabelle Man gerät schnell in Versuchung, diese Datensätze mit der Tabelle tblWeiterbildungen zu verknüpfen. Prinzipiell keine schlechte Idee, aber jeder Weiterbildungstermin ist ja eigentlich eine Instanz einer Weiterbildungsveranstaltung aus der Tabelle tblWeiterbildungsveranstaltungen. So wird dann auch ein Schuh daraus: Wenn wir einen in der Tabelle tblWeiterbildungstermine gespeicherten Termin mit dem entsprechenden Datensatz der Tabelle tblWeiterbildungsveranstaltungen verknüpfen, können wir darüber erstens direkt die Bezeichnung der jeweiligen Veranstaltung ermitteln (also etwa VBA mit Access für Fortgeschrittene VIII). Zweitens erhalten wir über die Beziehung zwischen den Tabellen tblWeiterbildungsveranstaltungen und tblWeiterbildungen dann auch den gewünschten Bezug zur Tabelle tblWeiterbildungen. Die Tabelle sieht nun im ersten Entwurf wie in Bild 4 aus.
Bild 4: Entwurf der Tabelle tblWeiterbildungstermine
Weiterbildungstabellen im überblick
Schauen wir uns Bild 5 an, um einen überblick über die Tabellen zur Verwaltung der Weiterbildungen, Veranstaltungen und Termine zu erhalten. Etwas ist dort noch nicht richtig rund. Es handelt sich um die Tatsache, dass wir zwar nun zu jeder Weiterbildung die Veranstaltung und zu jeder Veranstaltung die konkreten Termine festlegen können, aber dass die einzelnen Termine noch nicht zu einer Veranstaltungsreihe zusammengefasst sind. Warum ist das wichtig Mit dem aktuellen Stand des Datenmodells erhalten wir, wenn die Veranstaltung VBA mit Access für Einsteiger etwa drei Teile enthält (VBA mit Access für Einsteiger I, II und III), für die erste Instanz dieser Veranstaltungsreihe drei Termine. Wenn die Weiterbildung danach erneut angeboten wird, werden die gleichen Termine erneut angelegt. Es gibt dann also jeweils zwei Termine für VBA mit Access für Einsteiger I, II und III. Abgesehen von dem Datum, an dem sich die Zusammengehörigkeit der Termine zu einer Veranstaltungsreihe möglicherweise ablesen lässt (wenn nicht zwei Kurse parallel stattfinden), gibt es keine Möglichkeit, die Zusammengehörigkeit zu erkennen. Aber ist das überhaupt notwendig beziehungsweise gibt es noch weitere Daten, die zusammenfassend für die Termine einer Veranstaltungsreihe aufgezeichnet werden müssen Solche gibt es durchaus: Zum Beispiel kann es ja sein, dass zwei Kurse gleichzeitig durchgeführt werden, aber jeweils ein anderer Dozent die Ausführung übernimmt. Oder dass Kurse an verschiedenen Orten stattfinden. Wie auch immer: Es scheint, dass wir noch eine weitere Tabelle hinzunehmen müssen, welche die Termine einer Weiterbildung zusammenfasst. Die Frage ist nur: Wie nennen wir diese tblWeiterbildungsreihen sollte eigentlich ein passender Name für die Tabelle sein (s. Bild 6).
Bild 5: Tabelle zur Zusammenfassung mehrerer Weiterbildungstermine zu einer Reihe
Bild 6: Datenmodell der Tabellen rund um die Weiterbildung
Diese Tabelle soll neben dem Primärschlüsselfeld zunächst ein Fremdschlüsselfeld zur Tabelle tblWeiterbildungen erhalten. Desweitern gibt es zwei weitere Fremdschlüsselfelder zu den Tabellen tblDozenten und tblWeiterbildungsorte, die jedoch der Einfachheit halber neben dem Primärschlüsselfeld nur jeweils ein einziges Feld zur Angabe einer Bezeichnung enthalten (beim Dozenten etwa Dr. Jürgen Müller, beim Weiterbildungsort zum Beispiel VHS Duisburg, Raum 123).
Neben der neuen Tabelle benötigen wir noch ein weiteres Feld in der Tabelle tblWeiterbildungstermine, denn irgendwie müssen wir ja festlegen, welche Termine zu einer Weiterbildungsreihe zusammengefasst werden. Also fügen wir auch dieser Tabelle ein Fremschlüsselfeld namens WeiterbildungsreiheID hinzu, welches die Tabelle mit der Tabelle tblWeiterbildungsreihen verknüpft.
Zusammengefasst hat sich also nun einiges geändert im Datenmodell, das nun wie in Bild 8 aussieht. Bevor wir uns die Gestaltung der Formulare zur Verwaltung der Weiterbildungen anschauen, kommen wir auf die Mitarbeiter zurück.
Bild 7: Datenmodell mit der Tabelle zur Zusammenfassung der Weiterbildungstermine
Formulare zur Mitarbeiterverwaltung
Zur Verwaltung der Mitarbeiter verwenden wir zunächst ein übersichtsformular, das aus dem Hauptformular frmMitarbeiterUebersicht und dem Unterformular sfmMitarbeiterUebersicht besteht.
Das Hauptformular enthält lediglich das Unterformularsteuerelement mit dem Unterformular sowie zwei Schaltflächen namens cmdNeuerMitarbeiter und cmdMitarbeiterAnzeigen (neben einem Icon und einer überschrift im Formularkopf) – s. Bild 7.
Bild 8: Das Formular zur Anzeige der Mitarbeiterübersicht
Das Unterformular verwendet als Datenherkunft die Tabelle tblMitarbeiter und zeigt alle Felder dieser Tabelle an. Als Standardansicht verwendet das Formular das Datenblatt.
Neuen Mitarbeiter anlegen
Ein Klick auf die Schaltfläche cmdNeuerMitarbeiter soll ein weiteres Formular namens frmMitarbeiterdetails öffnen und einen neuen, leeren Datensatz anzeigen. Dazu löst der Mausklick auf diese Schaltfläche die Prozedur aus Listing 1 aus. Diese ruft das Formular frmMitarbeiterdetails auf und übergibt für den Parameter DataMode den Wert acFormAdd, damit das Formular gleich einen neuen, leeren Datensatz anzeigt.
Private Sub cmdNeuerMitarbeiter_Click() Dim lngMitarbeiterID As Long DoCmd.OpenForm "frmMitarbeiterDetails", DataMode:=acFormAdd, WindowMode:=acDialog If IstFormularGeoeffnet("frmMitarbeiterdetails") Then lngMitarbeiterID = Forms!frmMitarbeiterdetails!MitarbeiterID DoCmd.Close acForm, "frmMitarbeiterdetails" Me!sfmMitarbeiterUebersicht.Form.Requery Me!sfmMitarbeiterUebersicht.Form.Recordset.FindFirst "MitarbeiterID = " & lngMitarbeiterID End If End Sub
Listing 1: öffnen des Formulars zum Hinzufügen eines neuen MItarbeiters
Durch den Wert acDialog für den Parameter WindowMode wartet der aufrufende Code, bis das aufgerufene Formular den Fokus verliert.
Dann prüft die Prozedur, ob das Formular noch geöffnet ist (was der Fall ist, wenn der Benutzer dort auf die Schaltfläche cmdOK klickt – siehe weiter unten) oder ob es bereits geschlossen wurde (durch die Schaltfläche cmdAbbrechen).
Ist das Formular noch geöffnet, speichert die Prozedur den Primärschlüsselwert des im Formular frmMitarbeiterdetails neu angelegten Datensatzes in der Variablen lngMitarbeiterID. Danach schließt sie das aktuell nicht sichtbare Formular endgültig. Damit der neue Mitarbeiterdatensatz im Unterformular sfmMitarbeiterUebersicht erscheint, aktualisiert die Prozedur die Datenherkunft dieses Formulars. Schließlich stellt sie den Datensatzzeiger auf den soeben neu hinzugefügten Datensatz ein, dessen Primärschlüsselwert ja in der Variablen lngMitarbeiterID zwischengespeichert wurde.
Mitarbeiterdetails anzeigen
Die Schaltfläche cmdMitarbeiterdetails öffnet ebenfalls dieses Formular, soll aber den aktuell im Unterformular markierten Mitarbeiter mit seinen Daten zur direkten Bearbeitung anzeigen.
Die dazu benötigte Prozedur finden Sie in Listing 2. Die Prozedur prüft zunächst, ob der Benutzer überhaupt einen Datensatz im Unterformular sfmMitarbeiter-Uebersicht ausgewählt hat. Falls nicht, erscheint eine entsprechende Meldung. Hat er einen Mitarbeiter ausgewählt, wird das Formular frmMitarbeiterdetails geöffnet. Dabei übergibt die Prozedur cmdMitarbeiterdetails_Click als WhereCondition einen Ausdruck, der beispielsweise MitarbeiterID = 123 lautet und der dafür sorgt, dass der aktuell ausgewählte Mitarbeiter angezeigt wird.
Private Sub cmdMitarbeiterdetails_Click() If Not IsNull(Me!sfmMitarbeiterUebersicht.Form!MitarbeiterID) Then DoCmd.OpenForm "frmMitarbeiterdetails", DataMode:=acFormEdit, WhereCondition:="MitarbeiterID = " _ & Me!sfmMitarbeiterUebersicht.Form!MitarbeiterID Else MsgBox "Wählen Sie zunächst den anzuzeigenden Mitarbeiter aus." End If End Sub
Listing 2: öffnen des Formulars frmMitarbeiterdetails zum Anzeigen eines vorhandenen Mitarbeiters
Das so geöffnete Formular sieht schließlich wie in Bild 9 aus. Dies ist allerdings noch nicht der endgültige Zustand des Formulars, da wir dort später noch Steuerelemente zum Verwalten der Weiterbildungen einfügen, an denen der Mitarbeiter teilgenommen hat.
Bild 9: Die Mitarbeiterdetails im passenden Formular
Formulare für die Weiterbildungen
Die obersten Elemente der Hierarchie rund um die Weiterbildungen stammen aus der Tabelle tblWeiterbildungen. Für diese legen wir deshalb zunächst ein übersichtsformular namens frmWeiterbildungen-Uebersicht an, das wie in Bild 10 aussieht. Das Unterformular sfmWei-ter-bil-dungenUebersicht verwendet die Tabelle tblWeiterbildungen als Datenherkunft.
Bild 10: Formular zur Verwaltung der Weiterbildungen
Die beiden Schaltflächen cmdNeueWeiterbildung und cmdWeiterbildungDetails arbeiten analog zu den entsprechenden Schaltflächen im Formular frmMitarbeiterUebersicht. Das dadurch geöffnete Formular frmWeiterbildungsdetails sieht mit einem neuen, leeren Datensatz zunächst wie in Bild 11 aus.
Bild 11: Das Formular frmWeiterbildungsdetails
Dort geben Sie den Namen der Weiterbildung ein und wählen einen Anbieter aus. Dummerweise stehen im aktuellen Zustand noch keine Anbieter zur Verfügung. Dafür wollen wir kein eigenes Formular anbieten, sondern einfach nur die Eingabe neuer Datensätze über das Kombinationsfeld erlauben. Dazu legen Sie für das Ereignis Bei nicht in Liste des Kombinationsfeldes cboAnbieterID (wir haben den Namen des Steuerelements um ein entsprechendes Präfix erweitert) die Ereignisprozedur aus Listing 3 an. Diese legt, wenn der Benutzer einen noch nicht in der Tabelle tblAnbieter enthaltenen Anbieter in das Kombinationsfeld einträgt, einen neuen Datensatz in der Tabelle an.
Private Sub AnbieterID_NotInList(NewData As String, Response As Integer) Dim db As DAO.Database Response = acDataErrAdded Set db = CurrentDb db.Execute "INSERT INTO tblAnbieter(Anbieter) VALUES(''" & NewData & "'')", dbFailOnError Set db = Nothing End Sub
Listing 3: Hinzufügen noch nicht vorhandener Einträge in die Datensatzherkunft des Kombinationsfeldes
Damit das Formular nach dem Abschluss der Eingabe in das Kombinationsfeld cboAnbieterID nicht zum nächsten Datensatz wechselt, stellen wir dort außerdem die Eigenschaft Zyklus auf Aktueller Datensatz ein.
Weiterbildungsdetails verwalten
Nun sind der Name der Weiterbildung und der Anbieter ja nicht die einzigen Daten zu einer Weiterbildung (man könnte hier sicher noch weitere Details verwalten, aber das sparen wir uns aus Gründen der übersichtlichkeit). Die übrigen Daten befinden sich allerdings in anderen Tabellen – so zum Beispiel die Weiterbildungsveranstaltungen. Diese fügen wir als Erstes zum Formular frmWeiterbildungsdetails hinzu, und zwar in Form des Unterformulars sfmWeiterbildungsveranstaltungen. Dieses verwendet eine Abfrage als Datenherkunft, die auf der Tabelle tblWeiterbildungsveranstaltungen basiert. Die Abfrage sortiert die enthaltenen Datensätze nach dem Wert des Feldes ReihenfolgeID. Allerdings sollen nur die zwei Felder Weiterbildungsveranstaltung und ReihenfolgeID in der Datenblattansicht angezeigt werden.
Damit das Unterformular nur die Daten zum aktuell im Hauptformular angezeigten Datensatz liefert, sollte Access gleich beim Einfügen die beiden Eigenschaften Verknüpfen von und Verknüpfen nach auf den Wert WeiterbildungID einstellen (s. Bild 12).
Bild 12: Das Formular frmWeiterbildungsdetails mit Unterformular
Damit können wir nun Weiterbildungsveranstaltungen zu den Weiterbildungen hinzufügen (s. Bild 13). Damit das Feld ReihenfolgeID automatisch mit dem nächstgrößeren Wert gefüllt wird, fügen wir für das Ereignis Beim Anzeigen des Unterformulars die Ereignisprozedur aus Listing 4 ein. Die Prozedur ermittelt mit der DMax-Funktion den größten Wert für das Feld ReihenfolgeID für die Datensätze der Tabelle tblWeiterbildungsveranstaltungen, das mit dem aktuellen Datensatz im Hauptformular verknüpft ist. Diesem fügt die Prozedur den Wert 1 hinzu und stellt das Ergebnis als Standardwert für den folgenden Datensatz ein.
Bild 13: Bearbeiten von Weiterbildungsveranstaltungen
Dummerweise funktioniert dies beim Löschen eines Datensatzes im Unterformular nicht wie gewünscht: Wenn Sie beispielsweise den Datensatz mit der Nummer 4 löschen, bleibt der Standardwert für das Feld ReihenfolgeID für den neuen Datensatz auf 5 stehen.
Fügen Sie dann einen neuen Datensatz hinzu, hat dieser den Wert 5 und der nun angezeigte neue Datensatz ebenfalls.
Abhilfe schafft es, wenn Sie die durch das Ereignis Nach Löschbestätigung ausgelöste Prozedur mit einem Aufruf der soeben hinzugefügten Prozedur Form_Current versehen:
Private Sub Form_AfterDelConfirm( Status As Integer) Form_Current End Sub
Das Ereignis Beim Löschen hilft hier nicht weiter, da der zu löschende Datensatz zu diesem Zeitpunkt noch in der zugrunde liegenden Tabelle gespeichert ist.
Termine anlegen
Nun haben wir die Möglichkeit, Weiterbildungen und die einzelnen Weiterbildungsveranstaltungen einzugeben. Als Nächstes kümmern wir uns darum, die passenden Termine einzutragen. Wenn wir nun die erste Instanz dieser Weiterbildung anlegen, können wir diese am besten in einem weiteren Unterformular anzeigen. Diese Liste würde dann etwa wie folgt aussehen:
- VBA mit Access für Einsteiger, Teil I, 1.8.2014
- VBA mit Access für Einsteiger, Teil II, 8.8.2014
- VBA mit Access für Einsteiger, Teil III, 15.8.2014
Das wäre okay, aber wenn nun weitere Instanzen dieser Weiterbildung angelegt werden, die möglicherweise noch parallel stattfinden, wird es unübersichtlich. Also nutzen wir auch noch die Tabelle tblWeiterbildungsreihen in Verbindung mit der Tabelle tblWeiterbildungstermine. Damit bilden wir dann den ersten Termin (aus tblWeiterbildungstermine) sowie den Dozenten und den Weiterbildungsort in einem ersten Unterformular ab. Wenn der Benutzer einen der dortigen Einträge auswählt, soll ein weiteres Unterformular dann die passende Daten aus der Tabelle tblWeiterbildungstermine liefern.
Im Entwurf sieht dies nun wie in Bild 14 aus. Das Unterformular sfmWeiterbildungreihen soll die Datensätze der Tabelle tblWeiterbildungsreihen anzeigen, die mit dem aktuellen Datensatz der Tabelle tblWeiterbildungen im Hauptformular verknüpft sind. Dazu stellen wir die beiden Eigenschaften Verknüpfen von und Verknüpfen nach beide auf den Wert WeiterbildungID ein.
Bild 14: Das Formular frmWeiterbildungsdetails im Entwurf
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo