Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Cast(wert as decimal(10,2)) (https://www.delphipraxis.net/209162-cast-wert-decimal-10-2-a.html)

erich.wanker 3. Nov 2021 14:44

Datenbank: firebird • Version: 2.5 • Zugriff über: zeoa Lib

Cast(wert as decimal(10,2))
 
Hallo :-)

Wenn ich CAST verwende - bekomme ich einen SQL Fehler .. ohne CAST funktioniert es

UniMainModule.Dropdowns.sql.Clear;
UniMainModule.Dropdowns.sql.Append('SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS =' + #39 + 'Aktiv' + #39 + ' AND FIXWERT = 6 '); // ORDER BY CAST(WERT AS DECIMAL(10,2))
UniMainModule.Dropdowns.open;


Info zum Feld:
"WERT" CHAR(500) CHARACTER SET ISO8859_1 COLLATE DE_DE,

Info zum Fehler:
SQL Error: Dynamic SQL ErrorSQL error code = -504Invalid cursor referenceCursor is not open. Error Code: -504. Unknown cursor.

Mit Integer hats bis dato jahrelang funktioniert - jetzt wollte ich das Programm nur mit Kommawerte ergänzen - und schaff es nicht
PS: Ein Char(500) als Universalfeld für alle möglichen Dinge zu verwenden ist natürlich nicht klug ;-)


Danke für Hilfe :-)

Erich

Delphi.Narium 3. Nov 2021 18:12

AW: Cast(wert as decimal(10,2))
 
Leider schreibst Du nichts dazu, wie die Zahlen im Char(500) gespeichert sind.

Mit Dezimalkomma, mit Dezimalpunkt, Zahlen linksbündig auf Länge x mit 0 aufgefüllt ...

Funtioniert denn überhaupt ein
SQL-Code:
SELECT CAST(WERT AS DECIMAL(10,2)) As OrderByWert FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'Aktiv' AND FIXWERT = 6
?

Warum müssen die Zahlen überhaupt auf Decimal(10,2) getrimmt werden?

Es soll doch nach Zahlen sortiert werden, dabei ist es vollkommen egal, ob und wieviele Nachkommastellen die haben, es sei denn, es soll noch eine implizite Rundung der Zahlen erfolgen.

Mir fallen jetzt nur zwei Varianten ein:

SQL-Code:
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'Aktiv' AND FIXWERT = 6 order by Cast(Wert as numeric)

oder
SQL-Code:
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'Aktiv' AND FIXWERT = 6 order by LPad(Wert,10,'0')

himitsu 3. Nov 2021 20:40

AW: Cast(wert as decimal(10,2))
 
LPad mit Nachkomma, da mußt'e auch aufpassen, bzw. die Anzahl der Ziffern vor dem Komma oder einfach die Position des Kommas mit einrechnen.

1,000001
ist sonst größer als
1000000

Delphi.Narium 3. Nov 2021 20:55

AW: Cast(wert as decimal(10,2))
 
Solange wir keine Antwort auf die Frage
Zitat:

Leider schreibst Du nichts dazu, wie die Zahlen im Char(500) gespeichert sind.
bekommen, haben wir keine Chance eine sicher funktionierende Lösung zu finden.

Bei einem
SQL-Code:
CAST(WERT AS DECIMAL(10,2))
gehe ich mal davon aus, dass der Versuch gestartet werden soll, aus Zahlen mit zwei Nachkommastellen, die als String gespeichert sind, vergleichbare Zahlen zu machen.

Warum sollte man aus einem als Zeichenfolge vorliegenden 1,000001 zum Sortieren ein 1,00 machen? Da werden dann halt auch 1,001 und 1,0001 und 1,009999 und viele andere gleich ;-)

Wäre also egal für welche Variante man sich entscheidet, Decimal(10,2) oder LPad(Wert,10,'0'), die Sortierung wäre, bei einer unstrukturierten Datenbasis, auf jeden Fall falsch ;-)

IBExpert 3. Nov 2021 21:52

AW: Cast(wert as decimal(10,2))
 
wenn du im char(500) ein Komma hast wird der cast nicht funktionieren, da muss ein Punkt der dezimaltrenner sein.

gruseliger aber evtl funktionierender workaround den du mal testen kannst

Code:
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'Aktiv' AND FIXWERT = 6 order by Cast(replace(Wert,',','.') as numeric(10,2))

Delphi.Narium 3. Nov 2021 22:10

AW: Cast(wert as decimal(10,2))
 
Das wird aber dann "spaßig", wenn man nicht nur Dezimalkomma gegen Dezimalpunkt, sondern auch noch die Tausendertrenner Punkt und Komma vertauschen muss.

Aber das könnte dann in etwa so aussehen:
SQL-Code:
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'Aktiv' AND FIXWERT = 6 order by Cast(replace(replace(replace(Wert,'.','#'),',','.'),'#',',') as numeric(10,2))
;-)

IBExpert 3. Nov 2021 22:18

AW: Cast(wert as decimal(10,2))
 
das geht auch noch , weil der tausender punkt weggelassen werden kann, den einfach entfernen und danach , durch . ersetzen

Code:
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'Aktiv' AND FIXWERT = 6 order by Cast(replace(replace(Wert,'.',''),',','.') as numeric(10,2))
wird dadurch aber nicht weniger gruselig

himitsu 4. Nov 2021 07:58

AW: Cast(wert as decimal(10,2))
 
Zitat:

Zitat von IBExpert (Beitrag 1497041)
wird dadurch aber nicht weniger gruselig

Und hoffen es ist nicht irgendwann doch schon in englisch, sonst macht es noch mehr Spaß.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.

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