Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 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