AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit Inner Join
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Inner Join

Ein Thema von Jens Hartmann · begonnen am 23. Jul 2014 · letzter Beitrag vom 29. Jul 2014
Antwort Antwort
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#1

Problem mit Inner Join

  Alt 23. Jul 2014, 22:41
Datenbank: Access • Version: 2007 • Zugriff über: TADOQuery
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit Inner Join

  Alt 23. Jul 2014, 22:49
Versuch es mal mit Tabellenaliasen.

Benötigt Access die vielen Klammern?
Markus Kinzler
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Problem mit Inner Join

  Alt 24. Jul 2014, 07:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Problem mit Inner Join

  Alt 24. Jul 2014, 08:27
LEFT JOIN Ansprechpartner ON Anlagen.Ansprechpartnernummer=Ansprechpartner.Ansprechpartnernr

laut deiner Tabellendefinition gibt's das Feld Ansprechpartnernummer nicht in der Tabelle Anlagen.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Problem mit Inner Join

  Alt 25. Jul 2014, 23:09
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 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

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

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

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

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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Problem mit Inner Join

  Alt 26. Jul 2014, 09:33
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 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Problem mit Inner Join

  Alt 26. Jul 2014, 10:10
@Jens Hartmann

Dann hast du dein Problem aber falsch beschrieben, bzw. die wichtigste Information nicht klar dargestellt.
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Problem mit Inner Join

  Alt 26. Jul 2014, 10:20
@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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Problem mit Inner Join

  Alt 26. Jul 2014, 20:47
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Problem mit Inner Join

  Alt 29. Jul 2014, 07:41
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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