Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [Access] Tabelle hat Beziehung mit sich selbst (https://www.delphipraxis.net/164749-%5Baccess%5D-tabelle-hat-beziehung-mit-sich-selbst.html)

hans ditter 28. Nov 2011 15:20

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

Bummi 28. Nov 2011 15:45

AW: [Access] Tabelle hat Beziehung mit sich selbst
 
Liste der Anhänge anzeigen (Anzahl: 2)
sowas?

hans ditter 29. Nov 2011 16:44

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

DeddyH 29. Nov 2011 16:47

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.

hans ditter 29. Nov 2011 21:54

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

Bummi 29. Nov 2011 22:12

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.

DeddyH 30. Nov 2011 07:15

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:
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;
Damit könnte man dann 2 Standard-ComboBoxen befüllen:
Delphi-Quellcode:
ListTeams(cbbHeim.Items);
ListTeams(cbbGast.Items);
Um zu vermeiden, dass dieselbe Mannschaft als Heim- und Gastmannschaft zugewiesen werden kann, filtert man diese heraus, sobald eine Heimmannschaft ausgewählt wurde:
Delphi-Quellcode:
ListTeams(cbbGast.Items, integer(cbbHeim.Items.Objects[cbbHeim.ItemIndex]));
Alles getippt und nicht getestet.

hans ditter 30. Nov 2011 14:18

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

DeddyH 30. Nov 2011 15:03

AW: [Access] Tabelle hat Beziehung mit sich selbst
 
Hilft dieser Thread?

Jumpy 30. Nov 2011 20:08

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz