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 |
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.
Nach Umbenennung des zusammengesetzten Feldes müsste es dann endlich funktionieren.
Einzelansicht
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.
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").
Einzelansicht4.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 SubEinzelansicht
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.
Einzelansicht4.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.
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.
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.
Seiten: 1