Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Mit den Anleitungen des ersten Teils dieses Beitrags aus der letzten Ausgabe können Sie eine Schulungsverwaltung erstellen, mit der Schulungsprogramme sowie die angemeldeten Teilnehmer und deren Abschlüsse verwaltet werden. In dieser Ausgabe lernen Sie, wie Sie die Software um eine Raum- und Kursleiterplanung erweitern können. Außerdem erfahren Sie, wie Sie ein Auswahlformular zum Druck von Stunden- und Raumbelegungsplänen entwerfen können.
In der bisherigen Version der Kursverwaltung können Sie zu jedem Kurs mehrere Starttermine jeweils mit einem Kursleiter und einer Raumnummer angeben. Pro Termin lassen sich dabei mehrere Kurseinheiten mit Start- und Enddatum erfassen (siehe Bild 1).
Bild 1: Alte Version der Kursverwaltung
Mit dieser Variante haben Sie programmtechnisch aber nicht die Möglichkeit zu prüfen, ob für eine angegebene Kurseinheit der gewählte Raum bzw. Kursleiter frei ist.
Folglich kann es passieren, dass Räume doppelt belegt werden oder Kursleiter zwei Kurse gleichzeitig halten müssten.
Anpassung der Datenstruktur
Um einen Prüfmechanismus einbauen zu können, ergänzen Sie die Datenstruktur so, dass zusätzlich zu jeder in der Tabelle tblTermindetails gespeicherten Kurseinheit der Raum und der Kursleiter gespeichert werden.
Fügen Sie dazu in der Tabelle tblTermindetails die Felder RaumID und KursleiterID ein.
Verknüpfen Sie anschließend die Felder mit den entsprechenden Primärschlüsseln der Tabellen tblRaeume und tblKursleiter unter Verwendung der referenziellen Integrität.
Bild 2 zeigt die neue Datenstruktur für den entsprechenden Teilbereich.
Das neue FormularfrmTermineBearbeiten
Bild 2: Neue Datenstruktur für die Kursverwaltung
Bild 3: Das neue Formular frmTermineBearbeiten
Im nächsten Schritt passen Sie zunächst das Unterformular frmTerminDetails an. Fügen Sie dazu die zwei Kombinationsfelder KursleiterID und RaumID ein, über die die Auswahl des Kursleiters und des Raumes zu einer Kurseinheit erfolgt.
Praxis-Tipp
Am einfachsten erstellen Sie die Kombinationsfelder, indem Sie diese aus dem Formular frmTermineBearbeiten kopieren. Die Kombinationsfelder sind absolut identisch und das Anlegen ist mit nur zwei Mausklicks erledigt.
Nun ordnen Sie die Steuerelemente im Formular frmTermineBearbeiten noch neu an. Verbreitern Sie das Unterformular-Steuerelement, damit die neuen Felder in der Liste sichtbar sind, und platzieren Sie die Schaltflächen unterhalb der Liste. Das neue Formular könnte wie in Bild 3 gezeigt aussehen.
Verfügbarkeit prüfen
Die Verfügbarkeit eines Raumes oder Kursleiters kann jetzt für jede Kurseinheit separat geprüft werden. Die überprüfung erfolgt an zwei Stellen: zum einen in der Prozedur TermindetailsAnlegen, die über die Schaltfläche Einheiten anlegen aufgerufen wird und in einem Schritt mehrere Kurseinheiten einfügt; zum anderen nach der manuellen änderung von Werten direkt in den Kombinationsfeldern für den Raum und den Kursleiter.
Hinweis
Die Prüfmechanismen werden im Folgenden nur noch für Räume beschrieben, da sie mit denen für Kursleiter identisch sind. Dabei muss lediglich das Feld RaumID durch das Feld KursleiterID ersetzt werden.
Der Prüfmechanismus
Die eigentliche Verfügbarkeitsprüfung erfolgt über die Funktion IstRaumVerfügbar (s. Quellcode 1). Der Funktion werden die Raumnummer und der zu prüfende Zeitraum mit Start- und Enddatum übergeben.
Public Function IstRaumVerfügbar(RaumID, Startdatum, Enddatum) As Boolean Dim WhereKlausel As String If IsNull(Startdatum) Or IsNull(Enddatum) Then IstRaumVerfügbar = False Else WhereKlausel = "RaumID = " & Nz(RaumID, 0) _ & " AND ((" & SQLDatum(Startdatum) _ & " Between DateAdd(""s"",1,[Startdatum]) " _ & "And DateAdd(""s"",-1,[Enddatum]))" _ & " OR (" & SQLDatum(Enddatum) & " Between " _ & "DateAdd(""s"",1,[Startdatum]) And DateAdd(""s"",-1,[Enddatum]))" _ & " OR (" & SQLDatum(Startdatum) & "=[Startdatum])" _ & " OR (" & SQLDatum(Enddatum) & "=[Enddatum]))" If IsNull(DLookup("TermindetailID", "tblTermindetails", WhereKlausel)) Then IstRaumVerfügbar = True Else IstRaumVerfügbar = False End If End If End Function
Quellcode 1
Die Besonderheit liegt bei der Datumsbetrachtung. Die Prozedur schaut in der Tabelle tblTermindetails nach, ob das zu prüfende Start- bzw. Enddatum für die angegebene Raumnummer bereits innerhalb eines anderen in der Tabelle gespeicherten Zeitraums liegt. Der folgende Ausdruck dient dabei (exemplarisch für das Startdatum) als Bedingung:
SQLDatum(Startdatum) & " Between DateAdd("s",1,[Startdatum]) And DateAdd("s",-1,[Enddatum])"
In der Bedingung werden nicht die exakten Datumswerte geprüft, da sonst ein Kurs, der um 14:00 Uhr endet, mit einem zu prüfenden Kurs, der um 14:00 Uhr beginnt, zusammenfallen würde.
Die Abfrage würde dann als Ergebnis liefern, dass um 14:00 Uhr bereits ein Kurs vorhanden ist. Um das zu vermeiden, wird beim Startdatum eine Sekunde addiert und beim Enddatum eine Sekunde subtrahiert.
Folglich würde der Kurs, der um 14:00 Uhr endet, mit dem Wert 13:59:59 Uhr geprüft.
Hinweis
Alternativ zur DateAdd-Funktion können Sie auch mit Größer- und Kleiner-Zeichen arbeiten. Die Bedingung sähe dann wie folgt aus:
Hinweis
SQLDatum(Startdatum) & „>Startdatum And “ & SQLDatum(Startdatum) & „<Enddatum“
Ferner prüft die gesamte Bedingung, ob Start- oder Enddatum für den Raum schon vorhanden sind. Diese Fälle müssen ebenfalls ausgeschlossen werden.
Liefert die Gesamtbedingung für die Tabelle tblTermindetails keine Ergebnisse zurück, dann ist der Raum verfügbar.
Einbau in die Funktion TermindetailsAnlegen
Die Funktion IstRaumVerfügbar kann jetzt beim Anlegen von Kurseinheiten mittels der Funktion TermindetailsAnlegen eingesetzt werden. über die Abfrage aus Quellcode 2 wird zunächst die Raumnummer ermittelt, die beim Anlegen einer neuen Kurseinheit verwendet werden soll.
If IstRaumVerfügbar(RaumID, MyStartdatum, MyEnddatum) = False Then MyRaumID = "Null" RaumErrorstring = RaumErrorstring & MyStartdatum & " - " & MyEnddatum & vbCrLf Else MyRaumID = RaumID End If
Quellcode 2
Errorstring = "" If RaumErrorstring <> "" Then Errorstring = Errorstring & "Bei den folgenden Kursentermine konnte kein " & _ "Raum angelegt werden, da der vorgegebene Raum bereits belegt war:" Errorstring = Errorstring & vbCrLf & vbCrLf & RaumErrorstring & vbCrLf & vbCrLf End If If KursleiterErrorstring <> "" Then Errorstring = Errorstring & "Bei den folgenden Kursentermine konnte kein " & _ "Kursleiter angelegt werden, da der vorgegebene Kursleiter bereits einen " & _ "anderen Kurs hat:" Errorstring = Errorstring & vbCrLf & vbCrLf & KursleiterErrorstring End If If Errorstring <> "" Then MsgBox Errorstring, vbOKOnly + vbExclamation, "Fehler..." End If
Quellcode 3
Wenn der Raum verfügbar ist, wird die RaumID verwendet, die bei den Termindaten als Standard definiert wurde. Im anderen Fall setzt die Prozedur den Wert auf Null. Der Raum wird also freigelassen. Außerdem merkt sich die Prozedur den geprüften Zeitraum in der Variablen RaumErrorstring, um dem Anwender nach Anlage aller Kurseinheiten eine übersicht über die Kurse zu geben, für die der Standardraum nicht festgelegt werden konnte.
Diese Meldung wird wie folgt zusammengesetzt und zeigt zusätzlich die Kursleiter an, die nicht eingefügt werden konnten (s. Quellcode 3).
Bild 4: Fehlermeldung beim automatischen Anlegen von Kurseinheiten
Bild 4 zeigt eine solche Fehlermeldung. Dabei wurden die Kurseinheiten einfach doppelt angelegt, ohne die schon bestehenden vorher zu löschen.
Prüfen bei änderung von Kursdaten
Bild 5: Fehlermeldung bei manueller Eingabe von Kurseinheiten
Bild 6: Tabellenstruktur für die Abfrage qryWochenplanDrucken
If IstRaumVerfügbar(Me!RaumID, Me!Startdatum, _ Me!Enddatum) = False Then MsgBox "Der ausgewählte Raum ist zum angegebenen " _ & "Zeitraum bereits besetzt. Bitte wählen " _ & "Sie einen anderen Raum aus.", _ vbOKOnly + vbExclamation, "Fehler..." Cancel = True End If
Quellcode 4
Da im Terminformular die Kurseinheiten nachträglich vom Anwender verändert oder auch komplett manuell eingegeben werden können, müssen Sie die Verfügbarkeit auch im Formular frmTermindetails abprüfen.
Verwenden Sie dazu das Ereignis Vor Aktualisierung des Kombinationsfeldes RaumID, um ggf. eine ungültige Eingabe per Programm abzubrechen.
Die Ereignisprozedur prüft erst, ob Start- und Enddatum eingegeben sind. Fehlt einer der beiden Werte, kann die Verfügbarkeit nicht ermittelt werden und die Prozedur bricht die Eingabe mit einem Hinweis für den Anwender ab.
Sind beide Datumswerte vorhanden, verwendet die Prozedur wieder die Funktion IstRaumVerfügbar.
Falls der eingegebene Raum nicht verfügbar ist, erhält der Anwender eine Meldung und die Eingabe wird mit dem Ausdruck Cancel=True abgebrochen (siehe Bild 5).
Nachdem Sie die Erfassung der Kurseinheiten nun vervollständigt haben, können Sie auf Basis der Kursdaten sowohl Wochenpläne für die Kursleiter als auch Raumbelegungspläne drucken.
Beide Berichte basieren auf den gleichen Daten, lediglich die Anordnung der Steuerelemente und die Gruppierung ist eine andere.
Die Datenquelle für die Berichte
Erstellen Sie zunächst die Basisabfrage für die Berichte. Die Abfrage verwendet die in Bild 6 gezeigten Tabellen.
Die folgenden Felder werden benötigt: RaumID und -name, KursleiterID und -name, Start- und Enddatum sowie die Kursnummer und -bezeichnung.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo