Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Berechnungen in der select-Anweisung (https://www.delphipraxis.net/177343-berechnungen-der-select-anweisung.html)

Luckner 1. Nov 2013 13:45

Datenbank: Firebird • Version: 2.1.1 • Zugriff über: Dataset

Berechnungen in der select-Anweisung
 
Hallo,
möchte gerne in der select-Anweisung bestimmte Spalten mit einem Faktor muliplizieren. Mit select VKPREIS * 80/100 as VKPREIS, funktioniert das auch.
Mit 'select VKPREIS * ' + QuotedStr(FloatToStr(Quotient)) + ' as VKPREIS, usw.' funtioniert es nicht Es gibt einen Dynamic sql-Error. Bitte um Hilfe.

Gruß, Luckner

DeddyH 1. Nov 2013 13:47

AW: Berechnungen in der select-Anweisung
 
Wieso QuotedStr? Benutz doch lieber SQL-Parameter, damit sparst Du Dir die Konvertierungen.

Luckner 1. Nov 2013 14:00

AW: Berechnungen in der select-Anweisung
 
Hallo DeddyH,

welche Parameter meinst Du. Bitte ein Beispiel.

Union 1. Nov 2013 14:04

AW: Berechnungen in der select-Anweisung
 
Zitat:

Zitat von Luckner (Beitrag 1234150)
Hallo,
möchte gerne in der select-Anweisung bestimmte Spalten mit einem Faktor muliplizieren. Mit select VKPREIS * 80/100 as VKPREIS, funktioniert das auch.
Mit 'select VKPREIS * ' + QuotedStr(FloatToStr(Quotient)) + ' as VKPREIS, usw.' funtioniert es nicht Es gibt einen Dynamic sql-Error. Bitte um Hilfe.
Gruß, Luckner

SQL-Engines arbeiten bei Literalen im US-Amerikanischen oder ISO-Format, je nachdem ob es sich um numerische oder Datumswerte handelt. Du solltest FloatToStr mit den entsprechenden Formatsettings einsetzen. Sonst hast Du ein Komma als Dezimaltrenner und das mag der SQL-Parser nicht. Genauso wenig wie die zusätzlichen Hochkomma, die durch QuotedStr gesetzt werden.

Luckner 1. Nov 2013 14:07

AW: Berechnungen in der select-Anweisung
 
Hallo DaddyH,

ohhjaa, das ist ein guter Hinweis. Klar ein ',' ist das Problem. Danke

DeddyH 1. Nov 2013 14:14

AW: Berechnungen in der select-Anweisung
 
Man kann im SQL-Statement Parameter definieren und sie anschließend befüllen. Das sollte wann immer möglich die bevorzugte Vorgehensweise sein, da man einerseits nicht mit Konvertierungen am Hut hat und sich so außerdem vor SQL-Injection schützt.
Delphi-Quellcode:
Query.SQL.Text := 'SELECT VKPREIS * :Quotient AS VKPREIS FROM Tabelle';
Query.ParamByName('Quotient').Value := Quotient;
Query.Open;

Union 1. Nov 2013 14:18

AW: Berechnungen in der select-Anweisung
 
Leider verarbeiten manche Datenbanken die Parametertypen von Delphi nicht korrekt, so dass man zur Sicherheit evtl. auch noch folgendes machen kann / sollte:

Code:
Query.SQL.Text := 'SELECT VKPREIS * CAST(:Quotient AS SQL_DOUBLE) AS VKPREIS FROM Tabelle';

Luckner 1. Nov 2013 15:26

AW: Berechnungen in der select-Anweisung
 
Hallo DaddyH, Union
Leider gibt es in beiden Fällen einen "Dynamic SQL SQL Error expression evaluation not supported". Unterstützt Firebird diesen SQL-String nicht. Habe ebenfalls das ',' gegen '.' getauscht. Komischt ist nur, dass wenn icht diesen Quotienten im selectstring mit 80/100 ersetze, dann funktioniert es. Irgendwie mag die Select-Anweisung die
Multiplikation * + String-Variable + nicht.

DeddyH 1. Nov 2013 16:56

AW: Berechnungen in der select-Anweisung
 
Wieso denn String? Was genau hast Du versucht?

Luckner 1. Nov 2013 17:13

AW: Berechnungen in der select-Anweisung
 
Hallo DeddyH,
hier ein Auszu aus meinem Prog:

Prozentquotient := DatamoduleStamm.DataModule3.IBDataSetStammdaten.Fi eldByName('PROZENTSATZ').AsFloat /100;
TempString := StringReplace(FloatToStrF(Prozentquotient,ffFixed, 10,2), ',', '.', [rfIgnoreCase, rfReplaceAll]);
Prozentquotient := StrToFloat(TempString);
...
...
IBDataSetGridAuftrag.SelectSQL.Add('SELECT POSITIONSSUMME * CAST(:Prozentquotient as DECIMAL(10,2)) as POSITIONSSUMME FROM TABLE XYZ');
DatamoduleAuftrag.DataModule2.IBDataSetGridAuftrag .ParamByName('Prozentquotient').Value := Prozentquotient;


Jetzt gibt es den Fehler" 0.80 ist kein gültiger Gleitkommawert".


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz