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

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