![]() |
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:
Sobald ich die Abfrage um die Spalte Anlagen.Anlagennummer erweitere, kommt die Fehlermeldung, das die Spalte nicht gefunden werden kann.
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 Kann mir jemand sagen wo hier mein Fehler liegt. Vorab Danke und Gruß Jens |
AW: Problem mit Inner Join
Versuch es mal mit Tabellenaliasen.
Benötigt Access die vielen Klammern? |
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.
|
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. |
AW: Problem mit Inner Join
Zitat:
Zitat:
Delphi-Quellcode:
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.
ShowMessage(DataModule1.qrySystemData.FieldList.Text);
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:
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"
Zentrale := DataModule1.qrySystemData.FieldByName('ANLAGENTYP.Bezeichnung').AsString;
Also kann der Zugriff nicht so...
Delphi-Quellcode:
erfolgen, sondern ...
AnlagenNr := DataModule1.qrySystemData.FieldByName('ANLAGEN.Anlagennummer').AsInteger;
Delphi-Quellcode:
Entgegen meiner Definition in der SQL-Abfrage, wird der vorgestellte Tabellennamen nur wenn erforderlich verwendet.
AnlagenNr := DataModule1.qrySystemData.FieldByName('Anlagennummer').AsInteger;
Danke trotzdem nochmal und Gruß Jens |
AW: Problem mit Inner Join
Im allgemeinen liefert eine Abfrage
Code:
die Felder
SELECT Anlagen.Anlagennummer, Objekt.Objektname, Zentralen.Bezeichnung, Hersteller.Name, AnlagenTyp.Bezeichnung, Ansprechpartner.Name
Code:
in
Anlagennummer, Objektname, Bezeichnung, Name, Bezeichnung_1, Name_1
Delphi-Quellcode:
zurück.
fields[x].Name
Besser wäre es gleich die notwendigen Namen selbst zu vergeben:
Code:
Gruß
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 K-H |
AW: Problem mit Inner Join
@Jens Hartmann
Dann hast du dein Problem aber falsch beschrieben, bzw. die wichtigste Information nicht klar dargestellt. Zitat:
Delphi-Quellcode:
meinst?
...
AnlagenNr := DataModule1.qrySystemData.FieldByName('ANLAGEN.Anlagennummer').AsInteger; ... Denn meine Frage wäre dann reflexartig gewesen: Zitat:
|
AW: Problem mit Inner Join
@p80286
Mein Vorschlag wäre den Kontext und die Eigenschaft mit einem _ (Underscore) zu trennen:
SQL-Code:
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.
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
Code:
Anlage_AnlagenNummer
Anlage_Bezeichnung AnlagenTyp_Bezeichnung Ansprechpartner_Name Ansprechpartner_Nummer Hersteller_Ansprechpartner_Name Hersteller_Ansprechpartner_Nummer Hersteller_Name Hersteller_Nummer Zentrale_Bezeichnung |
AW: Problem mit Inner Join
Zitat:
Gruß K-H |
AW: Problem mit Inner Join
Zitat:
Ich werde Deinen Tip mit den Feldnamen umsetzen. @p80286: Dir auch Danke... Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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