![]() |
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 |
AW: Berechnungen in der select-Anweisung
Wieso QuotedStr? Benutz doch lieber SQL-Parameter, damit sparst Du Dir die Konvertierungen.
|
AW: Berechnungen in der select-Anweisung
Hallo DeddyH,
welche Parameter meinst Du. Bitte ein Beispiel. |
AW: Berechnungen in der select-Anweisung
Zitat:
|
AW: Berechnungen in der select-Anweisung
Hallo DaddyH,
ohhjaa, das ist ein guter Hinweis. Klar ein ',' ist das Problem. Danke |
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; |
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';
|
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. |
AW: Berechnungen in der select-Anweisung
Wieso denn String? Was genau hast Du versucht?
|
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". |
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:
So in etwa (ich würde noch sicherheitshalber auf NULL prüfen etc.)
Procedure TMyDataModule.ADOTableCalcFields(DataSet: TDataSet);
begin DataSet['VKPreisBErechnet'] := DataSet['VkPreis']*Faktor; End; |
AW: Berechnungen in der select-Anweisung
Im DataSet ist das natürlich eine Möglichkeit, wenn auch die inperformanteste.
|
AW: Berechnungen in der select-Anweisung
Zitat:
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. |
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