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

Monatskalender als Bericht (korrigiert)

Oft gefragt und selten gesehen wird der Monatskalender in Berichtsform. Im vorliegenden Beitrag erfahren Sie, wie Sie per Bericht einen Monatskalender ausgeben können. Voraussetzung dafür ist die Tabelle tblKalendertage des Beitrags Tabelle mit Kalenderdaten (ansehen).

Korrekturen

Der Bericht zur Anzeige der Monatsübersicht zeigte den falschen Tag zum Datum an. Die Beispieldatenbank sowie der nachfolgende Code wurden dahingehend angepasst.

Beispieldatenbank

Die Beispieldatenbank enthält eine Tabelle mit Kalenderdaten für 2003 und 2004 sowie einen Bericht zur Anzeige der Daten eines ausgewählten Monats. Das Datum, das in dem anzuzeigenden Monat liegt, wird beim Aufruf per Öffnungsargument übergeben:

DoCmd.OpenReport "rptKalender", View:=acViewPreview, OpenArgs:="1.1.2004"

Der Bericht zeigt daraufhin ein Kalenderblatt wie in Abbildung 1 an.

Abbildung 1: Kalenderblatt im Bericht

Kalenderblatt in Bericht anzeigen

Um dieses Kalenderblatt zu erzeugen, benötigen Sie lediglich die Steuerelemente zur Anzeige der Beschriftung im oberen Bereich des Kalenders sowie ein Textfeld, dass an das Feld Datum der Datenherkunft des Berichts, der Tabelle tblKalenderdaten, gebunden ist.

Mit diesem müssen Sie allerdings ordentlich jonglieren. Nachfolgend sehen Sie zunächst den kompletten Code, der im Klassenmodul des Berichts unterzubringen ist:

Option Compare Database

Dim Anzeigedatum As Date

Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)

    If Month(Datum) = Month(Anzeigedatum) And Year(Datum) = Year(Anzeigedatum) Then

        Me.txtTag.Left = (Weekday(Datum, vbMonday) - 1) * 650

        If Weekday(Datum, vbMonday) <> 7 Then

            Me.MoveLayout = False

        End If

    Else

        Cancel = True

    End If

End Sub

Private Sub Report_Open(Cancel As Integer)

    Dim ErsterTag As Date

    Dim LetzterTag As Date

    ErsterTag = Date - Day(Now()) + 1

    LetzterTag = DateSerial(Year(Date), Month(Date) + 1, 0)

    If Not IsNull(Me.OpenArgs) Then

        Anzeigedatum = Me.OpenArgs

    Else

        Anzeigedatum = Date

    End If

    Dim Kriterium As String

    Kriterium = "Datum >= " & CDbl(ErsterTag) & " AND Datum <= " & CDbl(LetzterTag)

    Me.Filter = Kriterium

    Me.FilterOn = True

End Sub

Private Sub Seitenkopfbereich_Format(Cancel As Integer, FormatCount As Integer)

    Me!txtMonatUndJahr = Format(Anzeigedatum, "MMMM") & " " & Format(Anzeigedatum, "YYYY")

End Sub

Beim Öffnen des Berichts wird zunächst der anzuzeigende Monat ermittelt. Wenn kein Datumswert über das Öffnungsargument übergeben wurde, wird der aktuelle Monat angezeigt.

Beim Formatieren des Seitenkopfbereiches werden dem Textfeld txtMonatUndJahr der Monat und das Jahr des anzuzeigenden Datums übergeben.

Der Clou liegt in der Prozedur Beim Formatieren des Detailbereichs. Dort wird zunächst ermittelt, an welcher horizontalen Position sich der erste anzuzeigende Tag befindet. Dazu wird die Nummer des Wochentages ermittelt und ein entsprechender Wert für die Eigenschaft Links des Steuerelements berechnet.

Außerdem wird immer, wenn der Tag kein Sonntag ist, also nicht ganz rechts liegt, das Springen in die nächste Zeile unterbunden. Dazu setzen Sie die Eigenschaft MoveLayout auf den Wert False. Nur, wenn die aktuelle Zeile beim Sonntag angekommen ist, hat MoveLayout den Wert True und das kommende Datum wird in der nächsten Zeile angezeigt - natürlich wieder ganz links.

© 2003-2010 André Minhorst Alle Rechte vorbehalten.