![]() |
Datenbank: Access • Version: 2000 • Zugriff über: ADO
ADO, Datensatz suchen inkl. Fremdtabelle
Morgen liebe Delphi-Gemeinde!!
Was mich momentan beschäftigt ist folgendes: Ich habe mir eine Test-DB im Access 2000 zugelegt (bestehend aus Tabelle 1 mit ein paar Werten und einem Fremdschlüssel (GUID, könnte aber auch Long Integer sein) der auf eine Fremdtabelle (Tabelle 2) zeigt, wo weitere Werte stehen). Jetzt will ich einen bestimmten Datensatz in Tabelle 1 suchen gehen und will natürlich mit dem Fremdschlüssel auch die Werte von Tabelle 2 auslesen können. Jetzt hab ich schon was über TADOQuery gelesen... Da ich noch nicht jahrelange Erfahrung habe, möchte ich eine elegante sowie 'saubere' Lösung finden. Ich hätte gefühlsmässig mit SQL-Statements in Tabelle 1 nach einem bestimmten DS gesucht und wär dann mit dem Fremdschlüssel (sofern es diesen bestimmten DS wirklich gibt!!) in Tabelle 2 gegangen um die weiteren Daten auszulesen. Ist das der richtige Ansatz?? Oder wie gehen da die Profis ran?? Bin über jeden guten Ansatz dankbar und froh... LG Thomas |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Man nennt sowas einen Join:
SQL-Code:
select
t1.<feld1>, t1.<feld2>, ... t2.<feld1>, t2.<feld2>, ... from <Tabelle1> t1 join <Tabelle2> t2 on t2.<fk> = t1.<pk> where <Suchbedigung>; |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Hallo,
über einen Join sollte das kein Problem sein. Leider kenne ich mich mit Access und seiner "Klammeritis" nicht gut aus, aber ansatzweise ist die Syntax so:
SQL-Code:
//Edit: Schon wieder zu langsam :stupid:
SELECT Tabelle1.Feld1, Tabelle1.Feld2, Tabelle2.Feld1, Tabelle2.Feld2...FROM Tabelle1
JOIN Tabelle2 ON Tabelle2.Fremdschlüssel = Tabelle1.Primärschlüssel WHERE Bedingung |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Danke für die raschen Antworten...
Was haltet ihr von folgendem Beispielcode??
Delphi-Quellcode:
Wär das eine brauchbare Alternative zu einem JOIN?? Oder is das Mist??
SELECT * FROM Auftraege WHERE Fahrer IN
(SELECT FFID FROM FahrzFahrer WHERE Fahrer = 16) |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Würde auch gehen, wenn das DBMS SubSelects versteht. Dürfte aber u.U. langsamer sein.
|
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Danke MKinzler!!
Habe Deine Antworten schon öfters bei diversen Fragen gelesen und Du hast immer gute Tipps parat. :) Also werd ich mich eingehend mit dem Thema 'JOIN' befassen und danke Dir nochmals für die rasche Antwort!! :thumb: LG Thomas |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Hab mich jetzt mal damit gespielt und hab noch eine Frage:
Einfache Abfragen ohne Bezug auf Fremdtabellen funktionieren....auch die JOIN-SQL-Anweisung schluckt er brav!! Wenn ich aber das Feld Farbe abfrage (siehe Code unten), bekomme ich eine Exception, daß er das Feld 'Farbe' nicht findet. Feld 'Farbe' kommt aber in der Tabelle 'TESTTAB' vor... nur das in dem Feld 'Farbe' kein Text, sondern der Fremdschlüssel (Long_Integer im Access) auf die FREMDTAB enthalten ist. Ausserdem will ich ja nicht den Fremdschlüssel zurückbekommen, sondern die tatsächlichen Werte, die dahinterstehen. Brauche ich dann 2 ADO-Query-Objekte??
Delphi-Quellcode:
procedure TfmMain.QueryDB;
var lBez : String; lZahl : String; lBool : String; lFarbe : String; lDat : String; lStr : String; begin ADOQuery1.Active := false; ADOQuery1.SQL.Text := 'SELECT * FROM TESTTAB INNER JOIN FREMDTAB ON (FREMDTAB.ID = ' + 'TESTTAB.FARBE) WHERE ZAHL = ' + IntToStr(2); ADOQuery1.Active := true; if not ADOQuery1.IsEmpty then begin while not ADOQuery1.EOF do begin lBez := ADOQuery1.FieldByName('Bezeichnung').AsString; lZahl := ADOQuery1.FieldByName('Zahl').AsString; lBool := ADOQuery1.FieldByName('Bool').AsString; lDat := ADOQuery1.FieldByName('Datum').AsString; //Fehlermeldung: 'Feld 'Farbe' wurde nicht gefunden! lFarbe := ADOQuery1.FieldByName('Farbe').AsString; lStr := 'Bezeichnung: ' + lBez + ' Zahl: ' + lZahl + ' Bool: ' + lBool + ' Datum: ' + lDat + 'Farbe: ' + lFarbe; ShowMessage(lStr); ADOQuery1.Next; end; end; ADOQuery1.First; ADOQuery1.Active := false; end; |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
-Schau dir mal im Feldeditor die Bezeichnung des Feldes an
-Ersetze das * mal durch die Feldliste |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Vielleicht noch zur Ergänzung --> Aufbau meiner TestDB:
![]() ![]() ![]() |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Versuch mal:
SQL-Code:
BTW. Ich würde das Feld Bool anders Nennen.
SELECT
Bezeichnung, Zahl, Bool, Datum, Farbe FROM TESTTAB INNER JOIN FREMDTAB ON FREMDTAB.ID = TESTTAB.FARBE WHERE ... |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Hallo MKinzler!!
Mit Deinem vorletzten Tipp (* durch Feldnamen zu ersetzen) hat es geklappt und ich bekam auch tatsächlich den Wert und nicht den Fremdschlüssel zurück (so wie gewünscht!!). Eine abschliessende Frage: Ist es auch denkbar solche Joins über mehrere Tabellen zu machen (Übungsbeispiele im Netz gehen ja meist von einer Fremdtabelle aus). Es könnte ja angenommen leicht der Fall sein, daß meine Fremdtabelle wieder einen Fremdschlüssel hat und dieser auf eine andere Tabelle verweißt, die ihrerseits wiederum einen Fremdschlüssel hat usw. Wie geht man in solchen Fällen vor?? |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Zu Deinem letzten Tipp --> geht im Prinzip genauso, nur muß ich im Select-Teil FREMDTAB.Farbe schreiben, ansonst bekomm ich eine Fehlermeldung, daß er nicht weiß, ob ich das Feld 'Farbe' von der TESTTAB oder von der FREMDTAB meine...
|
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Zitat:
SQL-Code:
SELECT TabA.*, TabB.Feld4, TabC.Feld13 FROM
(TabA INNER JOIN TabB ON TabA.Feldx=TabB.Feldx) INNER JOIN TabC ON TabB.Feldy=TabC.feldy WHERE ..... |
Re: ADO, Datensatz suchen inkl. Fremdtabelle
Vielen Dank!! :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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-2025 by Thomas Breitkreuz