AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Cast(wert as decimal(10,2))
Thema durchsuchen
Ansicht
Themen-Optionen

Cast(wert as decimal(10,2))

Ein Thema von erich.wanker · begonnen am 3. Nov 2021 · letzter Beitrag vom 4. Nov 2021
Antwort Antwort
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
460 Beiträge
 
Delphi XE4 Professional
 
#1

Cast(wert as decimal(10,2))

  Alt 3. Nov 2021, 15:44
Datenbank: firebird • Version: 2.5 • Zugriff über: zeoa Lib
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
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 3. Nov 2021, 19:12
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 SELECT CAST(WERT AS DECIMAL(10,2)) As OrderByWert FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'AktivAND 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:

SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'AktivAND FIXWERT = 6 order by Cast(Wert as numeric)
oder
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'AktivAND FIXWERT = 6 order by LPad(Wert,10,'0')

Geändert von Delphi.Narium ( 3. Nov 2021 um 23:10 Uhr) Grund: Schreibfehler ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 3. Nov 2021, 21:40
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 3. Nov 2021, 21:55
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 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
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 3. Nov 2021, 22:52
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))
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 3. Nov 2021, 23:10
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:
SELECT * FROM S_EINSTELLUNGEN_WERTE WHERE STATUS = 'AktivAND FIXWERT = 6 order by Cast(replace(replace(replace(Wert,'.','#'),',','.'),'#',',') as numeric(10,2))
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 3. Nov 2021, 23:18
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
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 4. Nov 2021, 08:58
wird dadurch aber nicht weniger gruselig
Und hoffen es ist nicht irgendwann doch schon in englisch, sonst macht es noch mehr Spaß.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 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