Schulungen und Kurse verwalten, Teil 2

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.

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar