![]() |
Datenbank: Access • Version: 2003 • Zugriff über: hauseigene Mittel
[Access] Tabelle hat Beziehung mit sich selbst
Hallo an alle!
Ich hoffe es haben ein paar Ahnung von Access (auch wenn's verhasst ist... ;) ). Wir müssen für die Schule ein Datenbankprojekt entwerfen zu einem Thema, dass wir selbst wählen. Die Erstellung, Verwaltung und Bearbeitung erfolgt mit den Accesseigenen Mitteln! wir haben uns nun ausgesucht ein Turnierplansystem zu erstellen. Dabei soll es so sein, dass es eine Mannschaft, ein Schiedsrichter, ein Spielfeld und die Begegnung als Tabellen gibt. Die Begegnung stellt die Beziehung der anderen Tabellen dar. Nun wollten wir die Beziehung zwischen Mannschaft und Begegnung setzten, hatten allerdings folgendes Problem: im Beziehungsfenster kann ein Primärschlüssel nicht zweimal auf dieselbe Tabelle gezogen werden, auch wenn andere Felder angesteuert werden sollen. Konkret ist das so: Wir haben tbl_Mannschaft und tbl_Begegnung. tbl_Begegnung hat nun die Felder BMan1 und BMan2 in denen die Kontrahenten geschrieben werden sollen. Möchte man nun im Beziehungsfenster den Primärschlüssel von tbl_Mannschaft sowohl auf BMan1, als auch auf BMan2 ziehen, so sagt Access das ginge nicht. Diese Beziehung ist ja aber nunmal essentielle für diese Datenbank. Helft uns bitte! Wie können wir die Beziehung mit sich selbst in Access umsetzten? Es kamen schon Anstoßrichtungen, dass man mal auf die Verknüpfung rechts klicken und dann Verknüpfungtyp auswählen soll. Da gibt es drei Möglickeiten, die wir aber alle nicht kennen. Wäre das die richtige Richtung? LG und vielen Dank; hans ditter |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Liste der Anhänge anzeigen (Anzahl: 2)
sowas?
|
AW: [Access] Tabelle hat Beziehung mit sich selbst
Hallo Bummi,
ja, ich schätze schon. Wobei ich feststellen musste, dass nicht das das wirkliche Problem ist, sondern etwas anderes... :( Trotzdem danke für deine Mühe! Ich hol dafür nochmal etwas weiter aus. Mannschaften werden mit einem Schlüssel gespeichert, der automatisch weiterzählt. Wenn ich jetzt eine neue Begegnung per Formular erstellen möchte, dann möchte ich aber nicht den Primärschlüssel eingeben müssen, sondern den Namen der Mannschaft. Ich dachte, dass wäre das Problem mit der Beziehung, aber scheinbar nicht... Kann mir dazu noch jemand weiterhelfen? hans ditter |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Willst Du den Namen händisch eingeben? Ich würde ja eine ComboBox nehmen, in der die Mannschaften gelistet werden. Die ID der jeweiligen Mannschaft kann man ja unsauber gecastet in den Objects ablegen.
|
AW: [Access] Tabelle hat Beziehung mit sich selbst
@DeddyH: deine Antwort klingt unendlich schlau.... aber das sagt mir grade leider gar nichts. :oops:
Würdest du dich da bitte nochmal ein wenig erklären? Ich bin noch mitgekommen, dass man eine Combobox nehmen sollte, in der die Namen aller Mannschaften stehen. Aber das mit "ID in Object casten" hab ich dann nicht mehr gerafft. hans ditter |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Mir ist noch nicht ganz klar wie Du das aufziehen willst.
Wenn man es von der Tabellenkomponentenseite angehen kann könntest Du das Dataset mit den Begegnungen um zwei Lookupfelder erweitern die in der Mannschaftstabelle nachschlagen. Also neues Feld, Feldtyp nachschlagen,Schlüsselfelder BMan1,Datenmenge DatasetManschaft,Schlüssel IDMannschaft, Ergebnisfeld Bezeichnung Mannschaft, das ganze für 2 Felder. Die Felder kannst Du aus dem Feldeditor auf die Oberfläche ziehen, das werden dann DBLookupcomboboxen, oder direkt in einem DBGrid verwenden (werden dort auch als Comboboxen angezeigt). Wenn Du datengebunden ohne Lookupfelder arbeiten möchtest kannst Du auch eine DBLookupcombobox verwenden, Datafield und Datasource leer lassen und nur ListSource,ListField und Keyfield versorgen (aus dem Manschftendataset) Keyvalue kannst Du verwenden um die ID für die angezeigte Mannschaft zu bekommen. Wenn Dir das alles nicht taugt wirst Du vorzugsweise Objekte basteln und um die Ecke in die Datenbank fassen. |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Man könnte eine Routine schreiben, die die Mannschaften ermittelt und in einem TStrings-Objekt ablegt:
Delphi-Quellcode:
Damit könnte man dann 2 Standard-ComboBoxen befüllen:
procedure TDeinForm.ListTeams(OutList: TStrings; ExcludeID: integer = 0);
begin Assert(Assigned(OutList)); OutList.BeginUpdate; try OutList.Clear; Query.SQL.Text := 'SELECT ID, Name FROM Mannschaften WHERE ID <> :id ORDER BY Name'; Query.ParamByName('ID').Value := ExcludeID; Query.Open; while not Query.EOF do begin OutList.AddObject(Query.FieldByName('Name').AsString, TObject(Query.FieldByName('ID').AsInteger)); Query.Next; end; Query.Close; finally OutList.EndUpdate; end; end;
Delphi-Quellcode:
Um zu vermeiden, dass dieselbe Mannschaft als Heim- und Gastmannschaft zugewiesen werden kann, filtert man diese heraus, sobald eine Heimmannschaft ausgewählt wurde:
ListTeams(cbbHeim.Items);
ListTeams(cbbGast.Items);
Delphi-Quellcode:
Alles getippt und nicht getestet.
ListTeams(cbbGast.Items, integer(cbbHeim.Items.Objects[cbbHeim.ItemIndex]));
|
AW: [Access] Tabelle hat Beziehung mit sich selbst
oh Mist!!!! :o ich glaube da wurde ich gerade mal gigantisch missverstanden!
Wir müssen den Dateizugriff etc. pp. (also auch "Formulare", Abfragen etc) mit den Accesseigenen Mitteln machen! Wäre das mit Delphi, wüsste ich vermutlich sogar, wie ich's machen soll. Nur mit Access ist das immer alles so umständlich... ich hab da keinen Durchblick! Ich hoffe ihr könnt mir dabei trotzdem helfen... hans ditter |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Hilft
![]() |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Hallo Hans,
bei Access ist das doch eigentlich alles recht einfach, da aus einem Guß, sprich auch seine GUI klickt man sich in der Regel in Access selber zusammen. Was deine Tabellen angeht. In der Tabelle Begegnungen. Feld Mannschaft_1. Dieses muss Zahl-Long oder so sein, damit es mit den Autowert-Indizes der Mannschaften Tabelle kompatiebel ist. Das wird alles schon bei der Tabellendefinition festgelegt. Da kann man dann auch den Typ des Anzeigefeldes festlegen, also z.B. Nachschlagefeld (=Combobox). Da dann die Datenquelle auswählen. Da kann man als Datentyp eine andere Tabelle oder Abfrage (=Views in anderen DBs) nehmen. Z.B. die sinngemäß Abfrage "Select Man_ID, Man_Name From Mannschaft". Da festlegen, das über das erste Feld verknüpft wird (die ID), aber festlegen, das zwei Felder angezeigt werden sollen in der Combobox (ID und Name der Mannachaft). Dann kann man noch die Anzeigenbreite angeben. Da z.B. "0cm,5cm" eingeben (ohne die "") so wird die ID 0cm breit, sprich gar nicht, und der Name 5 cm breit angezeigt. Du hast also dein Ergebnis: Obwohl du die Mannschaft per Name auswählst, wird die ID gespeichert. hth Jumpy |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Ich würde das ungefähr so aufbauen:
- eine Tabelle "Saison" - eine Tabelle "Mannschaften" - eine Tabelle "Begegnungen" So, die Begegnungen bekommen dann 4 Felder: ID (Autowert), ID_Saison (FK auf Saison), ID_Heim (FK auf Mannschaften), ID_Gast (nochmal FK auf Mannschaften). Über einen Check-Constraint stellt man sicher, dass sich ID_Heim und ID_Gast unterscheiden müssen (eine Mannschaft kann ja nicht gegen sich selbst spielen). Außerdem bekommt die Kombination aus ID_Saison, ID_Heim und ID_Gast einen Unique-Index verpasst, da es je Saison nur ein Hin- und ein Rückspiel gibt. Somit sollte das recht wasserdicht sein. Inwieweit sich das mit Access machen lässt, kann ich allerdings nicht sagen, da ich keins besitze. |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Ein dickes Danke an alle! :) Jetzt haben wir immerhin schonmal das erste große Problem gelöst.
Letztlich hat uns der Tipp geholfen,dass man einfach die Zuweisung macht und eine der beiden Spalten auf Breit 0 cm legt. Also das was Jumpy vorgeschlagen hat. Jetzt haben wir aber noch ein Problem, bzw. eigentlich ein ziemlich ähnliches. Jetzt wollen wir ein Spielplan zum Aufhängen erstellen lasse, also einen Bericht erstellen. Darin sollen die beiden Mannschaften (natürlich mit Namen) und noch ein paar Informationen angezeigt werden. Jetzt die Frage: wie schaffen wir es im Bericht, dass dort nich die ID sonder der Name angezeigt wird? Vielen Dank bis hierher schonmal für die Mitarbeit und ich würde mich über weitere Hilfe freuen! hans ditter |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Welche Tabellen hast Du denn jetzt?
Wahrscheinlich eine Tabelle Manschaften mit ID und Namen ? dann sollte das ungefähr so gehen:
SQL-Code:
Gruß
select Mannschaften1.Namen,Mannschaften2.Namen
from Mannschaften Mannschaften1, Mannschaften Mannschaften2, Begegnungen where Begegnungen.HeimID=ManNschaften1.ID and Begegnungen.GastID=Mannschaften2.ID K-H |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Ich werde morgen mal ein paar Bilder reinstellen, die das hoffentlich etwas besser erklären, als ich das kann.
LG; hans ditter |
AW: [Access] Tabelle hat Beziehung mit sich selbst
K-H hat doch völlig recht, genauso sollte es gehen. Etwas andere Syntax:
SQL-Code:
SELECT
M1.Name, M2.Name FROM Mannschaften M1 JOIN Begegnungen B ON B.Heim_ID = M1.ID JOIN Mannschaften M2 ON M2.ID = B.Gast_ID |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
das Problem (eigentlich ist es keines oder ich habe die Anforderung nicht verstanden) ist ganz einfach mit den Access-Mitteln lösbar, ohne dass mit SQL-Code herumgebastelt werden muss. Das ist nur erforderlich, wenn man das Access-Ergebnis verschönern will. Es muss nur die Tabelle Mannschaften 2 mal für die Erstellung der Abfrage eingefügt werden. Beziehungen können erstellt werden, sind aber für die Lösung nicht erforderlich. |
AW: [Access] Tabelle hat Beziehung mit sich selbst
Oooh man, ihr seid die Besten!!!
Ich glaube wir standen da alle ein bisschen auf der Leitung in der Projektgruppe.:oops: Letztlich so einfach. :thumb: Auf jeden Fall nochmal ein dickes Danke! :thumb::thumb: LG, hans ditter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz