Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Bohnsopp am Oktober 31, 2016, 10:45:01

Titel: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am Oktober 31, 2016, 10:45:01
Hallo,
ich habe ein Verständnisproblem.
In meiner Datenbank möchte ich mehrere Tabellen dynamisch in VBA erstellen und miteinander verknüpfen. Dies funktioniert auch generell  über ein ALTER TABLE.... ADD FOREIGN KEY.... REFERENCES...  und Access zeigt mir diese Beziehung dann auch unter Entwurf - > Beziehungen als Beziehung mit referentieller Integrität an.
In der Realität sehe ich jedoch keine Beziehung, d.h. in der verknüpften Tabelle wird mir keine Zuordnung zu meiner dynamisch erzeugten Tabelle angezeigt.

Wenn ich die Beziehung nicht in VBA erstelle, sondern unter Access mit Entwurf -> Beziehung
erstelle (oder die oben genannte Beziehung dort modifiziere) sehe ich die Verknüpfung auch in meinen Tabellen.

Was macht Access bei der grafischen Bearbeitung anders verglichen mit meiner ALTER TABLE über  DoCmd.RunSQL.... ?

Danke
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: MaggieMay am Oktober 31, 2016, 11:06:07
Hallo,

wenn du die Beziehungen im Beziehungsfenster siehst, ist doch alles in Ordnung.
Was genau ist denn dann bei dir die "Realität"?
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: MzKlMu am Oktober 31, 2016, 11:11:29
Hallo,
in der reinen Tabelle kann man auch keine Beziehung sehen.
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am Oktober 31, 2016, 11:29:31
So um das Problem nochmal zu skizzieren, hier 4 Anhänge.

tblWettfahrt4 und tblWettfahrt5 wurden dynamisch erstellt und die Beziehung zur tblStammdaten erzeugt.
Bei tblWettfahrt4 wurden die Beziehungseigenschaften in Access grafisch geöffnet und - ohne sichtbare Änderung - geschlossen und die Beziehungen dann gespeichert. Keine Ahnung was Access dann ändert, aber wie man in der Tabellenansicht dann erkennt sind dort Werte aus der anderen Tabelle verknüpft.

Gruß,
Sascha
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: DF6GL am Oktober 31, 2016, 12:00:42
Hallo,

Zitat
Was macht Access bei der grafischen Bearbeitung anders verglichen mit meiner ALTER TABLE über  DoCmd.RunSQL....

Beim Ersten benutzt Du Access(-GUI) , um der Jet-Engine die Beziehungen beizubringen, wobei dann Access die Beziehungen eben "kennt".
Beim Zweiten übergehst Du Access und stellt an der Jet-Engine die Beziehungen direkt ein.  Davon weiß Access nun nichts..
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am Oktober 31, 2016, 15:03:26
ok das klingt einleuchtend.
Kann ich denn Access dazu bringen diese Information aus der Datenbank auszulesen?
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: DF6GL am Oktober 31, 2016, 16:19:39
Hallo,


wenn Du dies meinst:

Zitatin der verknüpften Tabelle wird mir keine Zuordnung zu meiner dynamisch erzeugten Tabelle angezeigt.

die Tabelle hat die Eigenschaften "Unterdatenblattname","Verknüpfen von" und "Verknüpfen nach", die entspr. eingestellt werden können.


Die Frage besteht allerdings (noch), wozu Du das Ganze  so machst und brauchst.....

Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: MzKlMu am Oktober 31, 2016, 18:06:02
Hallo,
ich halte das ganze Vorhaben für mehr als fragwürdig. Wieso gibt es mehrere gleiche Tabellen für die Wettfahrten ? Gibt es auch Tabellen für Wettfahrt 1-3 ?
Wieso sind das 1:1 Beziehungen, kann ein Schiff nur eine Wettfahrt machen ?
Die Wettfahrten gehören alle in eine Tabelle mit einem Feld für die Nummer der Wettfahrt und einem Feld als Fremdschlüssel zu den Stammdaten, aber als dann als 1:n Beziehungen.

Und dann noch die grundsätzliche Frage, wieso müssen Tabellen per VBA erstellt werden ?
Wenn man das in einer DB für erforderlich hält, hat man die DB falsch aufgebaut.
Neue Daten in einer DB sollten niemals eine Änderung der Struktur erforderlich machen.
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 01, 2016, 11:17:51
Hallo,
ich nehme die Anmerkung keine Ändererungen in der DB-Struktur dynamisch zu erstellen mal auf.
Grundsätzlich halte ich diese Vorgehensweise für sinnvoll, sehe aber für meinen Fall noch kein Konzept wie ich dieses hinbekomme.
In meiner Anwendung kann es zu 1-xx Wettfahrten (in der Regel bis zu 10) kommen. Jede Wettfahrt besteht aus mehreren Daten wie u.A. Startzeit, Zielzeit, Rennstatus (aufgegeben, disqualifiziert, etc.), Yardstick (Berechnungswert), Bemerkung, etc. (siehe Anhang). Alle diese Punkte sind bei jeder Wettfahrt und pro Boot unterschiedlich.
Natürlich könnte ich per Default für X- Wettfahrten Tabellen erstellen. Aber was ist wenn der User dann doch X+1 Wettfahrten braucht?

Um alle Wettfahrten innerhalb einer Tabelle zu berücksichtigen fehlt mir momentan noch die Erfahrung bei der DB-Auslegung.
Habt Ihr hier eine Anregung/Stichpunkt für mich? Ggf. erledigt Google dann den Rest.

Gruß,
Sascha
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: MzKlMu am November 01, 2016, 11:50:34
Hallo,
das Konzept ist in der Form falsch.
Ich mache Dir mal einen Vorschlag. Aber erst mal folgende Frage:
Welche Felder für eine Wettfahrt sind nicht vom Boot abhängig und welche Felder sind vom Bott abhängig.
Gibt es Felder die eindeutig der Wettfahrt zugeordnet werden können ?
Z.B. Das Feld txtZiel ist doch für alle Boote gleich, oder nicht ?

PS:
Die Präfixe vor den Feldnamen (txt, dat, int usw.) sind so überflüssig wie ein Kropf und mehr hinderlich als diese nutzen. Dass die Startzeit ein Datum ist, weißt Du auch ohne das dat.
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 01, 2016, 12:05:08
Danke für den Vorschlag.
Habe mir nochmal die Tabelle angesehen.

folgende Felder sind je Boot und Wettfahrt individuell:
datZielzeit
idRennstatus
txtBemerkung
txtBemerkung2
txtZiel (kann zukünftig entfallen, momentan nur als Ersatzfeld und wird nicht genutzt)

folgende Felder sind über alle Wettfahrten konstant, aber je Boot individuell. Eigentlich stehen diese Infos auch schon an anderer Stelle in der Tabelle "tblGruppe". Könnte man also eigentlich auch weglassen. War im Entwurf damals einfacher so eine Gruppenauswertung zu erstellen ohne komlizierte Beziehungen zu berücksichtigen.
idGruppe

folgendes Feld ist für jedes Boot individuell. Der Grundwert steht in den Stammdaten und wird mit einem Wettfahrtsfaktor (individuell pro Wettfahrt, aber für alle Boote gleich) berechnet:
intYardstick

folgendes Feld hängt an idGruppe + feste Konstanten für die Wettfahrt (z.B. Start1: 14:00, Start 2: 15:00, Gruppe 1,2,3: Start 1, Gruppe 4,5: Start 2):
datStartzeit

Nach der Wettfahrt wird berechnet (ist im dem Screenshot ungünstig, da hier beides immer gleich. Aber Punkte können ggf. durch Disqualifizierung oder anderes Punktesystem anders sein):
intPunkte
idPlatzierung.

Wenn alle Wettfahrten zusammengezählt und die Gesamtplatzierungen berechnet werden ist "intPunkte" das Maß der Dinge.

Gruß,
Sascha
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: MzKlMu am November 01, 2016, 12:16:45
Hallo,
zwei Zitate von Dir die sich mMn widersprechen:
Zitatfolgende Felder sind je Boot und Wettfahrt individuell:
Zitatfolgende Felder sind über alle Wettfahrten konstant, aber je Boot individuell.
Bitte besser erklären.

Zeige mal ein Bild des Beziehungsfensters auf dem man alle Tabellen mit allen Felder sieht.
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 01, 2016, 13:13:48
Zitat von: MzKlMu am November 01, 2016, 12:16:45
Hallo,
zwei Zitate von Dir die sich mMn widersprechen:
Zitatfolgende Felder sind je Boot und Wettfahrt individuell:
Zitatfolgende Felder sind über alle Wettfahrten konstant, aber je Boot individuell.
Bitte besser erklären.

Zeige mal ein Bild des Beziehungsfensters auf dem man alle Tabellen mit allen Felder sieht.

ich habe Dir mal eine Persönliche Nachricht geschickt, da ich mir momentan nicht sicher bin wie weit diese Diskussion noch für die breite Masse interessant ist.

Gruß,
Sascha
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 01, 2016, 13:49:34
Hi,
ich habe die DB mal zum besseren Verständniss anonymisiert unter
http://cloud.wattensegler.eu/index.php/s/qzWdrBcIu5uJh9F
zum Download im MDB Format abgespeichert.

Sascha
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: MzKlMu am November 01, 2016, 13:58:51
Hallo,
das Beispiel beantwortet nicht meine Fragen bzw. die Ungereimtheiten.
Siehe mein Beitrag #12.

Und noch folgende Frage: Kann eine Wettfahrt mehrere Gruppen haben, oder betrifft eine Wettfahrt immer nur eine Gruppe?

Und überhaupt, sind die Gruppen nicht die Bootstypen und damit eine Eigenschaft der Boote und nicht der Wettfahrten ?

Nur mal zum Nachdenken:
Wenn Du in der Tabelle mit den Wettfahrten ein Feld für eine Wettfahrtnummer einbaust kannst Du auf immer und ewig beliebig viele Wettfahrten erfassen ohne jemals weitere Tabelle anlegen zu müssen oder Tabellen zu ändern.
Und kannst trotzdem nach jeder Wettfahrt differenzieren.
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 01, 2016, 15:10:04
Ich gehe gleich nochmal auf die Fragen aus #12 ein, aber zuerst mal die anderen Fragen und ein paar allgemeine Infos.

Zitat von: MzKlMu am November 01, 2016, 13:58:51
Und noch folgende Frage: Kann eine Wettfahrt mehrere Gruppen haben, oder betrifft eine Wettfahrt immer nur eine Gruppe?

- es gibt mehrere Bootstypen die im Yardsticksystem gegeneinander segeln (alternativ gibt es auch Einheitsregatten mit gleichen Booten. Dies betrachte ich hier erstmal nicht. Ist im Grunde auch einfacher, da hierbei der Zieleinlauf = Platzierung ist und es keine Verrechnungsformeln gibt. Einheitsregatten mit unterschiedlichen Bootstypen werden in ebenfalls in Gruppen sortiert)
- da unterschiedliche Bootstypen unterschiedliche Eigenschaften haben gibt es eine Verrechnungsformel die Yardstick heißt. Einzelheiten interessieren uns erstmal nicht. Jeder Bootstyp hat einen eigenen Yardstick. Weil Boote so individuell wie die Eigner sind gibt es die Möglichkeit diese auch einem Boot individuell zu vergeben. Um es einfacher zu verstehen merken wir uns erstmal: Jedes Boot hat einen Yardstickwert.
- Ein Yardstickwert ist über alle Wettfahrten konstant. Es gibt aber die Ausnahme, dass wenn es ein bestimmtes Segel (Spinacker, also großes buntes Segel) auf einem Boot nicht gibt und es einen Segelkurs gibt auf dem dieses Segel normalerweise gesegelt wird (Vorwindkurs) kann der Yardstickwert für alle Boote ohne Spinacker um +1 oder +2 Punkte (je nach Wind, Kurs und Segellänge) erhöht werden
- Aufteilung in Gruppen erfolgt meist nach Länge und Geschwindigkeit (Anhaltspunkt Yardstick). Da wir wie oben genannt individuell Bootsklassen haben kann hier die Rennleitung nach Ihrer Erfahrung einteilen
- Gruppen werden in Startfelder eingeteilt. D.h. mehre Gruppen können denselben Start (~= Startzeit) haben
- Nachdem das Boot einen fest definierten Kurs gesegelt ist und eine individuelle Zeit dafür benötigt hat wird diese notiert und am Ende mit dem oben genannten Yardstickfaktor (gesegelte Zeit * 100 / Faktor) für jedes Boot berechnet. Dieses nennt man dann "berechnete Zeit"
- Nach dieser berechneten Zeit kann man dann eine Platzierung erstellen. Für alle Boote und oder in Gruppen. Im Low-Point System werden die Platzierungen in ein Punktesystem verrechnet. Einfach gesagt der 1. hat 1 Punkt, der 2. 2 Punkte... etc. Ausnahme die Disqualifizierten, Nichtgestarteten, etc. bekommen Punkte = Anzahl Teilnehmer +1
- Ein Wettfahrt beinhaltet: mehrere Boote in den Gruppen in mehreren Starts.
- Bei mehreren Wettfahrten werden die Punkte der einzelnen Wettfahrten addiert und dann hat das Boot mit den wenigsten Punkten gewonnen. Sonderregelungen/Ausnahmen interessieren uns erstmal nicht.


Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 01, 2016, 15:18:25
Zitat von: Bohnsopp am November 01, 2016, 12:05:08
folgende Felder sind über alle Wettfahrten konstant, aber je Boot individuell
idGruppe

Ein Boot wird je nach Geschwindigkeit (Yardstick) und Länge von der Rennleitung in eine Gruppe eingruppiert. Diese Gruppe ändert sich bei mehreren Wettfahrten (Wettfahrt alle Teilnehmer starten und werden im Ziel gezeitet) nicht.

Zitat von: Bohnsopp am November 01, 2016, 12:05:08
folgendes Feld ist für jedes Boot individuell.
intYardstick
allgemein haben selbe Bootstypen denselben Yardstick. Boote sind aber individuell wie die Eigner und daher haben in der Praxis viele Boote unterschiedliche Werte.
Boote ohne Spinacker können bei einer bestimmten Windrichtung (Vorwind) eine wettfahrtabhängige "Verbesserung" des Yardsticks bekommen. Diese Wettfahrtabhängige "Verbesserung"/Vergütung ist aber dann für alle Boote ohne Spinacker gleich. Meist ist dies eine Addition des Yardsticks um +1 oder +2 Punkte.

Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 01, 2016, 15:30:23
Zitat von: MzKlMu am November 01, 2016, 13:58:51
Nur mal zum Nachdenken:
Wenn Du in der Tabelle mit den Wettfahrten ein Feld für eine Wettfahrtnummer einbaust kannst Du auf immer und ewig beliebig viele Wettfahrten erfassen ohne jemals weitere Tabelle anlegen zu müssen oder Tabellen zu ändern.
Und kannst trotzdem nach jeder Wettfahrt differenzieren.

Die Idee kann ich nachvollziehen. Ich kann es nur noch nicht in die Praxis übertragen.

Klar ist eine Zuordnung über Fremdschlüssel für jedes Boot:
Wettfahrt ID | Punkte (~= Platzierung)
1                 |  2
2                 |  4
3                 | 12
4                 |  1

Für die Berechnung der Punkte (~= Platzierung) brauche ich einfach abstrahiert die Faktoren wie:
BootsID | Startzeit (ergibt sich aus der GruppenID und StartID)  |   Zielzeit   |   Yardstick (Yardstick Boot + Yardstick-Vergütung für Wettfahrt wenn kein Spinacker vorhanden ist, siehe Erklärung weiter oben)
D.h. die Rennleitung trägt im Ziel in die Tabelle die BootsID und die Zielzeit ein.

Wie bekomme ich nun diese "Zieltabelle" für XX-Wettfahrten zugeordnet?
Mir ersichtlich wäre nur folgendes:
BootsID | Startzeit_Wettfahrt1 | Zielzeit_Wettfahrt1 | YardstickWettfahrt1 | Startzeit_Wettfahrt2 | Zielzeit_Wettfahrt2 | Yardstick_Wettfahrt2 |
...
Startzeit_WettfahrtX | Zielzeit_WettfahrtX | Yardstick_WettfahrtX

damit würde ich aber wieder dynamisch in die Tabellenstruktur eingreifen.


Oder meinst Du sowas wie

BootsID | Startzeit_Wettfahrt | Zielzeit_Wettfahrt | YardstickWettfahrt | WettfahrtID

und dann darf die BootsID mehrmals vorkommen?

Gruß,
Sascha








Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: MzKlMu am November 01, 2016, 16:36:24
Hallo,
Du hast meinen Vorschlag noch nicht verstanden. Ich gehe jetzt mal davon aus, dass Du mit der jetzigen Tabelle alle gewünschten Auswertungen machen kannst.
Wenn ja, braucht diese jetzige Wettfahrttabelle doch nur ein Feld für die Wettfahrtnummer, nur dieses eine Feld. Dann musst Du diese Tabelle doch nur auf die gewünschte Wettfahrt filtern und schon hast Du den gleichen Aufbau der Tabelle und kannst diese für Deine Berechnungen/Auswertungen verwenden. Mehr braucht es nicht, ein einziges Feld.
So, das wäre dann man Stand.
Im weiteren Verlauf kannst Du eine allgemeine Wettfahrttabelle einführen, die die Daten der reinen Wettfahrt aufnimmt. Die jetzige Wettfahrttabelle nennst Du um in "tblWettfahrtBoote" und sieht dann so aus wie in Deinem obigen Beitrag.

WettfahrtBooteID | BootsID | Startzeit_Wettfahrt | Zielzeit_Wettfahrt | YardstickWettfahrt | WettfahrtID
Unterstrichen = Primärschlüssel (Autowert).

BootsID und WettfahrtID kommen in der ganzen Tabelle mehrfach vor in Ihrer Kombination sind diese aber eindeutig. Daher ist es zweckmäßig über BootID und WettfahrtID einen eindeutigen zusammengesetzten Index zu legen.
Die Filterung auf die gewünschte WettfahrtID hat dann nur die zu dieser Wettfahrt gehörenden Boote.
Und diese eine WettfahrtBoote Tabelle kannst Du theoretisch unendlich fortführen. Es muss niemals eine weitere Tabelle dynamisch erstellt werden. Du kannst immer nur die in Frage kommende Wettfahrt auswerten indem diese Tabelle gefiltert wird. .

Für jemand der von dieser Materie absolut keine Ahnung hat ist es natürlich problematisch die Zusammenhänge zu verstehen. Trotzdem glaube ich, dass das Hinzufügen dieses einen Feldes in der Wettfahrttabelle das Problem löst.

PS:
Lasse die Präfixe sein, sonst bedauerst Du das noch.
Titel: Re: Verständnisfrage zu Datenbankbeziehungen dynamisch erstellen
Beitrag von: Bohnsopp am November 02, 2016, 10:21:02
Hallo Klaus,
ich denke ich habe es dank Deiner genaueren Erklärung jetzt verstanden. Danke hierfür.
Werde es jetzt versuchen es soweit mal umzusetzen und mich zum Stichwort zusammengesetzter Index nochmal informieren.

Gruß,
Sascha