Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z Konwersja na DECIMAL
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
neon85
Witam!

Proszę o pomoc. Próbowałem juz kilkoma sposobami i cały czas mi nie wychodzi.
A mianowicie mam taką procedurę:


  1. CREATE PROC AktualizujTowar
  2. @IDtowar int,
  3. @Nazwa varchar(255) = NULL,
  4. @Symbol varchar(20) = NULL,
  5. @Opis text = NULL,
  6. @Zdjecie varchar(25) = NULL,
  7. @Cena decimal(5,2) = NULL,
  8. @Waga decimal(3,3) = NULL,
  9. @StanMag int = NULL
  10. AS  UPDATE Towary 
  11.   SET 
  12.   Nazwa=@Nazwa,
  13.   Symbol=@Symbol,
  14.   Opis=@Opis,
  15.   Zdjecie=@Zdjecie,
  16.   Cena=@Cena,
  17.   Waga=@Waga,
  18.   StanMag=@StanMag
  19.  WHERE IDtowar=@IDtowar


Probując zmodyfikować jakiś rekord np:

  1. EXEC AktualizujTowar 8, 'Test', '5', 'Opis', 'zdjecie', 22.36, 24.565, 1


otrzymuję komunikat:

Msg 8114, Level 16, State 1, Procedure AktualizujTowar, Line 0
Error converting data type numeric to decimal.

Nie wiem jak sobie z tym poradzić. Fukncja CONVERT() nie pomaga.

Z góry dzieki.
Zbłąkany
Odpowiedź znajdziesz tutaj. Zerknij na tabelę konwersji i wykorzystaj poradę pod tabelą smile.gif .
neon85
To już wcześniej widziałem i albo cos do końca nie rozumiem albo już sam nie wiem.

Zmieniłem Procedurę na taką:

  1. ALTER PROC AktualizujTowar
  2. @IDtowar int,
  3. @Nazwa varchar(255) = NULL,
  4. @Symbol varchar(20) = NULL,
  5. @Opis text = NULL,
  6. @Zdjecie varchar(25) = NULL,
  7. @Cena float = NULL,
  8. @Waga float = NULL,
  9. @StanMag int = NULL
  10. AS  UPDATE Towary 
  11.   SET 
  12.   Nazwa=@Nazwa,
  13.   Symbol=@Symbol,
  14.   Opis=@Opis,
  15.   Zdjecie=@Zdjecie,
  16.   Cena=@Cena,
  17.   Waga=@Waga,
  18.   StanMag=@StanMag
  19.  WHERE IDtowar=@IDtowar



i jak daję takie wywołanie:

  1. exec AktualizujTowar 8, @Cena=2.4


to jest dobrze. 

Natomiast, gdy zamienię na to:

  1. exec AktualizujTowar 8, @Waga=2.4


to pojawia sie komunikat:

  1. Msg 8115, Level 16, State 6, Procedure AktualizujTowar, Line 12
  2. Arithmetic overflow error converting float TO DATA type numeric.
  3. The statement has been terminated.



co jest nie tak?
prachwal
Cytat(neon85 @ 1.04.2009, 07:38:35 ) *
To już wcześniej widziałem i albo cos do końca nie rozumiem albo już sam nie wiem.

Zmieniłem Procedurę na taką:

  1. ALTER PROC AktualizujTowar
  2. @IDtowar int,
  3. @Nazwa varchar(255) = NULL,
  4. @Symbol varchar(20) = NULL,
  5. @Opis text = NULL,
  6. @Zdjecie varchar(25) = NULL,
  7. @Cena float = NULL,
  8. @Waga float = NULL,
  9. @StanMag int = NULL
  10. AS UPDATE Towary
  11. SET
  12. Nazwa=@Nazwa,
  13. Symbol=@Symbol,
  14. Opis=@Opis,
  15. Zdjecie=@Zdjecie,
  16. Cena=@Cena,
  17. Waga=@Waga,
  18. StanMag=@StanMag
  19. WHERE IDtowar=@IDtowar



i jak daję takie wywołanie:

  1. exec AktualizujTowar 8, @Cena=2.4


to jest dobrze.

Natomiast, gdy zamienię na to:

  1. exec AktualizujTowar 8, @Waga=2.4


to pojawia sie komunikat:

  1. Msg 8115, Level 16, State 6, Procedure AktualizujTowar, Line 12
  2. Arithmetic overflow error converting float TO DATA type numeric.
  3. The statement has been terminated.



co jest nie tak?


jaki typ danych masz w tabeli Towary dla pola Waga?

jest coś takiego jak convert(float,@liczba)
neon85
Cytat(prachwal @ 2.04.2009, 18:09:34 ) *
jaki typ danych masz w tabeli Towary dla pola Waga?

jest coś takiego jak convert(float,@liczba)


Mam tak jak w pierwszym poście w deklaracjach czyli decimal(3,3). convert nie pomaga:/
prachwal
Cytat(neon85 @ 2.04.2009, 22:13:51 ) *
Mam tak jak w pierwszym poście w deklaracjach czyli decimal(3,3). convert nie pomaga:/


pomoże za to zmiana typu z decimal (3,3) an decimal(4,3) lub decimal(3,2)

nie wiem dlaczego ale jak tak zmienisz to ma ochotę działać

przykład:

select convert(decimal(4,3),cast(3.303 as float))
neon85
Cytat(prachwal @ 3.04.2009, 19:51:50 ) *
pomoże za to zmiana typu z decimal (3,3) an decimal(4,3) lub decimal(3,2)

nie wiem dlaczego ale jak tak zmienisz to ma ochotę działać

przykład:

select convert(decimal(4,3),cast(3.303 as float))


Na to wygląda, że pierwsza wartość określa całkowitą długość liczby, a druga tylko jej część dziesiętną, a ja cały czas myślałem, że pierwsza ilość znaków przed przecinkiem a druga za nim. 


W każdym bądź razie wielkie dzięki, gdyż DZIAŁA:)

Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.