Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr.
Seite 1 von 2  1 2      

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