![]() |
Datenbank: Microsoft SQL • Version: 2005 • Zugriff über: .
SELECT-Statement in Delphi falsch, aber in Konsole richtig
Hallo ihr Lieben,
mir ist gerade ein Problem untergekommen, welches weder mir noch Kollegen untergekommen ist. Ich hab ein aufwendiges SQL-Statement in der Konsole von MS SQL geschrieben, welches auch nach einen Tag dann so funktionierte, wie ich es mir wünschte. ;) Nun wollte ich das in mein Delphi-Projekt einarbeiten:
Delphi-Quellcode:
Wenn ich nun versuche, dass Programm zu starten, um zu sehen, ob es so funktioniert wie ich es möchte, kommt die Fehlermeldung: "SQL Server message 208: Ungültiger Objektname 'pb_orga'.(line1)"
procedure TAdressbuchMit_Frame.Mitarbeitersuche (aBedingung: String);
begin with PostbuchData.sdqryKEMit do begin Close; SQL.Clear; SQL.Add('SELECT [pb_mitarbeiter].[mitarbeiter_id], '+ ' [pb_mitarbeiter].[nachname], '+ ' [pb_mitarbeiter].[vorname], '+ ' [pb_mitarbeiter].[org_id], '+ ' [pb_orga].[bezeichnung], '+ ' Tabelle2.[bezeichnung] '+ 'FROM '+ ' (SELECT Tabelle.[org_id], '+ ' Tabelle.[higher_ranking], '+ ' [pb_orga].[bezeichnung] '+ ' FROM '+ ' (SELECT [pb_orga].[org_id], '+ ' [pb_orga].[bezeichnung], '+ ' [pb_orga].[higher_ranking] '+ ' FROM [pb_orga]) Tabelle, [pb_orga] '+ ' WHERE [pb_orga].[org_id]=Tabelle.[higher_ranking]) '+ ' Tabelle2 RIGHT JOIN ([pb_mitarbeiter] '+ ' RIGHT JOIN [pb_orga] '+ ' ON [pb_mitarbeiter].[org_id]=[pb_orga].[org_id]) '+ ' ON Tabelle2.[org_id]=[pb_mitarbeiter].[org_id] '+ 'WHERE [pb_mitarbeiter].[mitarbeiter_id] IS NOT NULL '+ aBedingung); Open; end; end; Ich hab schon mehrmals den Quellcode hin- und zurückkopiert und erneut in der Konsole ausprobiert, wie gesagt, da funktioniert alles super. Ich bin wirklich ratlos und wäre froh über einen Gedankenanstoß. :oops: Sowas kommt davon, wenn der Ausbilder im Urlaub ist. ;) |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Du hast Dich beim Hin und Herkopieren irgendwie vertan:
"pborga" im Select Teil ist eine Tabelle / Alias, die Du in der From clause gekapselt hast, benannt ist es dort aber als Tabelle2. Im Join ist es ebenfalls falsch. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Auf den ersten Blick sehe ich nichts, aber es hilft, wenn du jeweils noch Zeilenumbrüche ergänzt, damit du nicht immer den Error in Zeile 1 bekommst (in der ja das gesamte SQL steht), weil das hilft ja mal gar nicht.
Delphi-Quellcode:
('SELECT [pb_mitarbeiter].[mitarbeiter_id], '+ #10#13 +
' [pb_mitarbeiter].[nachname], '+ #10#13 + ' [pb_mitarbeiter].[vorname], '+ #10#13 + ... |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
Ich verstehe Tabelle2 und pb_orga eigentlich als zwei verschiedene Tabellen. @Codewalker: Sry, bringt nix. Er sagt immer noch "line1". -.- |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zeilenumbruch = #13#10 oder sLinebreak!
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Das spielt aber keine Rolle, was Du darunter verstehst.
Du hast die Tabelle pbOrga nicht in der From Clause stehen, wenn ich mich nicht vertue. Ob die Konsole (oder Codeergänzung) da (irrtümlich) mitmacht, kann ich nicht sagen, weil ich keine habe. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
Zitat:
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Deine gesamte From Clause besteht nur aus einer Tabelle/Select/Alias!
Durch die Klammerung werden sämtliche Subselects innerhalb nicht mehr als eigenständige Tabellen erkannt. Da kannst Du alle Tabellen der Datenbank eintragen, ein Select darauf wird nicht funktionieren. (Und kann auch in der Console nicht funktionieren) |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Nur nebenbei: SQL ist eine Stringliste. Mach doch für jede Zeile ein eigenes Add. Dann sind das wirklich auch getrennte Zeilen und man muss nicht auf Leerzeichen oder Carriagereturns Rücksicht nehmen.
Sherlock |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Dann wird auch nur ein Linebreak eingefügt.
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
Zitat:
Ich weiß nicht, was ich weiterhin dazu sagen soll, außer das ich ratlos bin. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Kopier doch mal die Consolen SQL Version hier rein.
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Code:
SELECT [pb_mitarbeiter].[mitarbeiter_id],
[pb_mitarbeiter].[nachname], [pb_mitarbeiter].[vorname], [pb_mitarbeiter].[org_id], [pb_orga].[bezeichnung], Tabelle2.[bezeichnung] FROM (SELECT Tabelle.[org_id], Tabelle.[higher_ranking], [pb_orga].[bezeichnung] FROM (SELECT [pb_orga].[org_id], [pb_orga].[bezeichnung], [pb_orga].[higher_ranking] FROM [pb_orga]) Tabelle, [pb_orga] WHERE [pb_orga].[org_id]=Tabelle.[higher_ranking]) Tabelle2 RIGHT JOIN ([pb_mitarbeiter] RIGHT JOIN [pb_orga] ON [pb_mitarbeiter].[org_id]=[pb_orga].[org_id]) ON Tabelle2.[org_id]=[pb_mitarbeiter].[org_id] WHERE [pb_mitarbeiter].[mitarbeiter_id] IS NOT NULL |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Das sieht in der Tat nahezu identisch aus.
Das einzige was mir auffällt, Deine Bedingung (Delphi Parameter) fehlt hier. An der Zeilennummer würde ich mich nicht unbedingt hochziehen. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Die JOIN-Bedingungen sehen mir etwas merkwürdig aus.
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
Zitat:
![]() |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Da steht
Zitat:
SQL-Code:
Das meinte ich mit merkwürdig. An Deiner Stelle würde ich mir das Statement zunächst speichern und dann im Kleinen neu aufbauen. Klappt das hier?
RIGHT JOIN ...
ON ... RIGHT JOIN ... ON ...
SQL-Code:
SELECT [pb_mitarbeiter].[mitarbeiter_id]
FROM [pb_mitarbeiter] WHERE [pb_mitarbeiter].[mitarbeiter_id] IS NOT NULL |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
![]() Zitat:
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Benutz doch einmal Aliase und sag uns konkret, welche Tabellen Du unter welchen Bedingungen zusammenjoinen möchtest. Ich selber habe bei den ganzen Klammern und Subselects etwas den Überblick verloren.
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Aus den Postings bisher ist mir noch nicht ganz klar was für eine Datenbankkomponente hier im Einsatz ist.
Um auszuschließen dass Du hier nicht an irgendein dummes 255-Zeichen-Limit stößt würde ich mal statt das ganze SQL-Statement in einer einzelnen Zeile zu übergeben das Statement in mehrere SQL.Add() hintereinander aufteilen. Dann wird auch die Fehlermeldung mit Fehler in Zeile xy etwas aussagekräftiger... |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
Das mit den mehreren SQL.Add() hab ich schon probiert und kam weiterhin, dass das Problem in Zeile 1 liegt. Zitat:
In der Ausgabe soll dann halt der Mitarbeiter dastehen und seine Abteilung ggf. die übergeordnete Abteilung. Noch mal kurz: Orga-Tabelle: alle Abteilungen mit Org-ID, Bezeichnung und higher-ranking welche einer Org-Id entspricht Mitarbeiter-Tabelle: alle Mitarbeiter mit Abteilung (Org-ID) Nachtrag Ich bin jetzt unterwegs, schaue aber per Handy hier immer mal 'rein. Kann aber halt nix konkret dann ausprobieren, erst morgen früh wieder. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Wenn ich das richtig überblickt habe, kommst Du auch ganz ohne Subselects aus. Das kann ich aber erst später auseinanderklamüsern, da ich hier noch auf Arbeit bin.
[edit] Du willst also alle Mitarbeiter, Ihre Abteilung sowie die ggf. übergeordnete Abteilung ermitteln, stimmt das so? Was kommt denn hierbei heraus?
SQL-Code:
[/edit]
SELECT
M.[mitarbeiter_id], M.[nachname], M.[vorname], M.[org_id], O.[bezeichnung], O2.[bezeichnung] FROM [pb_mitarbeiter] M JOIN [pb_orga] O ON O.[org_id] = M.[org_id] LEFT JOIN [pb_orga] O2 ON O2.[org_id] = O.[higher_ranking] |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
dieses seltsame Higher_Ranking/Org_ID - Pärchen stört mich noch,
ansonsten finde ich an deddyhs Lösung nichts auszusetzen. Gruß K-h |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Was stört Dich daran? Das ist ein simpler Self-Join.
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Da es sich um 2 verschiedene Instanzen der selben Tabelle handelt, ist dies auch unumgänglich. Ist ausserdem nicht besonderst unüblich.
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Tschuldigung falsch ausgedrückt,
mit higher_ranking wird, wenn ich das richtig verstanden habe, Org_id "ersetzt". Aber nicht in allen Fällen(?) und solche Datenbasteleien erfüllen mich immer mit großem Mißtrauen. Gruß K-H |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
@p80286
ich verstehe das als Baumstruktur wo higher_ranking auf einen Vater verweisen kann, aber nicht muß |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
wenn aber Higher_Ranking NULL ist?
Zitat:
Ist aber alles Spekulatius ohne zu wissen was wirklich in den Daten steht. Gruß K-H |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Flache Hierarchien liegen doch im Trend :D
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
ja, ich könnte mir vorstellen daß es auf sowas rausläuft ...
Code:
Create FUNCTION [dbo].[FT_AbteilungsHirarchi](@org_id int)
RETURNS varchar(8000) as begin Declare @Pfad varchar(8000) Select @Pfad=Bezeichnung from dbo.pb_orga where org_id=@org_id if Exists(Select * from dbo.pb_orga where org_id = (Select higher_ranking from pb_orga where org_id=@org_id)) Select @Pfad=@Pfad + '/' + dbo.[FT_AbteilungsHirarchi]((Select higher_ranking from pb_orga where org_id=@org_id)) Return @Pfad end Select dbo.pb_mitarbeiter.*,[dbo].[FT_AbteilungsHirarchi](pb_mitarbeiter.org_id) as [Abteilung(en)] from pb_mitarbeiter |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Liste der Anhänge anzeigen (Anzahl: 5)
Wenn die Abteilung keine übergeordnete Abteilung hat, dann steht halt NULL im entsprechenden Datensatz, deshalb wird an der Stelle ja auch ein OUTER JOIN gemacht. Wer will, der kann ja noch ein CASE reinbasteln und NULL durch "ohne" oder sowas ersetzen.
[edit] Ich habe das mal schnell mit FB nachgebaut (siehe Screenshots) [/edit] |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
GENAU!! DeddyH hat's genau verstanden, wie ich das bastel! Es gibt maximal drei Hierarchie-Ebenen.
Ich probier das morgen früh gleich auf Arbeit aus und kuck mir das an, was ich daraus machen kann. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Einen wunderschönen Freitag wünsche ich euch allen!
Zitat:
Wenn ich das mache, ungelogen!, kommt folgende Fehlermeldung von MS SQL: "Meldung 208, Ebene 16, Status 1, Zeile 1 Ungültiger Objektname 'pb_mitarbeiter'." Kommt mir irgendwie verdächtig bekannt vor. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
bist Du in der richtigen Datenbank, heißt die Tabelle wirklich so, was kommt bei
Code:
select * from pb_mitarbeiter
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Wenn Du noch Bedingungen dranhängst zb.
Code:
mußt Du
where pb_mitarbeiter.irgendwas
Code:
nehmen
m.irgendwas
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
Könntet ihr mir einen Tipp geben, was wir da verändern müssten? Ich hab mich eigentlich nur für diese Datenbank eingeloggt, aber scheinbar ist da irgendwas anderes noch. |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
ConnectionString überprüfen
AfterConnect kannst Du auch eine Connection.Execute ('USE Datenbankname') abschicken |
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
BTW, wenn die Hierarchie tiefer als 2 Ebenen ist kannst Du Dir ja mal den Vorschlag aus #30 anschauen...
|
AW: SELECT-Statement in Delphi falsch, aber in Konsole richtig
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 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