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
