Forum des VBA-Tutorials

Datenbankstruktur (Access)

Rob77, Dienstag, 07. Februar 2017, 15:54 (vor 290 Tagen)

Liebe Access-Experten,

vor ca. 5 Jahren habe ich mit Hilfe einiger Bücher und vor allem dieses Forums Access kennen bzw. ein wenig verstehen gelernt und eine db erstellt, die mir seitdem gute Dienste leistet bei der Durchführung /Platzierungsberechnung eines (Turn-)wettkampfes.

Die db erfasst Teilnehmer, deren Vereine, ordnet sie Riegen zu, (gibt nach Festlegung die Reihenfolge der zu absolvierenden Geräte aus), erfasst die Punktwertungen der Teilnehmer an jedem Gerät, und gibt am Ende ein Wettkampfprotokoll mit den Punktwertungen, Gesamtpunktzahl und Platzierung heraus.
Besonderheit: Per Los werden immer ein Männlein und ein Weiblein bei diesem Wettkampf zu einem Paar, und auf die Paarwertung kommt es dann beim „Abschlussbereicht“ auch an.

Um mein (gefühlt: komplett) verschüttetes Wissen wieder aufzufrischen sowie eine Sache zu korrigieren, will ich das Ding nochmal überarbeiten bzw. wohl eher komplett neu aufstellen.

Bisher muss ich nämlich für jeden (jährlich) neu stattfindenden Wettkampf auch die db neu anlegen (als Kopie der originalen, und anschließender Löschung aller Daten).

Meine Vorstellung ist, stattdessen für die sich jährlich wiederholende Veranstaltung eine weitere Tabelle zu generieren, und die Teilnehmer dann quasi dem 2017er, 2018er etc. .. Wettkampf zuzuordnen (das heißt, „Teilnehmer des Wettkampfes 2017“ werden aus der Tabelle „Turner“ „gespeist“ und müssen nur neu eingegeben werden, wenn sie das erste Mal bei diesem Wettkampf teilnehmen.

Meine bisherigen Tabellen:

tabVereine: IDVerein; NameVerein
tabTeilnehmer: IDTeilnehmer; Name; Vorname; blnMännlich; lngVerein; lngRiege; WertungGerät1;…; WertungGerät6; lngPaar
tabRiegen: IDRiege; Name; Durchgang1 (lngGeräte); …; Durchgang6(lngGeräte)
tabGeräte: IDGerät; Name Gerät
tabPaare: IDPaar; lngTeilnehmerW; lngTeilnehmerM

Die Beziehungen bestehen immer zwischen lngX und tab-IDX

Zwischen der Erfassung der Geräte(-Reihenfolge) in der Tabelle Riegen und der WertungGerät1…6 in der Tabelle Teilnehmer besteht kein Zusammenhang.


Ich zerbreche mir schon eine Weile den Kopf, wie ich das ganze gestalten könnte, komme aber nicht so richtig weiter… und wenn ich erst an die zu ändernden/erstellenden Formulare denke…

Meine Idee bis jetzt:

tabTurner: IDTurner; Name; Vorname; blnMännlich; lngVerein
tabWettkampf: IDWettkampf; Bezeichnung; Datum;
tabTeilnehmer: lngWettkampf, lngTurner (ergeben zusammengesetzten Schlüssel), lngVerein(wenn gewechselt, ist aber nicht so wichtig), WertungGerät1;…WertungGerät6
Ist das so sinnvoll?

Und wie organisiere ich die Riegen und Paare, die ja dann jedes Jahr neu zusammengewürfelt werden bzw. entstehen…?

Vorab schon mal vielen Dank…

VG Rob

Datenbankstruktur

Martin Asal, Dienstag, 07. Februar 2017, 20:56 (vor 290 Tagen) @ Rob77

Hallo Rob,

vor ca. 5 Jahren habe ich mit Hilfe einiger Bücher und vor allem dieses Forums Access kennen bzw. ein wenig verstehen gelernt und eine db erstellt, die mir seitdem gute Dienste leistet bei der Durchführung /Platzierungsberechnung eines (Turn-)wettkampfes.

herrjeh, ist das so lange her? Ja, ich erinnere mich dunkel.

Bisher muss ich nämlich für jeden (jährlich) neu stattfindenden Wettkampf auch die db neu anlegen (als Kopie der originalen, und anschließender Löschung aller Daten).

Das ist natürlich Quatsch ;-)

Was du brauchst, ist eine Tabelle "tabWettkämpfe". Wenn du dir sicher sein kannst, dass die Wettkämpfe wirklich nur einmal im Jahr stattfinden, dürfte es sogar genügen, wenn die Tabelle aus nur einem einzigen Feld besteht, nämlich "IDJahr". Das könnte anstelle eines Autowerts ein Long-Wert sein, und du trägst dort Werte ein wie "2017". Obwohl eigentlich sprechende IDs normalerweise nicht so gut sind. Streng genommen müsstest du eher die Möglichkeit offen halten, mehrere Wettkämpfe pro Jahr zu ermöglichen. Dann könnten noch Felder rein wie "Ausrichter", "Turnierbeginn" usw.

tabVereine: IDVerein; NameVerein
tabTeilnehmer: IDTeilnehmer; Name; Vorname; blnMännlich; lngVerein; lngRiege; WertungGerät1;…; WertungGerät6; lngPaar
tabRiegen: IDRiege; Name; Durchgang1 (lngGeräte); …; Durchgang6(lngGeräte)
tabGeräte: IDGerät; Name Gerät
tabPaare: IDPaar; lngTeilnehmerW; lngTeilnehmerM

tabTeilnehmer würde ich unter diesen Voraussetzungen aufsplitten: Eine Tabelle nur mit IDTeilnehmer, Vorname, Nachname (bitte nicht "Name" als Feldnamen verwenden!). So brauchst du die Teilnehmer nicht mehr jedesmal neu einzugeben, wenn sie in mehreren Jahren teilnehmen.

Dann eine Tabelle für die Ergebnisse, also was du bisher zusammen mit den Teilnehmerdaten in einer Tabelle hattest. BTW: Ohne in den alten Einträgen nachzusehen, aber bestimmt hat dir auch damals jemand gesagt, dass das mit den 6 Wertungen in einem Datensatz nicht so gut ist, sondern 1:n verknüpft werden sollte?

Jedenfalls brauchst du dann nur noch in der Ergebnistabelle sowie bei den Riegen und Paaren auf das Jahr zu verweisen, und fertig.

Martin

Datenbankstruktur

Rob77, Mittwoch, 08. Februar 2017, 13:21 (vor 289 Tagen) @ Martin Asal

Hallo Martin,

danke für die schnelle Antwort, es hat sich ja nichts hier verändert :)

herrjeh, ist das so lange her? Ja, ich erinnere mich dunkel.

Ja, krass wie die Zeit vergeht...

tabTeilnehmer würde ich unter diesen Voraussetzungen aufsplitten: Eine Tabelle nur mit IDTeilnehmer, Vorname, Nachname (bitte nicht "Name" als Feldnamen verwenden!). So brauchst du die Teilnehmer nicht mehr jedesmal neu einzugeben, wenn sie in mehreren Jahren teilnehmen.

Genau das hatte ich vor!

bestimmt hat dir auch damals jemand gesagt, dass das mit den 6 Wertungen in einem Datensatz nicht so gut ist, sondern 1:n verknüpft werden sollte?

Ja, mir war es auch so...

Jedenfalls brauchst du dann nur noch in der Ergebnistabelle sowie bei den Riegen und Paaren auf das Jahr zu verweisen, und fertig.

Die Einführung der Wettkampf(-jahr)-Tabelle und die Trennung der Teilnehmer von den Wertungen sind also beide Bedingung für mein Vorhaben... langsam werden die Tomaten wieder weniger... :D

Dann wohl so:

tabErgebnisse: (IDErgebnis); lngTeilnehmer; lngWettkampf(-jahr); WertungReck; WertungRinge; WertungPauschenpferd; WertungBoden; WertungSprung; Wertung(Stufen-)Barren; WertungBalken

Rob

Datenbankstruktur

Rob77, Freitag, 10. Februar 2017, 15:19 (vor 287 Tagen) @ Rob77

Hi Martin,

guck bitte nochmal drüber. Ich denke, ich hab's jetzt:

TabWertungen
(IDWertung); lng Wettkampf; lngTurner; WertungGerät1;...WertungGerät6; lngPaar; lngRiege

Tab Wettkämpfe
IDWettkampf; txtWettkampf; datWettkampf;

TabTurner
IDTurner; txtNachname; txtVorname; lngVerein; ...

TabVereine
IDVerein, txtVerein

TabPaare
IDPaar; lngWettkampf; lngTeilnehmerM; lngTeilnehmerW

Und für den Wettkampfablauf, ohne Bezug auf die Wertungen, noch die Tabellen

TabRiegen
IDRiege; txtRiege; Gerät1,....Gerät6

TabGeräte
IDGerät; txtGerät

Bildanhänge sind ja hier nicht drin, oder?
Würde gerne noch einen screenshot von den Beziehungen ranhängen, wobei sich glaube ich aus IDx - lngx immer die Beziehung 1:n erschließt...

Viele Grüße, schönes WE

Rob

Datenbankstruktur

Martin Asal, Freitag, 10. Februar 2017, 21:56 (vor 287 Tagen) @ Rob77

Hallo Rob,

ein Paar scheint zwingend aus einem Männlein und einem Weiblein zu bestehen? Dann würde ich wohl bei Tabturner auch das Geschlecht speichern (blnMann). Und da ich noch nie verstanden habe, was eine Riege eigentlich ist, kann ich nicht beurteilen, ob da lngWettkampf reingehört ;-)

Martin

Datenbankstruktur

Rob77, Sonntag, 12. Februar 2017, 10:04 (vor 285 Tagen) @ Martin Asal

Hallo Rob,

ein Paar scheint zwingend aus einem Männlein und einem Weiblein zu bestehen? Dann würde ich wohl bei Tabturner auch das Geschlecht speichern (blnMann).

Ja, in dieser Hinsicht ist das Paarturnen ziemlich konservativ :D blnMann ist selbstverständlich Teil der Tabelle!

Und da ich noch nie verstanden habe, was eine Riege eigentlich ist, kann ich nicht beurteilen, ob da lngWettkampf reingehört ;-)

In (in diesem Fall 4) Riegen werden alle Teilnehmer eines Wettkampfes eingeteilt. Der Wettkampf findet dann in 6 Durchgängen statt. In jedem Durchgang turnt dann jede Riege an einem bestimmten Gerät (oder hat Pause)

Rob

Datenbankstruktur

Rob77, Dienstag, 14. Februar 2017, 15:20 (vor 283 Tagen) @ Rob77

Hi Martin,

ich dachte schon "Jetzt hab ich's" - bin aber doch wieder überrascht worden...

Ich möchte ja die tabErgebnisse aus tabTurner und tabWettkämpfe füttern und darin die Wertungen erfassen.

Für die Auswertung des Wettkampfes müssen dann die Paare gebildet werden.

Hab also die tabPaare mit IDPaar, lngWettkampf, lngTurnerM, lngTurnerW.

Ich muss ja für jeden Wettkampf neue Paare bilden. IDWettkampf habe ich also mit lngWettkampf 1:n verknüft.
IDErgebnis aus der tab Ergebnisse lässt sich hingegen nur 1:1 mit lngTurnerM oder lngTurnerW in tabPaare verknüpfen. Woran liegt das und ist das i.O.? Ich denke mal nein, weil ja pro Datensatz in der Paartabelle zwei Datensätze aus der Ergebnistabelle nötig sind...

Grüße

Robert

Datenbankstruktur

Martin Asal, Mittwoch, 15. Februar 2017, 11:35 (vor 282 Tagen) @ Rob77

Hallo Rob,

ich hatte gedacht, für die Paarwertung werden die Ergebnisse der beiden Personen eines Paares einfach zusammengezählt? Das würde über eine Abfrage erfolgen.

Aber wenn ich das jetzt richtig verstehe, turnt einmal jeder für sich, und dann gibt es zusätzlich eine Paarwertung?

Das würde ich wie folgt lösen: In der Ergebnistabelle ein neues Feld "lngPaar" einfügen. Dort darf immer nur entweder in lngPaar oder in lngTurner ein Eintrag erfolgen. Das kannst du wie folgt sicherstellen: In der Entwurfsansicht der Tabelle das Eigenschaftenblatt auswählen, und dort unter "Gültigkeitsregel" eintragen:

isnull([lngTurner]) xor isnull([lngPaar])

Martin

Datenbankstruktur

Rob77, Mittwoch, 15. Februar 2017, 12:35 (vor 282 Tagen) @ Martin Asal

Hallo Martin

ich hatte gedacht, für die Paarwertung werden die Ergebnisse der beiden Personen eines Paares einfach zusammengezählt? Das würde über eine Abfrage erfolgen.

Ja, genau so hatte ich das auch gemacht. Im Bericht (Wettkampfauswertung) sind dann, sortiert nach Paarplatzierung, die Einzelwertungen an den Geräten sowie die Gesamtpunktzahl zu sehen.

Aber wenn ich das jetzt richtig verstehe, turnt einmal jeder für sich, und dann gibt es zusätzlich eine Paarwertung?

Nein, jeder turnt für sich, und diese Puntzahlen werden zusammengezählt zur Paarwertung.

Die Paare müssen doch aber erstmal gebildet/hinterlegt werden.

Die Paare hatte ich in der bisherigen Datenbank in tabPaare, bestehend aus IDPaar, lngTeilnehmerM, lngTeilnehmerW, gespeichert.

Nun habe ich ja eine etwas andere Struktur... Die Ergebnisse sollen nicht mehr direkt bei den ("potentiellen") Teilnehmern bzw Turnern gespeichert werden, sondern in der Tabelle tabErgebnisse, die den Bezug zum jeweiligen Teilnehmer über lngTurnerIn (Verknüpfung mit ID in TurnerInnen-Tabelle) und den Bezug zum Wettkampf über lngWettkampf (Verknüpfung mit ID der Wettkampftabelle) herstellt.

Die Paare, die ja auch jedes Jahr mit neuen oder "alten" Teilnehmern neu entstehen, habe ich wie gesagt hinterlegt in tabPaare mit IDPaar, lngWettkampf, lngTeilnehmerM, lngTeilnehmerW, nur bei der Bildung der Beziehungen (siehe letzter Eintrag) bin ich nicht sicher (1:n nicht möglich, nur 1:1 ohne referentielle Integrität)

Gruß
Rob

Datenbankstruktur

Martin Asal, Mittwoch, 15. Februar 2017, 14:04 (vor 282 Tagen) @ Rob77

Ach so. Du bildest allem Anschein nach [i}zu viele[/i] Beziehungen. Zwischen Wertungen und Paaren gibt es keine direkte Beziehung, sondern da sind Turner und Wettkämpfe dazwischen. Bei einer Abfrage müssen alle 4 Tabellen rein.

Also folgende Beziehungen:
tabWettkämpfe -1:n- tabWertungen
tabTurner     -1:n- tabWertungen
tabWettkämpfe -1:n- tabPaare
tabTurner     -1:n- tabPaare

Martin

Datenbankstruktur

Rob77, Donnerstag, 16. Februar 2017, 12:39 (vor 281 Tagen) @ Martin Asal

Hallo Martin,

wenn hier wieder mal ein Access-Amateur behauptet, nur 1:1-Beziehungen seien möglich, dann empfiehl ihm bitte, die Felder der Tabellen zu überprüfen...

Ich hatte beim Anlegen der tabPaare in den Feldern lngTeilnehmerM und lngTeilnehmerW Duplikate ausgeschlossen (um Dopplungen bei der Eingabe zu verhindern) und dies vergessen... was allerdings Quatsch ist - denn erstens bedient sich tabPaare ja der tabTeilnehmer... und zweitens habe ich mich wieder erinnert, dass Felder in Tabellen möglichst ohne irgendwelche Bedingungen etc. anzulegen sind, sondern solche Dinge über Abfragen/Formulare zu regeln sind...

Bis bald... :)

Datenbankstruktur

Martin Asal, Donnerstag, 16. Februar 2017, 12:45 (vor 281 Tagen) @ Rob77

habe ich mich wieder erinnert, dass Felder in Tabellen möglichst ohne irgendwelche Bedingungen etc. anzulegen sind, sondern solche Dinge über Abfragen/Formulare zu regeln sind

??? Kann man so nicht sagen. Kommt immer auf die Anforderungen an.

Felder in Tabellen sind möglichst ohne irgendwelche Formatierungen etc. anzulegen

Martin

Datenbankstruktur

Rob77, Dienstag, 21. Februar 2017, 10:16 (vor 276 Tagen) @ Martin Asal

Hallo Martin,

in meiner "alten" DB habe ich so was Schönes wie eine fortlaufende Nummerierung der Datensätze im Endlosformular gebastelt - da steht also im Steuerelementinhalt "=FctNr()" und diese Funktion finde ich auch auf einem Klassenobjekt mit der namentlichen Zuordnung zu diesem Formular im Code.
Mir ist allerdings schleierhaft, wie man ein solches Klassenobjekt "anlegt" bzw. wie man diesen Steuerelementinhalt auf einen bestimmten Teil des Codes bezieht...

(Noch schleierhafter ist mir, wie ich das vor 5 jahren gemacht habe :) )

Gruß

Robert

Datenbankstruktur

Martin Asal, Dienstag, 21. Februar 2017, 17:16 (vor 276 Tagen) @ Rob77

Hi,

ein Klassenmodul legst du in VBA mit Einfügen/Klassenmodul an. Dort kopierst du deinen alten Code rein, und fertig.

Martin

RSS-Feed dieser Diskussion
powered by my little forum