Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit Inner Join (https://www.delphipraxis.net/181192-problem-mit-inner-join.html)

Jens Hartmann 23. Jul 2014 21:41

Datenbank: Access • Version: 2007 • Zugriff über: TADOQuery

Problem mit Inner Join
 
Hallo zusammen,

ich habe mehrere Tabellen. Die Tabellen sind wie folgt aufgebaut:

(Tabelle)
OBJEKT
(Spalten)
Objektnummer
Objektname

(Tabelle)
ZENTRALEN
(Spalten)
Id
Hersteller
Bezeichnung
Anlagentyp

(Tabelle)
HERSTELLER
(Spalten)
Id
Name

(Tabelle)
ANLAGENTYP
(Spalten)
Id
Bezeichnung

(Tabelle)
ANPSRECHPARTNER
(Spalte)
Ansprechpartnernr
Name

(Tabelle)
ANLAGEN
(Spalten)
Anlagennummer
Objektnummer
Anlagentyp

In der Tabelle OBJEKT habe ich nun ein Objekt gewählt, welches über mehrere Anlagen verfügt. Diese wiederrum können verschiedene Merkmale aufweisen. Daher möchte ich als Ergebnismenge folgende Spalten erhalten:

Anlagen.Anlagennummer, Objekt.Objektname, Zentralen.Bezeichnung, Hersteller.Name, AnlagenTyp.Bezeichnung, Ansprechpartner.Name

Ich versuche das ganze mit folgendem SQL Befehl:

Code:
SELECT Anlagen.Anlagennummer, Objekt.Objektname, Zentralen.Bezeichnung, Hersteller.Name, AnlagenTyp.Bezeichnung, Ansprechpartner.Name
FROM ((((ANLAGEN
INNER JOIN Objekt ON Anlagen.Objektnummer=Objekt.Objektnummer)
INNER JOIN Zentralen ON Anlagen.Zentralentyp=Zentralen.ID)
INNER JOIN Hersteller ON Zentralen.HerstellerID=Hersteller.ID)
INNER JOIN AnlagenTyp ON Zentralen.Anlagentyp=AnlagenTyp.ID)
LEFT JOIN Ansprechpartner ON Anlagen.Ansprechpartnernummer=Ansprechpartner.Ansprechpartnernr
WHERE Anlagen.Objektnummer= :Objektnummer
Sobald ich die Abfrage um die Spalte Anlagen.Anlagennummer erweitere, kommt die Fehlermeldung, das die Spalte nicht gefunden werden kann.

Kann mir jemand sagen wo hier mein Fehler liegt.

Vorab Danke und Gruß Jens

mkinzler 23. Jul 2014 21:49

AW: Problem mit Inner Join
 
Versuch es mal mit Tabellenaliasen.

Benötigt Access die vielen Klammern?

Dejan Vu 24. Jul 2014 06:39

AW: Problem mit Inner Join
 
Zum testen, wie der Feldname wirklich heißt, füge testweise ein 'Anlagen.*' an die Feldliste an. Im Resultset siehst Du dann alle Felder von 'Anlagen'. Klingt blöd, aber es vermeidet, im Wald gegen die Bäume zu rennen.

baumina 24. Jul 2014 07:27

AW: Problem mit Inner Join
 
LEFT JOIN Ansprechpartner ON Anlagen.Ansprechpartnernummer=Ansprechpartner.Ansprechpartnernr

laut deiner Tabellendefinition gibt's das Feld Ansprechpartnernummer nicht in der Tabelle Anlagen.

Jens Hartmann 25. Jul 2014 22:09

AW: Problem mit Inner Join
 
Zitat:

Zitat von baumina
laut deiner Tabellendefinition gibt's das Feld Ansprechpartnernummer nicht in der Tabelle Anlagen.

Doch, ich habe nur nicht alle Felder aufgeführt. Es gibt noch viel mehr Felder. Das von Dir angesprochene war aber in diesem Fall nicht wichtig.

Zitat:

Zitat von Dejan Vu
Zum testen, wie der Feldname wirklich heißt, füge testweise ein 'Anlagen.*' an die Feldliste an.

Hatte ich bereits und ich hab mir die Feldnamen mit

Delphi-Quellcode:
  ShowMessage(DataModule1.qrySystemData.FieldList.Text);
anzeigen lassen. Das Feld heißt auch Anlagennummer, darauf zugreifen konnte ich trotzdem nicht. Ich habe das Problem aber gelöst. Es scheint folgendes zu sein.

Feldnamen wie z.B. "Bezeichnung", welche in der Abfrage in mehreren Tabellen vorkommen, werden im Ergebnis der Feldnamen mit dem Tabellennamen davor dargestellt. z.B. ANLAGENTYP.Bezeichnung

Also kann der Zugriff wie folgt erfolgen...

Delphi-Quellcode:
Zentrale := DataModule1.qrySystemData.FieldByName('ANLAGENTYP.Bezeichnung').AsString;
Feldnamen wie der aktuelle Fehlergrund "Anlagennummer", welche in keiner weiteren Tabelle der Abfrage auftaucht, werden im Ergebnis der Feldnamen nur mit dem Feldname dargestellt -> "Anlagennummer"

Also kann der Zugriff nicht so...

Delphi-Quellcode:
AnlagenNr := DataModule1.qrySystemData.FieldByName('ANLAGEN.Anlagennummer').AsInteger;
erfolgen, sondern ...

Delphi-Quellcode:
AnlagenNr := DataModule1.qrySystemData.FieldByName('Anlagennummer').AsInteger;
Entgegen meiner Definition in der SQL-Abfrage, wird der vorgestellte Tabellennamen nur wenn erforderlich verwendet.

Danke trotzdem nochmal und Gruß Jens

p80286 26. Jul 2014 08:33

AW: Problem mit Inner Join
 
Im allgemeinen liefert eine Abfrage
Code:
SELECT Anlagen.Anlagennummer, Objekt.Objektname, Zentralen.Bezeichnung, Hersteller.Name, AnlagenTyp.Bezeichnung, Ansprechpartner.Name
die Felder
Code:
Anlagennummer, Objektname, Bezeichnung, Name, Bezeichnung_1, Name_1
in
Delphi-Quellcode:
fields[x].Name
zurück.
Besser wäre es gleich die notwendigen Namen selbst zu vergeben:
Code:
SELECT Anlagen.Anlagennummer as Anlagennummer
, Objekt.Objektname as Objektname
, Zentralen.Bezeichnung as Zentralenbezeichnung
, Hersteller.Name as Herstellername
, AnlagenTyp.Bezeichnung as AnlagenTypBezeichnung
, Ansprechpartner.Name as AnsprechpartnerName
Gruß
K-H

Sir Rufo 26. Jul 2014 09:10

AW: Problem mit Inner Join
 
@Jens Hartmann

Dann hast du dein Problem aber falsch beschrieben, bzw. die wichtigste Information nicht klar dargestellt.
Zitat:

Zitat von Jens Hartmann (Beitrag 1266478)
SQL-Code:
SELECT Anlagen.Anlagennummer, Objekt.Objektname, Zentralen.Bezeichnung, Hersteller.Name, AnlagenTyp.Bezeichnung, Ansprechpartner.Name
FROM ((((ANLAGEN
INNER JOIN Objekt ON Anlagen.Objektnummer=Objekt.Objektnummer)
INNER JOIN Zentralen ON Anlagen.Zentralentyp=Zentralen.ID)
INNER JOIN Hersteller ON Zentralen.HerstellerID=Hersteller.ID)
INNER JOIN AnlagenTyp ON Zentralen.Anlagentyp=AnlagenTyp.ID)
LEFT JOIN Ansprechpartner ON Anlagen.Ansprechpartnernummer=Ansprechpartner.Ansprechpartnernr
WHERE Anlagen.Objektnummer= :Objektnummer
Sobald ich die Abfrage um die Spalte Anlagen.Anlagennummer erweitere, kommt die Fehlermeldung, das die Spalte nicht gefunden werden kann.

Kann mir jemand sagen wo hier mein Fehler liegt.

Wie sollen wir daraus schließen, dass du damit
Delphi-Quellcode:
...
AnlagenNr := DataModule1.qrySystemData.FieldByName('ANLAGEN.Anlagennummer').AsInteger;
...
meinst?

Denn meine Frage wäre dann reflexartig gewesen:
Zitat:

Was liefert denn Delphi-Referenz durchsuchenTDataSet.GetFieldNames?
und die Frage wäre damit schon beantwortet ;)

Sir Rufo 26. Jul 2014 09:20

AW: Problem mit Inner Join
 
@p80286

Mein Vorschlag wäre den Kontext und die Eigenschaft mit einem _ (Underscore) zu trennen:
SQL-Code:
SELECT Anlagen.Anlagennummer as Anlage_AnlagenNummer
, Objekt.Objektname as Objekt_ObjektName
, Zentralen.Bezeichnung as Zentrale_Bezeichnung
, Hersteller.Name as Hersteller_Name
, AnlagenTyp.Bezeichnung as AnlagenTyp_Bezeichnung
, Ansprechpartner.Name as Ansprechpartner_Name
Gerade wenn man solche Abfragen in Bericht-Designern verwendet, kann man nach den Feldnamen sortieren lassen und hat alle logisch zusammengehörende Felder auch zusammen stehen.
Code:
Anlage_AnlagenNummer
Anlage_Bezeichnung
AnlagenTyp_Bezeichnung
Ansprechpartner_Name
Ansprechpartner_Nummer
Hersteller_Ansprechpartner_Name
Hersteller_Ansprechpartner_Nummer
Hersteller_Name
Hersteller_Nummer
Zentrale_Bezeichnung

p80286 26. Jul 2014 19:47

AW: Problem mit Inner Join
 
Zitat:

Zitat von Sir Rufo (Beitrag 1266696)
Gerade wenn man solche Abfragen in Bericht-Designern verwendet, kann man nach den Feldnamen sortieren lassen und hat alle logisch zusammengehörende Felder auch zusammen stehen.

Gute Idee, ich bin von einer Zentraldatei z.B. Personen ausgegangen, aus der man Lieferantennamen, Kundennamen usw. erhält. Die Benennung also unter inhaltlichen Gesichtspunkten erfolgt.

Gruß
K-H

Jens Hartmann 29. Jul 2014 06:41

AW: Problem mit Inner Join
 
Zitat:

Zitat von Sir Rufo
@Jens Hartmann

Dann hast du dein Problem aber falsch beschrieben, bzw. die wichtigste Information nicht klar dargestellt.

Da hast Du vermutlich recht. Ist nicht immer einfach einen Fehler klar darzustellen. Aber trotzdem nochmal Danke.

Ich werde Deinen Tip mit den Feldnamen umsetzen.

@p80286: Dir auch Danke...

Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 Uhr.

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