In den ersten fünf Teilen dieser Artikelreihe haben wir die Grundlagen geschaffen, damit Sie Ligen, Mannschaften, Spieljahre und Spieltage eingeben und verwalten können. Außerdem kann der Benutzer nun eine Liga und einen Spieltag auswählen und Ergebnisse eingeben sowie den Tabellenstand berechnen lassen. Das geschieht bisher nur dynamisch – wir wollen aber, um Auswertungen durchzuführen, auch einmal auf die gespeicherten Tabellenstände zugreifen. Dazu verwenden wir zwei weitere Tabellen und ein paar VBA-Routinen.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 2104_Ligaverwaltung_6.accdb.
Tabellen zum Speichern der Tabellenstände
Im ersten Teil der Artikelreihe haben wir die beiden benötigten Tabellen bereits vorgestellt (Ligaverwaltung, Teil 1: Datenmodell, www.access-basics.de/454). Zur Erinnerung jedoch hier noch einmal im Überblick, was wir uns damals ausgedacht haben:
- Die Tabelle tblTabellenstaende enthält ein Primärschlüsselfeld sowie ein Fremdschlüsselfeld namens SpieltagID, mit dem das Primärschlüsselfeld der Tabelle tblSpieltage referenziert wurde.
- Die Tabelle tblTabellenpositionen enthält ein Primärschlüsselfeld, ein Fremdschlüsselfeld zum Verknüpfen der Datensätze mit der Tabelle tblTabellenstaende und einige weitere Felder, mit denen die jeweilige Tabellenposition charakterisiert wird – also eine Verknüpfung zu der Mannschaft, die diesen Tabellenplatz besetzt und die Anzahlen der Spiele, Siege, Unentschieden, Niederlagen, Tore für und gegen und Punkte für und gegen.
Im Datenmodell sehen diese beiden Tabellen mit den beiden weiteren Tabellen tblSpieltage und tblMannschaften wie in Bild 1 aus.
Bild 1: Tabellen zum Speichern der Tabellenstände und Tabellenpositionen
Die Frage, die sich hier stellt: Wozu benötigen wir überhaupt die Tabelle tblTabellenstaende Letztlich verbindet diese nur die Tabelle tblTabellenpositionen mit der Tabelle tblSpieltage und enthält keine weiteren Daten. Wir könnten also auch die Tabelle tblTabellenstaende weglassen und einfach die Tabelle tblTabellenpositionen über ein neues Fremdschlüsselfeld namens SpieltagID mit der Tabelle tblSpieltage verknüpfen.
Datenmodell vereinfachen
Dazu passen wir die Tabelle tblTabellenpositionen in der Entwurfsansicht an. Hier entfernen wir das Feld TabellenstandID und fügen ein neues Feld namens SpieltagID hinzu. Dazu ist ein vorheriger Schritt erforderlich, nämlich das Entfernen der Beziehung zwischen den Tabellen tblTabellenpositionen und tblTabellenstaende. Dazu klicken Sie im Beziehungen-Fenster auf die Beziehung und entfernen diese mit der Entf-Taste oder mit dem Kontextmenü-Befehl Löschen. Anschließend löschen Sie das Feld aus dem Tabellenentwurf.
Nun legen wir ein neues Feld namens SpieltagID an und fügen mit dem Nachschlage-Assistenten eine neue Beziehung zum Feld SpieltagID der Tabelle tblSpieltage an.
Außerdem fügen wir noch ein weiteres Feld hinzu, das wir bisher vernachlässigt haben, nämlich eines mit der Bezeichnung Position (siehe Bild 2).
Bild 2: Neues Fremdschlüsselfeld in der Tabelle tblTabellenpositionen
Eintragen der Daten für einen Spieltag per VBA
Um diese Tabelle zu füllen, verwenden wir eine VBA-Prozedur. Diese heißt TabellenstandEintragen und ist in Listing 1 abgebildet. Die Prozedur hat zwei Parameter:
Public Sub TabellenstandEintragen(lngLigaSpieljahrID As Long, lngSpieltag As Long) Dim db As DAO.Database Dim rst As DAO.Recordset Dim lngTabellenstandID As Long Dim lngAktuellerSpieltag As Long Dim strSQL As String Dim qdf As DAO.QueryDef Dim prm As DAO.Parameter Dim lngSpieltagID As Long Set db = CurrentDb Set qdf = db.QueryDefs("qryErgebnisseLigaSpieljahrSpieltag") Set prm = qdf.Parameters("prmSpieltag") prm.Value = lngSpieltag Set prm = qdf.Parameters("prmLigaSpieljahrID") prm.Value = lngLigaSpieljahrID Set rst = qdf.OpenRecordset() lngSpieltagID = DLookup("ID", "tblSpieltage", "Spieltag = " & lngSpieltag & " AND LigaSpieljahrID = " & lngLigaSpieljahrID) db.Execute "DELETE FROM tblTabellenpositionen WHERE SpieltagID = " & lngSpieltagID, dbFailOnError Do While Not rst.EOF With rst db.Execute "INSERT INTO tblTabellenpositionen(SpieltagID, Position, MannschaftID, Spiele, Siege, " _ & "Unentschieden, Niederlagen, ToreFuer, ToreGegen, PunkteFuer) VALUES(" & lngSpieltagID & ", " _ & rst.AbsolutePosition + 1 & ", " & rst!MannschaftID & ", " & lngSpieltag & ", " & Nz(rst!SummeVonSieg, 0) _ & ", " & Nz(rst!SummeVonUnentschieden, 0) & ", " & Nz(rst!SummeVonNiederlage, 0) & ", " _ & Nz(rst!SummeVonTore, 0) & ", " & Nz(rst!SummeVonGegentore, 0) & ", " & Nz(rst!SummeVonPunkte, 0) & ")", _ dbFailOnError End With rst.MoveNext Loop End Sub
Listing 1: Einstellen der Tabelle für einen Spieltag
- lngLigaSpieljahrID: Erwartet den Primärschlüsselwert für die Kombination aus Liga und Spieljahr, den Sie in der Tabelle tblLigenSpieljahre finden (siehe Bild 3).
- lngSpieltag: Erwartet die Nummer des Spieltags, bei der Fußballbundesliga mit 18 Mannschaften also einen Wert zwischen 1 und 34.
Bild 3: Wir wollen die Tabelle für diesen Spieltag schreiben.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: