![]() |
AW: Fehler bei Left Join
Das
Delphi-Quellcode:
hat eigentlich nichts in der Abfrage zu suchen. Ich schränke die Abfrage damit nur testweise auf einen Artikel ein. Die Abfrage mit den beiden Selects bringt mir das richtige Ergebnis, aber wenn ich es in mein Delphi-Programm einbaue, bekomme ich eine Fehlermeldung, die ich bis jetzt nicht lösen konnte...:
a.zynrefkl='108470001'
Delphi-Quellcode:
Ich kann aber nicht erkennen, woran es liegt. Wenn ich den SQL-String in HeidiSQL ausführe, klappt er...
Erste Gelegenheit für Exception bei $76BBB512. Exception-Klasse EMSSQLNativeException mit Meldung '[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'Rückstand'.'. Prozess BD_DHL_Srvr.exe (12540)
Delphi-Quellcode:
Keine Ahnung, ich brauch doch nur eine funktionierende Lösung...
Query.SQL.Add('SELECT a.zynrefkl AS ' + QuotedStr('Artikelnummer') + ', '+
'a.afg_oms1 AS ' + QuotedStr('Artikelbezeichnung 1') + ', '+ 'concat('+QuotedStr('VPE:')+',a.per__chk,'+QuotedStr(' Stück')+') AS '+QuotedStr('Artikelbezeichnung 2')+' , '+ QuotedStr('') +' AS ' + QuotedStr('Artikelbezeichnung 3')+', '+ QuotedStr('') +' AS '+QuotedStr('Artikelbezeichnung 4')+', '+ QuotedStr('') +' AS '+QuotedStr('Artikelbezeichnung 5')+', '+ QuotedStr('') +' AS '+QuotedStr('Artikelbezeichnung 6')+', '+ 'b.in__vrrd AS ' + QuotedStr('Bestand') + ', '+ 'a.per__chk AS ' + QuotedStr('Abgreifmenge') + ', '+ 'a.minstock AS ' + QuotedStr('Mindestbestand') + ', '+ 'CASE WHEN b.in__vrrd < a.minstock then '+QuotedStr('Mindestmenge unterschritten') + ' ELSE '+QuotedStr('') + ' END AS '+QuotedStr('Bestandskommentar') + ', '+ QuotedStr('') + ' AS '+ QuotedStr('Kommentar') + ', '+ '(SELECT COALESCE(SUM(c.b_aantal),0) FROM bstlyn__ c '+ 'WHERE c.afg__ref=a.afg__ref '+ 'AND c.levv_dat<GETDATE() '+ 'AND c.lbn__ref = '') AS ' + QuotedStr('Rückstand')+', '+ '(SELECT COALESCE(SUM(d.aant_uit),0) FROM hisafg__ d '+ 'WHERE d.afg__ref=a.afg__ref) AS '+QuotedStr('Gesamtverbrauch')+' '+ ' FROM afgart__ a '+ 'LEFT JOIN afgant__ b ON b.afg__ref = a.afg__ref '+ 'LEFT JOIN gegdet__ e on e.det__ref = a.afg__ref and vrg__ref = '+QuotedStr('000002') + ' and tabname_ = '+QuotedStr('afgart__') + ' '+ 'WHERE a.kla__rpn = '+QuotedStr('MEYLE')+' '+ 'AND a.zynrefkl <> ' + QuotedStr('') + ' '+ 'AND (e.antw_txt <> '+ QuotedStr('1')+' '+ 'or e.antw_txt is null) '+ 'GROUP BY a.zynrefkl, a.afg_oms1, b.in__vrrd, a.per__chk, a.minstock, a.afg__ref '+ 'order by a.zynrefkl'); //Query.ParamByName('Kunde').AsString := 'MEYLE'; //Query.ParamByName('KZeichenAuslauf').AsString := '1'; ExecQuery(Query, Cols, Rows, 0); //Gesamtverbrauch Stand 12.04.2021 holen MyQuery.sql.Add('select * from stand_20210412'); ExecQuery(MyQuery, MyCols, MyRows, 0); |
AW: Fehler bei Left Join
Probier doch mal 'Rueckstand' anstatt 'Rückstand'...
|
AW: Fehler bei Left Join
Leider kein Erfolg...
Delphi-Quellcode:
Erste Gelegenheit für Exception bei $76BBB512. Exception-Klasse EMSSQLNativeException mit Meldung '[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'Rueckstand'.'. Prozess BD_DHL_Srvr.exe (18912)
|
AW: Fehler bei Left Join
Dann wäre es sinnvoll, den Inhalt von SQL nach dem Add mal zu inspizieren.
|
AW: Fehler bei Left Join
Der Fehler ist hier:
Delphi-Quellcode:
'AND c.lbn__ref = '') AS ' + QuotedStr('Rückstand')+', '+
Die zwei Hochkomma werden als nur ein Zeichen in den SQL-Text geschrieben! Um also zwei Hochkommata zu erhalten, musst Du das Zeichen viermal schreiben:
Delphi-Quellcode:
'AND c.lbn__ref = '''') AS ' + QuotedStr('Rückstand')+', '+
|
AW: Fehler bei Left Join
DANKE!!!
Jetzt tut es was es soll - ein Tag Arbeit für so eine Dusseligkeit. Vielen Dank an alle, die mitgeholfen haben!!! |
AW: Fehler bei Left Join
Warum verwendest du keine Parameter und Makros? Das würde helfen, solche Fehler zu vermeiden.
|
AW: Fehler bei Left Join
Makros weiß ich nicht, was Du damit meinst. Mit Parametern arbeite ich immer nur, wenn sie variable sein können.
Vielen Dank Patrick |
AW: Fehler bei Left Join
Vermutlich sollte Dein SQL in etwa so aussehen, damit es per HeidiSQL oder sonsteiner Datenbankoberfläche ausführbar ist.
SQL-Code:
Um daraus nun kompilierbaren Delphiquelltext zu erhalten benötigt man ein TMemo (WordWrap := false), einen TButton und folgende Routine:
SELECT
a.zynrefkl AS 'Artikelnummer', a.afg_oms1 AS 'Artikelbezeichnung 1', concat('VPE:',a.per__chk,' Stück') AS 'Artikelbezeichnung 2', '' AS 'Artikelbezeichnung 3', '' AS 'Artikelbezeichnung 4', '' AS 'Artikelbezeichnung 5', '' AS 'Artikelbezeichnung 6', b.in__vrrd AS 'Bestand', a.per__chk AS 'Abgreifmenge', a.minstock AS 'Mindestbestand', CASE WHEN b.in__vrrd < a.minstock THEN 'Mindestmenge unterschritten' ELSE '' END AS 'Bestandskommentar', '' AS 'Kommentar', ( SELECT SUM(COALESCE(c.b_aantal,0)) FROM bstlyn__ c WHERE c.afg__ref = a.afg__ref AND c.levv_dat < GETDATE() AND c.lbn__ref = '' ) AS 'Rückstand', ( SELECT SUM(COALESCE(d.aant_uit,0)) FROM hisafg__ d WHERE d.afg__ref = a.afg__ref ) AS 'Gesamtverbrauch' FROM afgart__ a LEFT JOIN afgant__ b ON b.afg__ref = a.afg__ref LEFT JOIN gegdet__ e ON e.det__ref = a.afg__ref AND vrg__ref = '000002' AND tabname_ = 'afgart__' WHERE a.kla__rpn = 'MEYLE' AND a.zynrefkl <> '' AND (e.antw_txt <> '1' OR e.antw_txt IS NULL) GROUP BY a.zynrefkl, a.afg_oms1, b.in__vrrd, a.per__chk, a.minstock, a.afg__ref ORDER BY a.zynrefkl
Delphi-Quellcode:
Als Ergebnis erhält man den Quelltext, den man dann einfach in der IDE an der passenden Stelle (per Copy&Paste) einfügt:
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer; begin for i := 0 to Memo1.Lines.Count - 1 do Memo1.Lines[i] := Format(' Query.SQL.Add(%s);',[QuotedStr(Memo1.Lines[i])])); Memo1.SelectAll; Memo1.CopyToClipboard; end.
Delphi-Quellcode:
Dürfte vermutlich schneller gehen, als alles per dutzender QuotedStr und vielen + als Einzeiler mit nur einem Query.SQL.Add irgendwie, hoffentlich kompilierbar, hinzubekommen und dann auch noch ein ausführbares SQL zu erhalten. Und das Nachzählen der ' kann dann auch entfallen ;-)
Query.SQL.Add('SELECT');
Query.SQL.Add(' a.zynrefkl AS ''Artikelnummer'','); Query.SQL.Add(' a.afg_oms1 AS ''Artikelbezeichnung 1'','); Query.SQL.Add(' concat(''VPE:'',a.per__chk,'' Stück'') AS ''Artikelbezeichnung 2'','); Query.SQL.Add(' '''' AS ''Artikelbezeichnung 3'','); Query.SQL.Add(' '''' AS ''Artikelbezeichnung 4'','); Query.SQL.Add(' '''' AS ''Artikelbezeichnung 5'','); Query.SQL.Add(' '''' AS ''Artikelbezeichnung 6'','); Query.SQL.Add(' b.in__vrrd AS ''Bestand'','); Query.SQL.Add(' a.per__chk AS ''Abgreifmenge'','); Query.SQL.Add(' a.minstock AS ''Mindestbestand'','); Query.SQL.Add(' CASE WHEN b.in__vrrd < a.minstock THEN'); Query.SQL.Add(' ''Mindestmenge unterschritten'''); Query.SQL.Add(' ELSE'); Query.SQL.Add(' '''''); Query.SQL.Add(' END AS ''Bestandskommentar'','); Query.SQL.Add(' '''' AS ''Kommentar'','); Query.SQL.Add(' ('); Query.SQL.Add(' SELECT SUM(COALESCE(c.b_aantal,0))'); Query.SQL.Add(' FROM bstlyn__ c'); Query.SQL.Add(' WHERE c.afg__ref = a.afg__ref'); Query.SQL.Add(' AND c.levv_dat < GETDATE()'); Query.SQL.Add(' AND c.lbn__ref = '''''); Query.SQL.Add(' ) AS ''Rückstand'','); Query.SQL.Add(' ('); Query.SQL.Add(' SELECT SUM(COALESCE(d.aant_uit,0))'); Query.SQL.Add(' FROM hisafg__ d'); Query.SQL.Add(' WHERE d.afg__ref = a.afg__ref'); Query.SQL.Add(' ) AS ''Gesamtverbrauch'''); Query.SQL.Add('FROM afgart__ a'); Query.SQL.Add('LEFT JOIN afgant__ b ON b.afg__ref = a.afg__ref'); Query.SQL.Add('LEFT JOIN gegdet__ e ON e.det__ref = a.afg__ref AND vrg__ref = ''000002'' AND tabname_ = ''afgart__'''); Query.SQL.Add('WHERE a.kla__rpn = ''MEYLE'''); Query.SQL.Add('AND a.zynrefkl <> '''''); Query.SQL.Add('AND (e.antw_txt <> ''1'' OR e.antw_txt IS NULL)'); Query.SQL.Add('GROUP BY a.zynrefkl, a.afg_oms1, b.in__vrrd, a.per__chk, a.minstock, a.afg__ref'); Query.SQL.Add('ORDER BY a.zynrefkl'); Auswand: 15 oder 30 Minuten? (Einmalig und nicht bei jedem SQL auf's Neue ;-)) |
AW: Fehler bei Left Join
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 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