Monatskalender als Bericht drucken

Mit Access-Bericht lässt sich eine Menge anstellen, was allerdings einiges an Erfahrung und übung erfordert. Ein Monatskalender, der Datumsangaben in einem Raster von Wochen und Wochentagen enthält, ist erstens eine recht interessante Aufgabe und zweitens macht er sich auf verschiedenen Dokumenten gut: Haben Sie schon einmal überlegt, einem Kunden eine Monatsübersicht zu dem Tag mitzuliefern, an dem ein Ereignis wie zum Beispiel eine Bestellung erfolgt

Tage mal Wochen

Ein Monatskalender ist üblicherweise in ein Raster eingeteilt, das oben die Kalendertage (Montag, Dienstag …), links die Kalenderwochen und in der aufgespannten Tabelle die Tagesdaten enthält. Anschaulich zeigt dies Abb. 1.

pic001.tif

Bild 1: Ein Monatskalender als Bericht

Datenherkunft eines Kalenderberichts

Es gibt prinzipiell zwei Möglichkeiten, einen Kalender wie in Bild 1 zu erstellen: Die erste beruht darauf, eine Reihe von Steuerelementen in der gezeigten Anordnung zu platzieren und diese zur Laufzeit mit den gewünschten Werten zu füllen. Da aber keiner Lust hat, mehr als 50 Steuerelemente in den Berichtsentwurf einzufügen, stellen wir hier eine etwas elegantere Lösung vor, die außerdem wesentlich datenbankbezogener ist: Dazu benötigen Sie zunächst eine Tabelle mit Kalenderdaten. Diese sieht im Entwurf wie in Bild 2 aus und wird mit der Routine aus Listing 1 gefüllt. Mit dem Aufruf dieser Routine übergeben Sie das Start- und das Enddatum der anzulegenden Datumsdatensätze. Der Aufruf zum Anlegen aller Kalenderdaten des Jahres 2007 sieht etwa so aus:

Listing 2: Snapshot-Datei ohne visuelles Snapshot Viewer Control ausdrucken

Public Sub KalendertabelleFuellen(dateStartdatum As Date, dateEnddatum As Date)
     Dim dateAktuellesdatum As Date
     Dim db As DAO.Database
     Dim strDatum As String
     Set db = CurrentDb
     ''Alte Daten löschen
     db.Execute "DELETE FROM tblKalenderdaten", dbFailOnError
     ''Daten in einer Schleife eintragen
     For dateAktuellesdatum = dateStartdatum To dateEnddatum
         strDatum = SQLDatum(dateAktuellesdatum)
         db.Execute "INSERT INTO tblKalenderdaten(Kalenderdatum) VALUES(" _
& strDatum & ")", dbFailOnError Next dateAktuellesdatum End Sub KalendertabelleFuellen "1.1.2007", "31.12.2007"
pic002.tif

Bild 2: Entwurf einer Tabelle mit Kalenderdaten

Eins nach dem anderen

Damit Sie die Vorgehensweise leicht nachvollziehen können, beschreiben wir Schritt für Schritt, wie der Kalenderbericht entsteht.

Zunächst legen Sie einen Bericht an, weisen ihm als Datenherkunft die Tabelle tblKalenderdaten zu und speichern ihn unter dem Namen rptMonatsansichtKlein.

Fügen Sie das Feld Kalenderdatum zum Detailbereich hinzu und wechseln Sie zur Vorschauansicht: Es ergibt sich das Bild aus Bild 3. Der Bericht enthält nun zumindest schon einmal eine Reihe von Kalenderdaten.

pic003.tif

Bild 3: Bericht mit einer Auflistung von Kalenderdaten

Allerdings soll der Kalender ja nur die Tage anzeigen. Dazu fügen Sie ein Textfeld namens txtTag hinzu, entfernen sein Beschriftungsfeld und stellen seine Eigenschaft Steuerelementinhalt auf den folgenden Ausdruck ein:

=Day(Kalenderdatum)

Entfernen Sie außerdem das ursprüngliche Datumstextfeld Kalenderdatum. Der Bericht zeigt in der Vorschau nun immerhin schon einmal die Kalendertage an (siehe Bild 4).

pic004.tif

Bild 4: Statt der kompletten Daten zeigt der Bericht nun nur noch die Kalendertage an.

Nun wollen diese angeordnet werden – und zwar so, dass jeweils die Montage ganz links und jeweils die Tage einer Woche in einer Reihe stehen. Dazu setzen Sie die Eigenschaft MoveLayout ein, die [1] genauer erläutert.

Jedes angezeigte Datum soll auf den Wochentag geprüft und davon abhängig von links nach rechts positioniert werden. Die dafür notwendige Routine muss also für jeden Datensatz ausgelöst werden, was etwa mit der Ereigniseigenschaft Beim Formatieren des Detailbereichs möglich ist. Listing 2 zeigt eine Routine, die wie gewünscht vorgeht.

Listing 2: Aufteilen der Tageszahlen auf mehrere Reihen á sieben Spalten

Const cintBreite As Integer = 300 
Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)
     ''Wenn Wochentag = Sonntag, dann...
     If Weekday(Me!Kalenderdatum) = 1 Then
         ''implizit: Me.MoveLayout = True, Ausgabe in nächster Zeile fortsetzen
         ''Steuerelement rechts anordnen
         Me!txtTag.Left = cintBreite * 7
         ''... sonst:
     Else
         ''nicht zur nächsten Zeile vorrücken
         Me.MoveLayout = False
         ''Steuerelemente passend anordnen
         Me!txtTag.Left = cintBreite * (Weekday(Me.Kalenderdatum) - 1)
     End If
End Sub

Diese Routine prüft, ob es sich bei dem Tag um einen Sonntag handelt, und legt den Abstand des Steuerelements vom linken Rand auf das Siebenfache des Werts der Konstanten cintBreite fest, die im gleichen Modul deklariert wird. Dadurch verschiebt die Routine alle Textfelder, deren Datum einen Sonntag enthält, relativ weit nach rechts.

In allen anderen Fällen, also bei den Wochentagen Montag bis Samstag, ermittelt die Routine den Abstand vom linken Rand über das Produkt aus dem Wert der Weekday-Funktion (die etwa für den Montag standardmäßig den Wert 2 liefert) und dem Wert der oben genannten Konstanten.Gleichzeitig stellt sie die Eigenschaft MoveLayout jeweils auf den Wert False ein, was dazu führt, dass der folgende Datensatz in die gleiche Zeile geschrieben wird. Im Bericht sieht das nun wie in Bild 5 aus.

pic005.tif

Bild 5: Kalendertage in Reih und Glied – allerdings noch reichlich viel für eine Monatsübersicht.

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