Access -'Hitliste'
Wie legt man einen Bericht an, der eine flexible Hitliste erstellt? Man kann zwar mit Access-Mitteln einen relativ einfachen Top-X-Bericht entwerfen, allerdings genügt der meist nicht gehobenen Ansprüchen. Was passiert z.B., wenn 2 oder mehrere Datensätze den gleichen Wert besitzen, der Grundlage für die Sortierung bildet? Es werden ein oder mehrere Datensätze anscheinend willkürlich ausgeblendet. Mit dem aufgeführten Beispiel kann dieses Problem umgangen werden. Da das ganze relativ kompliziert darzustellen ist, bietet sich der Download der Demo-Datenbank an (bitte den folgenden Link anklicken): (55 kByte) .
Beispiel - es liegt eine Tabelle mit folgenden Daten vor:
MeinFeld | WertMeinFeld | GruppeMeinFeld |
---|---|---|
Satz1 | 10 | 1 |
Satz2 | 10 | 1 |
Satz3 | 10 | 1 |
Satz4 | 27 | 1 |
Satz5 | 27 | 1 |
Satz6 | 8 | 1 |
Satz7 | 20 | 1 |
Satz8 | 20 | 1 |
Satz9 | 8 | 2 |
Satz10 | 10 | 2 |
Satz11 | 5 | 2 |
Satz12 | 1 | 2 |
Satz13 | 6 | 2 |
Satz14 | 6 | 2 |
Satz15 | 3 | 2 |
Daraus soll ein Top-X-Bericht erstellt werden, der ungefähr so aussieht:
Top-3-Bericht
Werte für Gruppe 1:
Platz | Datensatz | Wert | Anteil in % an Summe aller Datensätze für Gruppe (Gesamt2) |
---|---|---|---|
1 | Satz4 | 27 | 20,45 |
Satz5 | 27 | ||
3 | Satz7 | 20 | 15,15 |
Satz8 | 20 |
Summe von "Wert" der angezeigten Datensätze:
94
Summe von "Wert" aller Datensätze (=Gesamt2):
132
Werte für Gruppe 2:
Platz | Datensatz | Wert | Anteil in % an Summe aller Datensätze für Gruppe (Gesamt2) |
---|---|---|---|
1 | Satz10 | 10 | 25,64 |
2 | Satz9 | 8 | 20,51 |
3 | Satz13 | 6 | 15,38 |
Satz14 | 6 |
Summe von "Wert" der angezeigten Datensätze:
30
Summe von "Wert" aller Datensätze (=Gesamt2):
39
Dafür erstellt man einen Bericht, der auf der Tabelle beruht. Im Bericht stellt man die Sortierung/Gruppierung folgendermaßen ein:
GruppeMeinFeld | aufsteigend | Gruppenkopf | Gruppenfuß |
---|---|---|---|
WertMeinFeld | absteigend | Gruppenkopf | Gruppenfuß |
MeinFeld | aufsteigend |
Unter "Ansicht" werden Seitenkopf/-fuß und Kopf-/Fußzeile des Berichts aktiviert.
In dem Seitenkopf wird ein Bezeichnungsfeld namens BerTitel erstellt. (s. 1 )
In den Detailbereich fügt man zwei
unsichtbare Steuerelemente
ein:
Zaehler1
mit dem Steuerelemeninhalt
=Zaehle(1)
(s.
3
)
Zaehler2
mit dem Steuerelementinhalt
=Zaehle(2)
(s.
4
)
Dazu kommen im Detailbereich die
sichtbaren Steuerelemente
:
Zaehler3
mit dem Steuerelementinhalt
=[zaehler1]-[zaehler2]+1
(stellt den Platz dar) (s.
2
)
Anteil
mit dem Steuerelementinhalt
=[wertmeinfeld]/[accesssumme]*100
(Prozentualer Anteil) und der Eigenschaft Duplikate
ausblenden =Ja. (s.
5
)
In den
Gruppenfuss von GruppeMeinFeld kommen die Steuerelemente
:
EigenSumme
mit dem Steuerelementinhalt
=gibtatsum()
(s.
6
)
AccessSumme
mit dem Steuerelementinhalt
=Summe([wertmeinfeld])
(s.
7
)
Sonstige Steuerelemente sind dem Screenshot zu entnehmen:
Die Gruppenköpfe und -füsse werden folgendermaßen benannt
(die
korrekte Benennung ist äußerst wichtig!):
Für
GruppeMeinFeld: Gruppenkopf_GrBezeichnung
und
Gruppenfuss_GrBezeichnung
Für
WertMeinFeld: Gruppenkopf_GrWert
und
Gruppenfuss_GrWert
In den Programm-Code des Berichts werden folgende Prozeduren eingefügt:
Option Compare Database Option Explicit Dim iGruppe1 As Integer Dim iGruppe2 As Integer Dim TopGrenze As String Dim TatSum As Integer Private Function gibtatsum() 'gibt Summe für Gruppe aus (angezeigte DS) 'Gegensatz: AccessSumme (Gesamt2) gibtatsum = TatSum End Function Private Sub Detailbereich_Format(Cancel As Integer, _ FormatCount As Integer) 'Unterbricht die Ausgabe, wenn Grenzwert erreicht ist 'und berechnet laufende Summe für angezeigte DS If Val(Me!zaehler3) > Val(TopGrenze) Then DoCmd.CancelEvent Else TatSum = TatSum + Me!WertMeinFeld End If End Sub Private Sub Gruppenfuss_GrWert_Format(Cancel As Integer, _ FormatCount As Integer) 'Unterbricht die Ausgabe, wenn Grenzwert erreicht ist '(Linie wird somit unsichtbar) If Val(Me!zaehler3) > Val(TopGrenze) Then DoCmd.CancelEvent End If End Sub Private Sub Gruppenkopf_GrBezeichnung_Format(Cancel As Integer, _ FormatCount As Integer) 'Setzt Zaehler für die Gruppe "GruppeMeinFeld" 'und laufende Summe auf 0 iGruppe1 = 0 TatSum = 0 End Sub Private Sub Gruppenkopf_GrWert_Format(Cancel As Integer, _ FormatCount As Integer) 'setzt Zaehler für Gruppe0 (WertMeinFeld) wieder auf 0 iGruppe2 = 0 End Sub Private Sub Report_Open(Cancel As Integer) 'ermittelt den Grenzwert - damit wird Bericht flexibler TopGrenze = InputBox("Bitte Zahl für x eingeben", _ "Top 'x'-Bericht", "5") Me!Bertitel.Caption = "Top-" & TopGrenze & "-Bericht" End Sub Private Function zaehle(art) 'wird von den Steuerelementen Zaehler1 'und Zaehler2 aufgerufen Select Case art Case 1 iGruppe1 = iGruppe1 + 1 zaehle = iGruppe1 Case 2 iGruppe2 = iGruppe2 + 1 zaehle = iGruppe2 End Select End Function