Anmelden

View Full Version : QRY negative Zahl mit digits umwandeln und - nicht verlieren



ludwigD
14-04-05, 13:05
hi *all,
möchte im QRY ein neg. num feld (z.b. -1000) in ein char umwandeln, dabei verliert er aber das "-".


mfg

Ludwig

RobertMack
14-04-05, 13:24
das ist eher ein Fall für SQL oder QQMQRY:
select char(zoned(feldx, 11, 2)) from ...

Gruß,
Robert

Fuerchau
14-04-05, 13:58
Kleiner Nachteil der Funktion "char": sie liefert die Zahl linksbündig unformatiert.

checkity
13-05-05, 19:54
Hallo,
die char-Funktion hat Nachteile, die beim CAST nicht auftreten.

Beispiel:
Feld number ist ein numerisches Feld mit negativen Werten.

SELECT CAST(number AS CHAR(10))
FROM lib/table

So long,
Uwe

checkity
13-05-05, 20:44
Da war ich wohl etwas zu voreilig.
Beim CAST stehen die Werte natürlich linksbündig, was nicht unbedingt schön aussieht.
Hier kommt jetzt aber die Lösung, wie das ganze rechtsbündig zu stellen ist.
Annahme:
Feld number ist decimal(12, 2) definiert.
Für die Zeichendarstellung brauchen wir inklusive Vorzeichen 13 Stellen.
Der "Trick" ist, dass man die Länge des Wertes feststellt und dann die danach folgenden Leerzeichen im Ergebnis zuerst ausgibt und dann erst die eigentlich Zahl:

SELECT
SUBSTR(cast(number as character(13)),
length(trim(cast(number as character(13))))+1,
13-length(trim(cast(number as character(13))))
concat
LEFT(cast(number as character(13)),
length(trim(cast(number as character(13))))),
cast(number as character(13))
FROM lib/table

Schönen Abend noch
Uwe

Fuerchau
14-05-05, 10:29
Dann würde ich doch den etwas einfacheren Weg gehen:

select concat(digits(mynum),
case when mynum<0 then '-' else '+' end)
from myfile

checkity
14-05-05, 15:09
Hallo Fuerchau,
bei Deiner Lösung stehen führende Nullen und vor allem fehlt das Dezimalzeichen (Komma).
Hier ein verbessertes Beispiel von mir.
Das Feld mynum ist als decimal(12, 2) definiert!
Es werden somit 14 Stellen benötigt.

Bei Verwendung von Digits sieht es so aus:
mynum wird_zu
1,23 000000000123+
1324567890,12- 132456789012-
2333312- 000002333312-

So steht alles korrekt rechtsbündig, das Komma ist dabei und auch das Vorzeichen:

SELECT mynum,
SPACE(
14-LENGTH(TRIM(CAST(mynum AS CHAR(14)))))
CONCAT
LEFT(CAST(mynum AS CHAR(14)),
LENGTH(TRIM(CAST(mynum AS CHAR(14)))))
FROM myfile

Das ist zwar etwas kompliziert, aber es bringt ein schönes Ergebnis.
Uwe

Fuerchau
15-05-05, 15:05
Wie immer gibts da viele Lösungen.
Am besten wäre denn doch eine kleine (externe) SQL-Funktion, z.B. in RPGLE die das Ganze einfach als %editc intern auflöst.
Mittels Überladungen (verschiedene Eingabeparameter) kann man mehrere Varianten erstellen und man braucht sich um diese ganzen Längen und Concat's nicht zu kümmern.