Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Gość Wedge96PL

VARCHAR I DECIMAL a przecinki

Rekomendowane odpowiedzi

Gość Wedge96PL

Cześć, używam kodu na wysyłkę mail w tym informującą o kwocie pobrania. Działa jeśli kwota jest bez przecinka, nie działa jeśli pojawia się przecinek wywalając komunikat:

"Conversion failed when converting the varchar value '5129.53' to data type int."

 

5129.53 to kwota pobrania. W polu edytowalnym podczas tworzenia etykiety kwota pojawia się dzieląc się przecinkiem.

 

Tutaj kod:

 

ALTER PROCEDURE [YShipping].[WysylkaEmailParametry]
   @wysylkaId INT
AS
BEGIN
   SELECT

   SUBSTRING(
   (
       SELECT
       ', '+NumerPrzewozowy
       FROM YShipping.WysylkaPaczki Wp
       WHERE WP.WysylkaId=@wysylkaId
       FOR XML PATH ('')
   ), 3, 1000) [nrprzesylki]
   ,Szczegoly.value('(WysylkaRequest/Zawartosc)[1]','varchar(400)') [nrdokumentu]
   ,Spedytor [spedytor]
   ,CASE WHEN Szczegoly.value('(WysylkaRequest/KwotaPobrania)[1]','varchar(400)') IS NOT NULL AND Szczegoly.value('(WysylkaRequest/KwotaPobrania)[1]','varchar(400)') <>0
   THEN 'Kwota pobrania: ' + CAST(CAST(Szczegoly.value('(WysylkaRequest/KwotaPobrania)[1]','varchar(400)') AS DECIMAL(14, 2)) AS varchar)
   ELSE ''
   END [KwotaPobrania]
   ,CASE WHEN Spedytor LIKE 'GLS' THEN SUBSTRING(
   (
       SELECT
      ', '+'https://gls-group.eu/PL/pl/sledzenie-paczek?match=5'+NumerPrzewozowy
       FROM YShipping.WysylkaPaczki Wp
       WHERE WP.WysylkaId=@wysylkaId
       FOR XML PATH ('')
   ), 3, 1000)
   WHEN Spedytor LIKE 'PocztaPolska' THEN     SUBSTRING(
   (
       SELECT
       ', '+'https://emonitoring.poczta-polska.pl/?numer='+NumerPrzewozowy
       FROM YShipping.WysylkaPaczki Wp
       WHERE WP.WysylkaId=@wysylkaId
       FOR XML PATH ('')
   ), 3, 1000)
   END [link]

   FROM YShipping.Wysylka W
   WHERE W.Id=@wysylkaId
END

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na pewno w tej procedurze się wykłada? Raczej tam, gdzie używasz [KwotaPobrania]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość Wedge96PL

Na pewno w tej procedurze się wykłada? Raczej tam, gdzie używasz [KwotaPobrania]

 

Tak, nie mam w ogóle dostępu do procedury [KwotaPobrania]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość Wedge96PL

a nie chodzi po prostu o locale? przecinek a kropka to inna notacja liczb...

 

Jeśli dobrze zrozumiałem to chodzi Ci o zamianę przecinków na kropki? W takim wypadku wywala kolejny błąd: " Incorrect syntax near 'varchar(400)'.

"

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

konkretnie jak to napisałeś?

coś w stylu

 

REPLACE(Szczegoly.value('(WysylkaRequest/KwotaPobrania)[1]','varchar(400)'), ',', '.')

 

nie mówie, że to ma być dokładnie tak bo piszę z głowy :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość Wedge96PL

konkretnie jak to napisałeś?

coś w stylu

 

REPLACE(Szczegoly.value('(WysylkaRequest/KwotaPobrania)[1]','varchar(400)'), ',', '.')

 

nie mówie, że to ma być dokładnie tak bo piszę z głowy :E

 

Nie, po prostu pozmieniałem przecinki na kropki, nie bardzo ogarniam SQL :/ Mógłbyś mi napisać ten kod tak jak powinien wyglądać aby uniknąć ten błąd?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W tym zapytaniu są 2 problemy. Błąd który dostajesz leci z tego kawałka:

Szczegoly.value('(WysylkaRequest/KwotaPobrania)[1]','varchar(400)') <>0

Tu jest porównywany typ tekstowy z numerycznym (0 jest intem). W takim przypadku zachodzi niejawna konwersja tekstu na liczbę i się wywala na przecinku. Jeżeli wiesz, że będzie tam 0 i zawsze 0, a nie np. 0.00 albo pusta wartość to możesz zrobić <> '0' i załatwi to problem.

 

Druga sprawa to przecinek przy zamienianiu tekstu na Decimal. W SQL jak właściwie prawie wszystkich językach komputerowych standardem jest kropka, więc musisz wewnątrz casta zrobić jeszcze replace , na .

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość Wedge96PL

W tym zapytaniu są 2 problemy. Błąd który dostajesz leci z tego kawałka:

Szczegoly.value('(WysylkaRequest/KwotaPobrania)[1]','varchar(400)') <>0

Tu jest porównywany typ tekstowy z numerycznym (0 jest intem). W takim przypadku zachodzi niejawna konwersja tekstu na liczbę i się wywala na przecinku. Jeżeli wiesz, że będzie tam 0 i zawsze 0, a nie np. 0.00 albo pusta wartość to możesz zrobić <> '0' i załatwi to problem.

 

Druga sprawa to przecinek przy zamienianiu tekstu na Decimal. W SQL jak właściwie prawie wszystkich językach komputerowych standardem jest kropka, więc musisz wewnątrz casta zrobić jeszcze replace , na .

 

Ok, mógłbym poprosić Cię o zmianę w kodzie i wklejenie go tutaj? Coś robię nadal źle.

 

EDIT: Ok udało się, jednak wszystko hula bez Decimala i tak.

Dzięki za pomoc :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...