In Ausgabe 3/2006 hat Access im Unternehmen im Artikel „Zeitpläne mit Access erstellen“ gezeigt, wie man mit reinen Access-Bordmitteln einen grafischen Monatsplan entwickeln kann. Aufgrund zahlreicher Leseranfragen machen wir diesen Monatsplan nun etwas flexibler: etwa, um größere oder kleinere Zeitintervalle anzuzeigen oder eine Kalenderwochenansicht zu präsentieren.
Die veränderte Oberfläche
Der Aufbau der Datenbankstruktur ist gegenüber dem Artikel aus [1] unverändert. Geändert haben sich nur die Oberfläche und der Code des Zeitplan-Formulars. Bild 1 zeigt die aktuelle Version des Formulars.
Bild 1: Zeitplan mit Einstellung auf kompletten Monat
Die Beispiel-Datenbank ist begrenzt auf Zeiträume von einem einzelnen Tag bis zu einem Monat, also maximal 31 Tagen.
Der Hauptgrund dafür ist, dass im Plan kurze Texte in jedem Feld lesbar sein sollten, damit der Gast-, Kunden-, Veranstaltungsname oder sonstige mit dem Zeitplan verwaltete Informationen noch gut zu erkennen sind.
Wenn Sie sehr große Bildschirme oder sehr hohe Auflösungen haben, können Sie den maximal darstellbaren Zeitraum mit etwas Anpassungsarbeit, aber bei unveränderten Prinzipien, natürlich auf zwei oder drei Monate erweitern.
Bild 2 zeigt im Ausschnitt den oberen Rand mit den neuen, vielfältigen Einstellmöglichkeiten für den Zeitraum.
Abb. 2: Erweiterte Zeitauswahl und Anzeigen
Wenn Sie die erste Version kennen, werden Ihnen sofort die Anzeige des Wochentags und der Kalenderwoche (bei jedem Montag) auffallen. Die Wochentage sind vor allem zur schnelleren Orientierung hinzugefügt, die Kalenderwoche hingegen, weil in vielen Branchen vorwiegend mit diesem Zeitraster gearbeitet wird.
über diesen beiden Anzeigeelementen befinden sich die erweiterten Steuerelemente zur Auswahl des darzustellenden Zeitraums und zur Naviga-tion.
Hier wurde zu Demonstrationszwecken bewusst etwas übertrieben. Suchen Sie sich die für Ihre Praxis passenden Möglichkeiten aus und machen Sie die weniger in Betracht kommenden Steuerelemente einfach unsichtbar.
Die Kombinationsfelder links zur Auswahl von Jahr und Monat waren bereits in der ersten Version des Plans vorhanden. Gleich daneben finden Sie nun eine Optionsgruppe, in der Sie auswählen können, ob eine einzelne Kalenderwoche dargestellt werden soll oder zwei oder drei Kalenderwochen.
Rechts davon gibt es zwei Datumsfelder, in denen immer die Grenzdaten des aktuell eingestellten Zeitraums angezeigt werden. Sie können in diese Textfelder auch direkt ein Start- und Enddatum eingeben und damit einen beliebigen Zeitraum (von maximal 31 Tagen) abseits von Monats- oder Wochenintervallen darstellen. Daneben gibt es noch zwei Schaltflächen zum Rückwärts- und Vorwärtsblättern. Spielen Sie am besten zuerst mit den verschiedenen Steuerelementen.
Der erweiterte Code
Listing 1 zeigt die Prozedur, die durch das Ereignis Beim öffnen des Formulars ausgelöst wird.
Listing 1: Diese Routine wird beim öffnen des Terminformulars ausgelöst.
Private Sub Form_Open(Cancel As Integer) procFormat Me!cboMonat = Month(Date) cboMonat_AfterUpdate 'grpKW_AfterUpdate procFill End Sub
Darin wird zunächst die Sub procFormat aufge-rufen, die mit Hilfe der bedingten Formatierung (FormatConditions) für die spätere Einfärbung der Kalendereinträge sorgt.
Sie ist unverändert gegenüber der alten Kalenderversion und wird daher nicht nochmal erläutert. Danach wird das Monats-Kombinationsfeld mit dem Monat des aktuellen Datums gefüllt.
Dadurch wird der aktuelle Monat beim öffnen des Formulars dargestellt. Möchten Sie hingegen als Grundeinstellung die aktuelle Kalenderwoche sehen, so müssen Sie nur diese Zeile auskommentieren und dafür die nächste Codezeile aktivieren.
Sie ruft die AfterUpdate-Prozedur der Optionsgruppe auf, in der ausgewählt werden kann, wie viele Wochen darzustellen sind. Dort wird bei fehlender Angabe die aktuelle Kalenderwoche eingesetzt. Abschließend wird die zentrale Sub procFill aufgerufen, die den Kalender mit Daten füllt (Listing 2).
Listing 2: Die Routine procFill füllt das Kalenderformular mit Daten und färbt die Steuerelemente ein (erster Teil).
Sub procFill() Dim db As DAO.Database Dim rsPlan As DAO.Recordset, rsDat As DAO.Recordset Dim ctl As Control Dim strSQL As String Dim dteComp As Date Dim i As Long, lngColor As Long, lngLeft As Long, lngWidth As Long Dim lngStart As Long, lngEnd As Long, lngDays As Long Set db = CurrentDb db.Execute "DELETE FROM tblPlan", dbFailOnError db.Execute "INSERT INTO tblPlan (RowCaption1) SELECT RmBez FROM tblRaum", _
dbFailOnError lngLeft = 645 lngWidth = 510 lngStart = Me!txtVon lngEnd = Me!txtBis lngDays = lng7End - lngStart + 1 If lngDays < 28 Then lngWidth = lngWidth * 31 / lngDays End If strSQL = _
"SELECT a.RmBez, a.RSStart, a.RSEnde, a.RSId, a.RSStatus, b.KDNachname" & _ " FROM tblReservierung AS a LEFT JOIN tblKunde AS b ON a.KDId = b.KDId" & _ " WHERE a.RSStart<=" & lngEnd & _ " And a.RSEnde >" & lngStart & _ " ORDER BY a.RSStart, a.RSEnde" Set rsPlan = db.OpenRecordset("tblPlan", dbOpenDynaset) Set rsDat = db.OpenRecordset(strSQL, dbOpenDynaset) For i = 1 To 31 Me("cptItem" & i).Caption = "" Me("cpt2Item" & i).Caption = "" Me("cptItem" & i).BackColor = vbWhite Me("cpt2Item" & i).BackColor = vbWhite Me("cptKW" & i).Value = Null Me("cptWD" & i).Caption = "" Me("cptItem" & i).Visible = True Me("cpt2Item" & i).Visible = True Me("cptWD" & i).Visible = True Me("cptKW" & i).Visible = True Me("txtItem" & i).Visible = True Next i For i = 1 To lngDays If lngDays < 28 Then Me("cptItem" & i).Caption = Format(lngStart + i - 1, "d.m.") Me("cpt2Item" & i).Caption = Format(lngStart + i - 1, "d.m.") Else Me("cptItem" & i).Caption = Day(lngStart + i - 1) Me("cpt2Item" & i).Caption = Day(lngStart + i - 1) End If Me("cptItem" & i).Left = lngLeft + lngWidth * (i - 1) Me("cptItem" & i).Width = lngWidth Me("cpt2Item" & i).Left = lngLeft + lngWidth * (i - 1) Me("cpt2Item" & i).Width = lngWidth Me("cptWD" & i).Caption = For-mat(lngStart + i - 1, "ddd") Me("cptWD" & i).Left = lngLeft + lngWidth * (i - 1) Me("cptWD" & i).Width = lngWidth Me("cptKW" & i).Left = lngLeft + lngWidth * (i - 1) Me("cptKW" & i).Width = lngWidth Me("txtItem" & i).Left = lngLeft + lngWidth * (i - 1) Me("txtItem" & i).Width = lngWidth Select Case Weekday(lngStart + i - 1, vbMonday) Case 1 Me("cptKW" & i).Value = DatePart("ww", lngStart + i - 1, _
vbMonday, vbFirstFourDays) lngColor = vbBlack Case 6 lngColor = vbBlue Case 7 lngColor = vbRed Case Else lngColor = vbBlack Me("cptItem" & i).BackColor = lngColor Me("cpt2Item" & i).BackColor = lngColor End Select Next i For i = i To 31 Me("cptItem" & i).Visible = False Me("cpt2Item" & i).Visible = False Me("cptWD" & i).Visible = False Me("cptKW" & i).Visible = False Me("txtItem" & i).Visible = False Next i Do Until rsDat.EOF rsPlan.FindFirst "RowCaption1 = '" & rsDat!RmBez & "'" rsPlan.Edit For i = 1 To lngEnd - lngStart + 1 dteComp = lngStart + i - 1 If dteComp >= rsDat!RSStart And dteComp < rsDat!RSEnde Then rsPlan("Item" & i) = rsDat!RSStatus rsPlan("ItemTxt" & i) = rsDat!KDNachname rsPlan("ItemVal" & i) = rsDat!RSId End If Next i rsPlan.Update rsDat.MoveNext Loop Me.Requery End Sub
Strukturell ist der Code ähnlich aufgebaut wie bereits im Vorgängerartikel beschrieben. Es wird daher nur ausschnittweise auf einige der änderungen eingegangen, die sich durch die neuen Intervalle und zusätzlichen Anzeigen ergeben. Mit den beiden Zeilen
lngLeft = 645 lngWidth = 510
werden die linke Startposition und die Breite der Tagesfelder in zwei Variablen geschrieben. Das passiert in Twips und auf Basis von 31 dargestellten Tagen.
Wenn Sie andere Darstellungsgrößen bevorzugen, können Sie das im Wesentlichen in diesen zwei Zeilen umstellen.
Die nächsten Codezeilen sind ebenfalls neu:
lngStart = Me!txtVon lngEnd = Me!txtBis lngDays = lngEnd - lngStart + 1
Zunächst werden die Daten aus den beiden Textfeldern im Formular für Start- und Endtag in Variablen gefüllt.
Danach wird die Anzahl der darzustellenden Tage errechnet. Diese drei Variablen werden im weiteren Verlauf für etliche Berechnungen verwendet. Mit
If lngDays < 28 Then lngWidth = _
lngWidth * 31 / lngDays End If
wird geprüft, ob weniger als 28 Tage dargestellt werden sollen. Nur, wenn es um weniger als diese kürzeste Monatslänge geht, wird mit der Formel
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