Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2007.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Drucken Sie einen Monatskalender per Access-Bericht.

Techniken

Berichte, VBA

Voraussetzungen

Access 2000 und höher

Beispieldatei

Kalenderbericht.mdb

Shortlink

434

Monatskalender als Bericht drucken

André Minhorst, Duisburg

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

Abb. 1: Ein Monatskalender als Bericht

Datenherkunft eines Kalenderberichts

Es gibt prinzipiell zwei Möglichkeiten, einen Kalender wie in Abb. 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 Abb. 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

Abb. 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 Abb. 3. Der Bericht enthält nun zumindest schon einmal eine Reihe von Kalenderdaten.

pic003.tif

Abb. 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 (s. Abb. 4).

pic004.tif

Abb. 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 Abb. 5 aus.

pic005.tif

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.