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). KorrekturenDer Bericht zur Anzeige der Monatsübersicht zeigte den falschen Tag zum Datum an. Die Beispieldatenbank sowie der nachfolgende Code wurden dahingehend angepasst.

BeispieldatenbankDie 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 anzeigenUm 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. |