Delphi-PRAXiS

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".

Furtbichler 1. Nov 2013 20:27

AW: Berechnungen in der select-Anweisung
 
Wieso berechnet ihr das nicht einfach im Dataset? Wozu gibt es schließlich berechnete Felder und das OnCalcFields-Ereignis?

Delphi-Quellcode:
Procedure TMyDataModule.ADOTableCalcFields(DataSet: TDataSet);
begin
  DataSet['VKPreisBErechnet'] := DataSet['VkPreis']*Faktor;
End;
So in etwa (ich würde noch sicherheitshalber auf NULL prüfen etc.)

Union 1. Nov 2013 22:25

AW: Berechnungen in der select-Anweisung
 
Im DataSet ist das natürlich eine Möglichkeit, wenn auch die inperformanteste.

Furtbichler 1. Nov 2013 22:38

AW: Berechnungen in der select-Anweisung
 
Zitat:

Zitat von Union (Beitrag 1234221)
Im DataSet ist das natürlich eine Möglichkeit, wenn auch die inperformanteste.

Das merkt man doch eh erst bei einigen 1000 Records.
Wer eine Query basteln will, die von Client aus parametriert eine Spalte berechnet, will die Daten zu 99% im Client haben. Dann kann ich sie auch gleich im Client berechnen, tut ja, wie gesagt, nicht weh.

Und außerdem wollte ich einfach mal ne andere Möglichkeit andeuten. So blöd ist die ja nicht, vor allen Dingen, wenn man den Faktor on the fly ändern will. Dann werden die Daten fast live upgedatet. Vorausgesetzt, es sind, wie schon gesagt, nicht soooo viele.

Luckner 1. Nov 2013 23:02

AW: Berechnungen in der select-Anweisung
 
Hallo Furtbichler,
habe mir Deinen Vorschlag zu Herzen genommen und es ist wirklich eine Möglichkeit. Über das Dataset kann ich sogar mit Fastreport kommunizieren und im Druckformular benutzen. Es funktioniert. Danke Dir und Euch Allen für die Vorschläge.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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 by Thomas Breitkreuz