![]() |
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 ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 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