AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fehler bei Left Join

Ein Thema von Ykcim · begonnen am 13. Sep 2021 · letzter Beitrag vom 14. Sep 2021
Antwort Antwort
Seite 2 von 3     12 3   
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
760 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 16:10
Das a.zynrefkl='108470001' 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...:
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) Ich kann aber nicht erkennen, woran es liegt. Wenn ich den SQL-String in HeidiSQL ausführe, klappt er...

Delphi-Quellcode:
      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);
Keine Ahnung, ich brauch doch nur eine funktionierende Lösung...
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.677 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 16:19
Probier doch mal 'Rueckstand' anstatt 'Rückstand'...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
760 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 16:20
Leider kein Erfolg...
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)
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.677 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 16:27
Dann wäre es sinnvoll, den Inhalt von SQL nach dem Add mal zu inspizieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
72 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 17:02
Der Fehler ist hier:
 '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:
 'AND c.lbn__ref = '''') AS ' + QuotedStr('Rückstand')+', '+
Achim
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
760 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 17:12
DANKE!!!

Jetzt tut es was es soll - ein Tag Arbeit für so eine Dusseligkeit.

Vielen Dank an alle, die mitgeholfen haben!!!
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.677 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 17:17
Warum verwendest du keine Parameter und Makros? Das würde helfen, solche Fehler zu vermeiden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
760 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 18:53
Makros weiß ich nicht, was Du damit meinst. Mit Parametern arbeite ich immer nur, wenn sie variable sein können.

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.856 Beiträge
 
Delphi 7 Professional
 
#19

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 19:45
Vermutlich sollte Dein SQL in etwa so aussehen, damit es per HeidiSQL oder sonsteiner Datenbankoberfläche ausführbar ist.
SQL-Code:
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 = '000002AND tabname_ = 'afgart__'
WHERE a.kla__rpn = 'MEYLE'
AND a.zynrefkl <> ''
AND (e.antw_txt <> '1OR 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
Um daraus nun kompilierbaren Delphiquelltext zu erhalten benötigt man ein TMemo (WordWrap := false), einen TButton und folgende Routine:
Delphi-Quellcode:
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.
Als Ergebnis erhält man den Quelltext, den man dann einfach in der IDE an der passenden Stelle (per Copy&Paste) einfügt:
Delphi-Quellcode:
  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');
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

Auswand: 15 oder 30 Minuten?
(Einmalig und nicht bei jedem SQL auf's Neue )

Geändert von Delphi.Narium (13. Sep 2021 um 19:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.677 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: Fehler bei Left Join

  Alt 14. Sep 2021, 00:40
Makros weiß ich nicht, was Du damit meinst.
Makros sind ein Feature von FireDAC mit dem man auch Teile von SQL Anweisungen parametrieren kann, die mit Parametern nicht gehen (z.B. Tabellen- und Feldnamen).

Mit Parametern arbeite ich immer nur, wenn sie variable sein können.
Neben der Variabilität haben Parameter auch den Vorteil, dass man sich nicht um Quotes und sonstige Formatbesonderheiten kümmern muss.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 06:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf