Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi unknown Token DESC (https://www.delphipraxis.net/169467-unknown-token-desc.html)

haentschman 22. Jul 2012 10:26

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC

unknown Token DESC
 
Hallo alle ... 8-)

Wer hilft beim Brille putzen ? Ich will eine Ergebnismenge nochmal nach 2 Kriterien sortieren.

SQL sinngemäß:
Delphi-Quellcode:
select * from (
.
komplexes SQL mit UNION funtioniert seperat ohne Sortierung
.
) order by Spalte1, Spalte2 desc
Sollte eigentlich simpel sein. Aber Fehler:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt dBK.exe ist eine Exception der Klasse EIBCError mit der Meldung '
Dynamic SQL Error
SQL error code = -104
Token unknown - line 6, column 31
desc' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
diverse Tutorials sagen dazu:
Zitat:

ORDER BY "Spalten_Name1" [ASC, DESC], "Spalten_Name2" [ASC, DESC]
Danke...

Nachtrag:
Der Knackpunkt muß wo anders liegen. Wenn ich Spalte2 desc weglasse bekomme ich einen anderen Fehler.

Mal der Quelltext:
Delphi-Quellcode:
QueryPayments.SQL.Text:= 'select * from (';
QueryPayments.SQL.Add('select PAYMENT_DATE, sum(PAYMENT),' + QuotedStr('dummy') + ' as CAPTION,');
QueryPayments.SQL.Add('ID_PAYMENT_TYPE from PAYMENTS where ID_PROCESS in (select ID_PROCESS from PROCESSES   where ID_STORE = :IDS)');
QueryPayments.ParamByName('IDS').AsInteger:= Options.StoreID;
if Options.TimeFrom > 0 then
begin
  if (Options.FreeTime) or (not Options.SplitMonth) then
  begin
    QueryPayments.SQL.Add(' and PAYMENT_DATE between :FRO and :TO');
    QueryPayments.SQL.Add(' group by PAYMENT_DATE, ID_PAYMENT_TYPE');
    QueryPayments.SQL.Add(' ) order by PAYMENT_DATE, SUM desc');
    QueryPayments.ParamByName('FRO').AsDate:= Options.TimeFrom;
    QueryPayments.ParamByName('TO').AsDate:= Options.TimeTo;
    QueryPayments.Open;
    SetCSVFileName(Options.TimeFrom,Options.TimeTo);
    WriteMemDataset;
    ExportToCSV(MemDataset,IncludeTrailingPathDelimiter(dm.dBK.Preferences.Common.CSVFolder) +        FCSVFileName,';',True,True);
  end
  else
  .
  .
Klammern sind korrekt (soweit ich sehe)... Was kann es noch sein ?

mkinzler 22. Jul 2012 10:54

AW: unknown Token DESC
 
Auf den ersten Blick scheint die Abfarge so korrekt zu sein. Was passiert, wenn du die Abfarge in einem Admintool absetzt?

Uwe Raabe 22. Jul 2012 11:05

AW: unknown Token DESC
 
Mangels adäquater Datenbank ist das natürlich nur schwer zu testen, aber versucht doch mal
Delphi-Quellcode:
SUM(Payment)
statt einfach nur
Delphi-Quellcode:
SUM
oder gib der Summenspalte einen Alias. Da sich das ORDER BY ja nicht direkt auf die SELECT-Anweisung mit dem Aggregat bezieht, könnte der SQL-Interpreter im äußeren SELECT mit dem Wort SUM Probleme bekommen.

haentschman 22. Jul 2012 11:05

AW: unknown Token DESC
 
Danke für die Anteilnahme 8-)

IBExpert:

Delphi-Quellcode:

select PAYMENT_DATE, sum(PAYMENT), 'dummy' as CAPTION, ID_PAYMENT_TYPE from PAYMENTS where ID_PROCESS in (select ID_PROCESS from PROCESSES where ID_STORE = 2) group by PAYMENT_DATE, ID_PAYMENT_TYPE
...funktioniert -> Ergebnismenge

Delphi-Quellcode:
select * from(

select PAYMENT_DATE, sum(PAYMENT), 'dummy' as CAPTION, ID_PAYMENT_TYPE from PAYMENTS where ID_PROCESS in (select ID_PROCESS from PROCESSES where ID_STORE = 2) group by PAYMENT_DATE, ID_PAYMENT_TYPE

) order by PAYMENT_DATE, SUM desc
Fehler: Token unknown - line 1, column 241.desc.
...wie zu sehen ist, ist da nur ein zusätzliches select drumherum...

Zitat:

aber versucht doch mal SUM(Payment) statt einfach nur SUM
...mit weggelassenem SUM
Delphi-Quellcode:
...) order by PAYMENT_DATE
bekomme ich einen Kommandofehler:
Invalid command.
no column name specified for column number 2 in derived table <unnamed>.
:gruebel:

mkinzler 22. Jul 2012 11:19

AW: unknown Token DESC
 
SUM ist ein reserviertes Wort

Furtbichler 22. Jul 2012 11:22

AW: unknown Token DESC
 
Gib allen Spalten einen Namen.

haentschman 22. Jul 2012 11:26

AW: unknown Token DESC
 
Na klar ! Solange die Ergebnismenge nur "ausgewertet" wird ist der Feldname SUM in der Ergebnismenge "erlaubt". Durch das zusätzliche select wird natürlich der Feldname intern verwendet und kollidiert mit dem reservierten Wort. Ein Alias hat das ganze aufgelöst.
Delphi-Quellcode:

select * from(select PAYMENT_DATE, sum(PAYMENT) as SUMPAYMENT, 'dummy' as CAPTION, ID_PAYMENT_TYPE from PAYMENTS where ID_PROCESS in (select ID_PROCESS from PROCESSES where ID_STORE = 2) group by PAYMENT_DATE, ID_PAYMENT_TYPE) order by PAYMENT_DATE, SUMPAYMENT desc
Danke an alle :hi:

mkinzler 22. Jul 2012 11:26

AW: unknown Token DESC
 
Zitat:

Zitat von Furtbichler (Beitrag 1175559)
Gib allen Spalten einen Namen.

Insebonders den Aggregaten

mkinzler 22. Jul 2012 11:29

AW: unknown Token DESC
 
Zitat:

Zitat von haentschman (Beitrag 1175560)
Na klar ! Solange die Ergebnismenge nur "ausgewertet" wird ist der Feldname SUM in der Ergebnismenge "erlaubt". Durch das zusätzliche select wird natürlich

Jein. Da du ja keinen vorgegeben hast wird automatisch einer generiert SUM<...>.
In ORDER BY hast du aber SUM als Spaltenname angegeben und hier erwartet der Parser nun das zu summierende Feld in einer Klammer und kann kmit DESC deshalb nichts anfangen

haentschman 22. Jul 2012 11:33

AW: unknown Token DESC
 
Zitat:

Da du ja keinen vorgegeben hast wird automatisch einer generiert SUM
...klar. In Anbetracht dessen sollte man sich angewöhnen bei Aggregatfunktionen grundsätzlich einen Alias zu vergeben. Da kann dann so etwas nicht mehr passieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 Uhr.
Seite 1 von 2  1 2      

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