Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
Weiterbildungen verwalten, Teil I
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 tblWeiterbildungenWeiterbildungsveranstaltungen
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 tblWeiterbildungstermineWeiterbildungstabellen 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 WeiterbildungstermineFormulare 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 sfmMitarbeiterUebersicht 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 FormularFormulare 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 frmWeiterbildungenUebersicht an, das wie in Bild 10 aussieht. Das Unterformular sfmWeiterbildungenUebersicht verwendet die Tabelle tblWeiterbildungen als Datenherkunft.
Bild 10: Formular zur Verwaltung der WeiterbildungenDie 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 frmWeiterbildungsdetailsDort 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 UnterformularDies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.