Zeitpläne mit Access erstellen, Teil 2

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.

Abbildung1.tif

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.

Abbildung2.tif

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

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