Zum Inhalt dieser Seite

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:

Darstellung des Berichtsentwurfs

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