![]() |
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 |
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')
|
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 |
AW: Cast(wert as decimal(10,2))
Solange wir keine Antwort auf die Frage
Zitat:
Bei einem
SQL-Code:
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.
CAST(WERT AS DECIMAL(10,2))
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 ;-) |
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))
|
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))
|
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:
wird dadurch aber nicht weniger gruselig
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'Aktiv' AND FIXWERT = 6 order by Cast(replace(replace(Wert,'.',''),',','.') as numeric(10,2))
|
AW: Cast(wert as decimal(10,2))
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 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-2025 by Thomas Breitkreuz