Kropka na przecinek

0

Jest sobie baza danych MySQL i takie zapytanie:

select nr, data,  termin_plat,
(wartosc_brutto - zaplacono) as do_zaplaty,
(CASE WHEN (datediff("2011-11-08", termin_plat))>0 THEN  (wartosc_brutto - zaplacono) ELSE null END) as wymagane,
(CASE WHEN (datediff("2011-11-08", termin_plat))<=0 THEN  (wartosc_brutto - zaplacono) ELSE null END) as niewymagane
from faktura

Kolumny "wartosc_brutto" i "zaplacono" są typu decimal(10,2) i na raporcie wydruku czy też w gridzie (programuję w Delphi) wartości tych pól (a nawet wyniki operacji na nich, jak powyżej wynik "do_zaplaty") wyświetlają się z przecinkiem i są wyjustowane do prawej strony. Niestety gdy wykonam na tych kolumnach operację CASE, to nie wiedzieć czemu wartość zmienia się jakby na stringa: wyjustowane jest do lewej, a zamiast przecinka pojawia się kropka. O ile justowanie to żaden problem potem w gridzie, czy w raporcie, o tyle ta kropka jest nie do zaakceptowania. Wygląda to tak:
user image

Ma ktoś jakiś pomysł jak sobie z tym poradzić na poziomie zapytania SQL-owego? Jest tam jakaś funkcja w stylu asfloat, czy coś?

0

To pytanie chyba powinieneś zadać w dziale Delphi... Baza danych MySQL zwraca w tym CASE WHEN... wartość zmiennoprzecinkową, to Delphi nie wiedzieć czemu konwertuje ją na napis.

0

Też tak początkowo myślałem, ale potem zauważyłem, że MySQL Control Center i phpmyadmin też justują do lewej. Akurat decimal w nich też jest z kropkami, więc tu różnicy nie zauważymy, ale ewidentnie widać, że po tej operacji CASE coś się zmieniło z typem danych.

user image

user image

0

Sprawdzałem to w konsoli linuxowej i mam wartości z CASE wyjustowane do prawej oraz z kropką. Podejrzewam, że Delphi oraz programy w których to sprawdzałeś nie wiedzą co zwróci CASE i dlatego konwertują to zawsze na napis.

user image

0

przekonwertuj całego case na decimal(10, 2) (każdego osobno) albo zamiast null zwracaj 0

0
Misiekd napisał(a)

przekonwertuj całego case na decimal(10, 2) (każdego osobno) albo zamiast null zwracaj 0

Właśnie dlatego założyłem ten temat, bo nie wiem, jak się na poziomie zapytania SQL-owego konwertuje na decimal :)

Ozi wczoraj, 14:45 napisał(a)

Jest tam jakaś funkcja w stylu asfloat, czy coś?

Proszę o pomoc.

Z tym zerem faktycznie pomogło, ale niestety tak nie może być - musi być NULL.

0

Albo jestem ślepy, albo głupi, albo sam już nie wiem co.
Żaden z poniższych przykładów nie działa:

convert((CASE WHEN (datediff("2011-11-08", termin_plat))>0 THEN  (wartosc_brutto - zaplacono) ELSE NULL END) using decimal(10,2)) AS wymagane
convert((CASE WHEN (datediff("2011-11-08", termin_plat))>0 THEN  (wartosc_brutto - zaplacono) ELSE NULL END), decimal(10,2)) AS wymagane
cast((CASE WHEN (datediff("2011-11-08", termin_plat))>0 THEN  (wartosc_brutto - zaplacono) ELSE NULL END) as decimal(10,2)) AS wymagane
0

Musiałbyś najpierw MySQL-owi wytłumaczyć jak ma sobie poradzić z konwersja NULL na DECIMAL.

0
AdamPL napisał(a)

Musiałbyś najpierw MySQL-owi wytłumaczyć jak ma sobie poradzić z konwersja NULL na DECIMAL.

To znaczy?

Dodam, że z zerami zamiast NULL też nie działa:

convert((CASE WHEN (datediff("2011-11-08", termin_plat))>0 THEN  (wartosc_brutto - zaplacono) ELSE 0 END) using decimal(10,2)) AS wymagane
convert((CASE WHEN (datediff("2011-11-08", termin_plat))>0 THEN  (wartosc_brutto - zaplacono) ELSE 0 END), decimal(10,2)) AS wymagane
cast((CASE WHEN (datediff("2011-11-08", termin_plat))>0 THEN  (wartosc_brutto - zaplacono) ELSE 0 END) as decimal(10,2)) AS wymagane
0

Ehhh, widzę że mój mysql w ogóle chyba nie rozumie co to jest decimal :o

SELECT id_rok, CONVERT( id_rok, DECIMAL) FROM faktura
SELECT id_rok, CAST( id_rok as DECIMAL) FROM faktura

MySQL zwrócił komunikat:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'decimal ) FROM faktura' at line 1

Takie zapytania z kolei działają:

SELECT id_rok, CONVERT( id_rok, CHAR) FROM faktura
SELECT id_rok, CAST(id_rok as CHAR) FROM faktura

Uprzedzając pytania:
user image

0

Decimal ma parametry (ilość cyfr, precyzja)

0
maciejmt napisał(a)

Decimal ma parametry (ilość cyfr, precyzja)

Wiem, wiem, ale tak też nie działa:

SELECT id_rok, CONVERT( id_rok, DECIMAL(10,2)) FROM faktura
SELECT id_rok, CAST( id_rok AS DECIMAL(10,2)) FROM faktura
0

Co to znaczy "nie działa"?! Czy myślisz, że możemy w jakiś sposób pomóc jeżeli nie podałeś nawet komunikatu błędu?

U mnie CAST czy CONVERT na DECIMAL działa...
user image

0
AdamPL napisał(a)

Co to znaczy "nie działa"?! Czy myślisz, że możemy w jakiś sposób pomóc jeżeli nie podałeś nawet komunikatu błędu?

Odsyłam do mojego wpisu z "2011-11-10 12:24".
Pozdrawiam.

0

Tamten komunikat dotyczył konwersji na typ decimal bez podanej precyzji.

0

Po podaniu precyzji komunikat jest taki sam:

Błąd

zapytanie SQL :
SELECT id_rok, CONVERT( id_rok, DECIMAL( 10, 2 ) )
FROM faktura

MySQL zwrócił komunikat:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECIMAL( 10, 2 ) ) FROM faktura' at line 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1