Schulungen und Kurse verwalten, Teil 2

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

Schreibe einen Kommentar