Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO, Datensatz suchen inkl. Fremdtabelle (https://www.delphipraxis.net/99739-ado-datensatz-suchen-inkl-fremdtabelle.html)

bingo72 17. Sep 2007 07:12

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

mkinzler 17. Sep 2007 07:16

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>;

DeddyH 17. Sep 2007 07:17

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:
SELECT Tabelle1.Feld1, Tabelle1.Feld2, Tabelle2.Feld1, Tabelle2.Feld2...FROM Tabelle1
JOIN Tabelle2 ON Tabelle2.Fremdschlüssel = Tabelle1.Primärschlüssel
WHERE Bedingung
//Edit: Schon wieder zu langsam :stupid:

bingo72 17. Sep 2007 07:22

Re: ADO, Datensatz suchen inkl. Fremdtabelle
 
Danke für die raschen Antworten...

Was haltet ihr von folgendem Beispielcode??

Delphi-Quellcode:
SELECT * FROM Auftraege WHERE Fahrer IN
 (SELECT FFID FROM FahrzFahrer WHERE Fahrer = 16)
Wär das eine brauchbare Alternative zu einem JOIN?? Oder is das Mist??

mkinzler 17. Sep 2007 07:32

Re: ADO, Datensatz suchen inkl. Fremdtabelle
 
Würde auch gehen, wenn das DBMS SubSelects versteht. Dürfte aber u.U. langsamer sein.

bingo72 17. Sep 2007 07:40

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

bingo72 17. Sep 2007 09:23

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;

mkinzler 17. Sep 2007 09:30

Re: ADO, Datensatz suchen inkl. Fremdtabelle
 
-Schau dir mal im Feldeditor die Bezeichnung des Feldes an
-Ersetze das * mal durch die Feldliste

bingo72 17. Sep 2007 09:40

Re: ADO, Datensatz suchen inkl. Fremdtabelle
 
Vielleicht noch zur Ergänzung --> Aufbau meiner TestDB:

http://www.bos.at/downloads/TestTab.jpg
http://www.bos.at/downloads/FremdTab.jpg
http://www.bos.at/downloads/Bez.jpg

mkinzler 17. Sep 2007 09:55

Re: ADO, Datensatz suchen inkl. Fremdtabelle
 
Versuch mal:
SQL-Code:
SELECT
    Bezeichnung, Zahl, Bool, Datum, Farbe
FROM
    TESTTAB
       INNER JOIN FREMDTAB ON FREMDTAB.ID = TESTTAB.FARBE
WHERE ...
BTW. Ich würde das Feld Bool anders Nennen.

bingo72 17. Sep 2007 10:07

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??

bingo72 17. Sep 2007 10:16

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...

shmia 17. Sep 2007 10:17

Re: ADO, Datensatz suchen inkl. Fremdtabelle
 
Zitat:

Zitat von bingo72
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.

Natürlich geht das. Bei Access ist allerdings zu beachten, dass die einzelnen JOINs geklammert werden müssen, damit so die Reihenfolge festgelegt wird:
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 .....

bingo72 17. Sep 2007 10:24

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