Zum Inhalt dieser Seite

Access-Grundlagen #4 - Berichte

4.1 #Fehler bei zusammengesetzten Feldern 4.2 Seitenkopf/-fuss ausblenden
4.3 Textfeld formatieren 4.4 Jede zweite Zeile grau
4.5 Anzahl oder Summe mit Bedingung

Nach oben 4.1 #Fehler bei zusammengesetzten Feldern

In einem Bericht erscheint in einem zusammengesetzten Feld beim Öffnen des Berichts #Fehler . Das liegt sicherlich daran, dass das zusammengesetzte Feld wie eines der zu verbindenden Felder heisst. Folgendes geht also nicht.

Zirkelbezug durch zusammengesetzten Steuerelementinhalt

Nach Umbenennung des zusammengesetzten Feldes müsste es dann endlich funktionieren.

So wird der Zirkelbezug aufgehoben

Einzelansicht

Nach oben 4.2 Seitenkopf/-fuss ausblenden

Es gibt 2 Möglichkeiten, den Seitenkopf bzw. Seitenfuss eines Berichtes auf bestimmten Seiten auszublenden:

  • Einstellung der Berichtseigenschaften "Seitenkopf" und /oder "Seitenfuss"
  • Zuordnung einer Ereignisprozedur beim Formatierereignis des jeweiligen Bereiches

Hier erst einmal die Lösung per Berichtseigenschaften. Unter Eigenschaften/Format findet man unter anderem die Eigenschaft "Seitenkopf". Dort kann man zwischen "Alle Seiten", "Außer Berichtskopf" (Seitenkopf erscheint nicht auf der 1. Seite), "Außer Berichtsfuss" (Seitenkopf erscheint nicht auf der letzten Seite) und "Außer Berichtskopf/-fuß" (Seitenkopf wird auf 1. und letzter Seite ausgeblendet) wählen. Für den Seitenfuss muss man natürlich die Eigenschaft "Seitenfuss" entsprechend einstellen.

Berichtseigenschaften - Format - Seitenkopf

Hier die Lösung per Ereignisprozedur.

Um den Seitenkopf auf der 1. Seite auszublenden, muss man dem Seitenkopf-Ereignis "Beim Formatieren" folgende Prozedur zuweisen (zum Anlegen von Prozeduren s. 6.1 ).

Private Sub Seitenkopfbereich_Format(Cancel As Integer, FormatCount As Integer)
 
If Me.Page = 1 Then Cancel = True
 
End Sub
 

Um den Seitenkopf auf der letzten Seite auszublenden, muss man zunächst ein (evtl. unsichtbares) Textfeld mit dem Steuerelementinhalt =Seiten anlegen. Wenn man bereits ein anderes Textfeld im Bericht angelegt hat, das in irgendeiner anderen Weise die Seitenzahl ermittelt, kann man sich diesen Schritt natürlich sparen. Anschliessend hilft folgende Prozedur beim gleichen Ereignis.

Private Sub Seitenkopfbereich_Format(Cancel As Integer, FormatCount As Integer)
 
If Me.Page = Me.Pages Then Cancel = True
 
End Sub
 

Für den Seitenfuss geht man analog vor (Seitenfuss-Ereignis "Beim Formatieren").

Einzelansicht

Nach oben 4.3 Textfeld formatieren

Wenn man innerhalb eines Berichtes ein Textfeld abhängig von dem Wert eines anderen Textfeldes formatieren (oder ausblenden, oder...) möchte, muss man zunächst den Bereich, in dem sich das zu formatierende Feld befindet, markieren. Dann legt man bei dem Ereignis "Beim Formatieren" eine VBA-Prozedur an (s. 6.1 ), die die gewünschte Formatierung vornimmt. In diesem Beispiel wird das im Detailbereich liegende Textfeld "KundennameGesamt" ab einer "Einnahme" von 500 fett dargestellt.

Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)
 
If Me![Einnahme] >= 500 Then
  Me![KundennameGesamt].FontWeight = 700
 Else
  Me![KundennameGesamt].FontWeight = 400
End If
 
End Sub
 
Einzelansicht

Nach oben 4.4 Jede zweite Zeile grau

Nun gibt es auch schon eine unter FAQ 5.3 vorgestellte Lösung. Aber diese funktioniert leider nicht immer ganz sauber. Speziell bei Unterberichten, in denen der erste Datensatz auf jeden Fall grau erscheinen soll, unabhängig davon, ob der letzte Datensatz des zuvor formatierten Unterberichts ebenfalls grau war, bietet sich eine andere Vorgehensweise an.

Zunächst legt man im zu formatierenden Detailbereich eine laufende Nummer nach FAQ 5.16 an. Dieses Textfeld - nennen wir es lfdNr - muß nicht unbedingt angezeigt werden (die Eigenschaft "Sichtbar" kann also auf "Nein" stehen), sondern dient nur dazu, die Nummer des Datensatzes auszuwerten. Bei ungerader Datensatznummer (1,3,5 ...) wird der Detailbereich durch folgende Prozedur beim Ereignis "Beim Formatieren" 4.3 grau, bei gerader Datensatzzahl (2,4,6 ...) dagegen weiß:

Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)
 
If Me!lfdNr Mod 2 = 1 Then
  'Datensatznummer geteilt durch 2 ergibt Rest von 1
  Me.Section(acDetail).BackColor = 12632256    'grau
 Else
  'Datensatznummer ist ohne Rest durch 2 teilbar
  Me.Section(acDetail).BackColor = 16777215    'weiß
End If
 
End Sub
 

Nachtrag: Mittlerweile ist auch diese Vorgehensweise als Tipp unter FAQ 5.3 zu finden.

Einzelansicht

Nach oben 4.5 Anzahl oder Summe mit Bedingung

Wenn man in die Verlegenheit kommt, in einem Bericht (oder Formular) einen gewissen Anteil der Datensätze zu zählen, so kann man natürlich so etwas wie DCount() einsetzen. Allerdings ist diese Lösung bei variabler Datensatzherkunft des Berichtes etwas schwierig umzusetzen - das Kriterium der DCount() -Funktion müsste dann ebenfalls angepasst werden.

Nach oben 4.5.1 Bedingte Anzahl

Mit der Summenfunktion ist das Ziel viel einfacher zu erreichen. Angenommen, man möchte alle Gerichte in dem Bericht zählen, die günstiger als 10 Euro sind, dann reicht ein Steuerelementinhalt wie:

=Abs(Summe([Preis]<10))

Selbstverständlich lassen sich auch mehrere Bedingungen berücksichtigen. Falls nun nur die vegetarischen Gerichte unter 10 Euro interessieren, müsste der Steuerelementinhalt so aussehen:

=Abs(Summe([Preis]<10 Und [Kategorie]='vegetarisch'))

Erklärung: Der Inhalt der Klammer, also z.B. [Preis]<10 Und [Kategorie]='vegetarisch' liefert True oder False . True wiederum nimmt intern den Wert -1 ein, und False entspricht 0 . Man summiert also für die einzelnen, angezeigten Datensätze automatisch -1,0,-1,-1 ... - das Ergebnis ist die gewünschte Anzahl. Das störende Vorzeichen wird ganz zum Schluss durch die Abs() -Funktion entfernt.

Nach oben 4.5.2 Bedingte Summe

Nach ähnlicher Logik lassen sich auch die Preise für die Gerichte summieren, die mindestens 10 Euro kosten. Statt DSum() einzusetzen, verwendet man dann folgenden Steuerelementinhalt:

=Summe([Preis]*Abs([Preis]>=10))

Der Preis wird hier also bei nicht zutreffender Bedingung mit 0 bzw. bei Erfüllung der Anforderung mit Abs(-1) multipliziert und entsprechend geringer wird die Summe, wenn Datensätze vorhanden sind, bei denen das Kriterium nicht erfüllt ist.

Einzelansicht