![]() |
Darstellung einer Zahl im DBGrid
hallo zusammen,
ich habe eine EAN13 in einem DB-Feld vom Typ char(). Funktioniert soweit wunderbar. Die Daten werden im DBGrid ordentlich dargestellt. Allerdings werden diese EANs auch alphanummerisch sortiert. Mein Versuch die Nummern numerisch zu sortieren scheitert bisher :-( Ich habe im SQl-Statement ein
Code:
eingefügt,da ich der Meinung war der Wertebereich ist so ausreichend.
cast(f.artnr as float) as artnr
Formatiert wird die GRID-Ausgabe mit '############0' Leider wird so aus einer gültigen EAN "4008400401027" die formatierte Zahl 4008400388096 :-( Hat hier jemand ne Erklärung? |
AW: Darstellung einer Zahl im DBGrid
Welche DB Engine verwendest du denn? SQL ist ziemlich vielfältig ;)
Abgesehen davon, wie kann denn eine EAN falsch sortiert werden? Selbst wenn es nicht numerisch ist? |
AW: Darstellung einer Zahl im DBGrid
Zitat:
firebird 2.1 zugriff über ZEOS naja, ist eben ein Unterschied ob numerisch oder alphanumerisch sortiert wird. EDIT: ibexpert kommt zum gleichen Ergebnis, aus einer gültigen EAN "4008400401027" wird 4008400388096 |
AW: Darstellung einer Zahl im DBGrid
Aber doch nur bei unterschiedlicher Stringlänge, oder täusche ich mich gerade?
[edit] Wie ist es denn ohne Cast und stattdessen mit LPAD?
SQL-Code:
[/edit]
LPAD(artnr, 20) as artnr
|
AW: Darstellung einer Zahl im DBGrid
Zitat:
|
AW: Darstellung einer Zahl im DBGrid
Damit meine ich, dass 123 nummerisch bewertet größer ist als 42, alphanumerisch aber nicht. Hast Du mein Edit oben gesehen?
|
AW: Darstellung einer Zahl im DBGrid
Also er sagt EAN13 = 13 Ziffern. Ich verstehe gerade nicht warum das fehlerhaft sortiert werden sollte?
|
AW: Darstellung einer Zahl im DBGrid
Wie wäre es damit:
SQL-Code:
Für die Funktion RightString() muss im Firebird 2.1 Dialekt die passende Funktion nachgeschlagen werden.
SELECT RightString('0000000000000'+ArtNr, 13) AS SortFeld, * FROM EanTabelle
ORDER BY 1 ORDER BY 1 bedeutet es wird nach dem 1. Feld sortiert. Eventuell muss zusätzlich noch die RTrim()-Funktion verwendet werden, weil ein Char(13)-Feld wahrscheinlich anhängende Leerzeichen haben kann
SQL-Code:
SELECT RightString('0000000000000'+RTrim(ArtNr), 13) AS SortFeld, * FROM EanTabelle
ORDER BY 1 |
AW: Darstellung einer Zahl im DBGrid
Dürfte das nicht mein LPAD von oben sein?
|
AW: Darstellung einer Zahl im DBGrid
Zitat:
LPAD funktioniert, ich danke dir. Kannst du mir das vieleicht noch erklären? Muss mich korrigieren, die Sortierung ist mit LPAD auch alphanumerisch, kann ich mir also sparen :-( |
AW: Darstellung einer Zahl im DBGrid
Ganz einfach: LPAD füllt links mit Leerzeichen (oder einem optional anzugebenden) bis zur angegebenen Länge auf. Und da das Leerzeichen einen kleineren ASCII-Wert als '0' hat, stimmt anschließend die alphanumerische mit der nummerischen Sortierung überein. Für Details zu der Funktion siehe
![]() |
AW: Darstellung einer Zahl im DBGrid
Zitat:
aber weshalb funktioniert cast nach float nicht?? |
AW: Darstellung einer Zahl im DBGrid
Ich habe den Wertebereich von Firebird-Float nicht im Kopf, aber möglicherweise kommst Du mit Deinen Zahlen da in einen Grenzbereich, wo es ungenau wird (das haben Fließkommazahlen ja leider so an sich).
|
AW: Darstellung einer Zahl im DBGrid
Sagt mal, ist es nicht ein wenig verwunderlich, wenn ein EAN-Code, der aus ZEICHEN besteht, als FLOAT in einer DB landet? Das ist grenzwertig gefährlich.
|
AW: Darstellung einer Zahl im DBGrid
Zitat:
|
AW: Darstellung einer Zahl im DBGrid
Zitat:
die EAN steht als String in einem 20 Zeichen grossen char()- Feld in der DB |
AW: Darstellung einer Zahl im DBGrid
Zitat:
|
AW: Darstellung einer Zahl im DBGrid
Zitat:
Zitat:
Zitat:
Hier mal der Grund: Zitat:
|
AW: Darstellung einer Zahl im DBGrid
>> Und dann wird er als FLOAT gecastet und man wundert sich, das die letzten Stellen flöten gehen?
wenn dem so wäre hätte ich die Erklärung die ich suche, dem ist aber nicht so, die letzen Stellen werden durch andere Ziffern "ersetzt" :-( |
AW: Darstellung einer Zahl im DBGrid
Ich dachte, mit dem LPAD sei das Problem gestorben :gruebel:
|
AW: Darstellung einer Zahl im DBGrid
Zitat:
Die Zahl 4.008.400.401.027' hat als FLOAT das gleiche Bitmpuster wie 4.008.400.388.096. Das gleiche dürfte für z.B. 4.008.400.389.123 gelten. Und ich würde nicht einfach dagegen halten, sondern einfach ausprobieren (geht schneller)
Code:
select cast ('123456789012' as float), cast ('123456789012' as numeric(13))
|
AW: Darstellung einer Zahl im DBGrid
>>Die Zahl 4.008.400.401.027' hat als FLOAT das gleiche Bitmpuster wie 4.008.400.388.096
DAS ist die Erklärung die ich gesucht habe. EDIT :cast ('123456789012' as numeric(13)) funktioniert ebenfalls Ich danke euch Gruss KHH |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 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