Autor Wątek: Błąd - Arithmetic overflow error converting expression to data type money  (Przeczytany 1247 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline Tomcies

  • Nowy użytkownik
  • *
  • Wiadomości: 3
  • Reputacja +0/-0
  • Wersja programu: 1.79 HF4
Szukam rozwiązania problemu.
Jest instancja subiekta i również jest instancja kolektorów do niego. Używamy kolektorów do wpisywania zamówień. Wszystko działa sprawnie do momentu kiedy przy tworzeniu zamówienia przez kolektor i zczytaniu kodu kreskowego przypadkiem w miejsce ilości danego towaru zczyta się kod kreskowy (długi ciąg liczb). Zamówienie wysłane do subiekta i następuje problem, ponieważ przy wejściu w "zamówienia od dostawców" program się wysypuje.
Z tego co udało mi się ustalić przez SQL Server Profiler, to przy takim zapytaniu wywala błąd:

Cytuj
SELECT TOP(1)  NULL AS Dok_dok_Id, NULL AS Dok_statusreal, NULL AS Dok_dok_DataWyst, NULL AS Dok_dok_Typ, NULL AS Dok_dok_Podtyp, NULL AS Dok_dok_NrPelny, NULL AS Adres_adrh_Nazwa, IsNull(SUM(Dok.dok_KwWartosc),CONVERT(money,0)) AS SUMOF_Dok_dok_KwWartosc, IsNull(SUM(Dok.zre_KwWartosc),CONVERT(money,0)) AS SUMOF_Dok_zre_KwWartosc, NULL AS Dok_dok_TerminRealizacji, NULL AS Dok_pow_DataWyst, NULL AS Dok_dok_Uwagi, NULL AS Dok_dok_RodzajOperacjiVat, NULL AS Dok_dok_Tytul, NULL AS Dok_dok_Podtytul, NULL AS Flagi_flg_Numer, NULL AS FlagiWartosci_flw_CzasOstatniejZmiany, NULL AS FlagaUzytk_uz_Identyfikator, NULL AS Dok_dok_DefiniowalnyId, NULL AS FlagiWartosci_flw_Komentarz, NULL AS FlagiWartosci_flw_IdFlagi, NULL AS Flagi_flg_Text, NULL AS Flagi_flg_Id FROM vwDok4ZamGrid AS Dok LEFT JOIN adr_Historia AS Adres ON Dok.dok_OdbiorcaAdreshId=Adres.adrh_Id LEFT JOIN sl_Kategoria AS kat ON Dok.dok_KatId=kat.kat_Id LEFT JOIN fl_Wartosc AS FlagiWartosci ON Dok.dok_Id=FlagiWartosci.flw_IdObiektu AND flw_IdGrupyFlag = 9 LEFT JOIN pd_Uzytkownik AS FlagaUzytk ON FlagiWartosci.flw_IdUzytkownika=FlagaUzytk.uz_Id LEFT JOIN fl__Flagi AS Flagi ON FlagiWartosci.flw_IdFlagi=Flagi.flg_Id LEFT JOIN dok_StatusWydruku AS StatusWydruku ON Dok.dok_Id=StatusWydruku.dsw_IdDokumentu WHERE Dok.dok_Typ = 15 AND Dok.dok_MagId = 1 and Dok.dok_DataWyst>= '20240308' AND '20240308' >= Dok.dok_DataWyst

Taki oto błąd w Microsoft SQL Server Management Studio:

Cytuj
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type money

Wiem, że to jest jakiś błąd spowodowany tym, że program od kolektorów wrzuca niemożliwą do przeliczenia przez SQL wartość, natomiast chciałbym tego uniknąć w przyszłości bo obecnie jednyną opcją dla mnie jest przywrócenie kopii bazy z poprzedniego dnia.


Offline yemet

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 1250
  • Reputacja +46/-1
  • Wersja programu: Navireo
Odp: Błąd - Arithmetic overflow error converting expression to data type money
« Odpowiedź #1 dnia: Marzec 08, 2024, 20:06:20 »
Ale to Subiekt ci się wywala czy aplikacja na kolektory? Nie prościej zamiast przywracać kopię bazy poprawić to pechowe zamówienie?

Skoro potrafisz skorzystać z Profilera to zakładam (może błędnie), że coś o pisaniu zapytań też wiesz. Namierzenie dokumentu z pozycją z kosmicznymi ilościami nie powinno stanowić żadnego wyzwania.

Offline candy

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4876
  • Reputacja +172/-11
Błąd - Arithmetic overflow error converting expression to data type money
« Odpowiedź #2 dnia: Marzec 08, 2024, 20:14:55 »
A my na pewno mówimy o kolektorze danych, a nie o czytniku kodów kreskowych?
Nie pytaj co rząd może zrobić dla Ciebie. Spytaj czy mógłby tego nie robić.

Offline Tomcies

  • Nowy użytkownik
  • *
  • Wiadomości: 3
  • Reputacja +0/-0
  • Wersja programu: 1.79 HF4
Błąd - Arithmetic overflow error converting expression to data type money
« Odpowiedź #3 dnia: Marzec 09, 2024, 10:59:02 »
Wywala się subiekt. Kolektory działają tak, że za każdym razem to co jest do nich zaczytywane to tworzą nowy dokument w subiekcie i nie da się tego edytować z ich poziomu(tak to są czytniki kodów na Windows CE z aplikacją do tworzenia zamówień łączącą się do kolektora)(myślę że w tym roku będą zmieniane na nowsze).
Na razie przywróciłem bazę z dnia wcześniejszego i wszystkie dane z 08.03 udało mi się przenieść pomiędzy podmiotami oprócz tych felernych zamówień. Program na kolektorze (czytniku) pozwala dodać ilość towaru do zamówienia tak długą jak kod kreskowy i jeśli ktoś nie zwróci na to uwagi i kliknie "wyślij" to takie zamówienie wysypuje program (dokładnie to wysypuje jedynie jak się będzie chciało wejść w zakładkę zamówienia bo wszystko inne działa dobrze).
Producent programu do kolektorów zna problem i na razie muszę sam z tym działać. Niestety jestem dopiero na początku drogi z SQL dlatego na forum napisałem bo nie wiem jak usunąć ten felerny wpis. Profiler pokazał mi zapytanie które wyłącza program, później uruchomiłem zapytanie w bazie i dało mi błąd, ale niestety nie wiem jak zmodyfikować to zapytanie aby usunąć wpis. Bazę mam skopiowaną, więc mogę się bawić. Prosiłbym tylko o jakąś wskazówkę. Wiem że osoba, która robi te zamówienia może znowu popełnić ten błąd a łatwiej mi będzie skasować wpis niż bawić się w przenoszenie danych z całego dnia.
Pozdrawiam.

Wysłane z mojego ONEPLUS A6003 przy użyciu Tapatalka


Offline yemet

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 1250
  • Reputacja +46/-1
  • Wersja programu: Navireo
Odp: Błąd - Arithmetic overflow error converting expression to data type money
« Odpowiedź #4 dnia: Marzec 09, 2024, 16:06:33 »
Na razie przywróciłem bazę z dnia wcześniejszego i wszystkie dane z 08.03 udało mi się przenieść pomiędzy podmiotami oprócz tych felernych zamówień.

Co i jak przenosiłeś?

Program na kolektorze (czytniku) pozwala dodać ilość towaru do zamówienia tak długą jak kod kreskowy
Przerabiałem u siebie podobny błąd na przygotowaniu zamówień do wysyłki. Userzy wbijali kody kreskowe do ilości i wagi paczki :)


Zamówienia ani samej pozycji to bym nie kasował, tylko poprawił ilość i wartość na skopanych pozycjach.

Wrzuć do SSMS takie zapytanie
select
dd.dok_NrPelny
,dd.dok_Id
,dd.dok_DataWyst
,dd.dok_WartNetto
,dd.dok_WartBrutto
,dd.dok_WartMag
,dp.ob_Id
,dp.ob_TowId
,dp.ob_IloscMag
,dp.ob_Ilosc
,dp.ob_Jm
,dp.ob_WartNetto
,dp.ob_WartBrutto
,dp.ob_WartMag
,tt.tw_Nazwa from dok__Dokument dd
join dok_Pozycja dp on dd.dok_Typ=15 and dd.dok_MagId=1 and dd.dok_Id=dp.ob_DokHanId
join tw__Towar tt on dp.ob_TowId=tt.tw_id
where dd.dok_DataWyst between
/*data OD*/ '20240301' and /*data DO*/ '20240309'
and dp.ob_IloscMag > /*powyżej ilu sztuk szukamy*/ 1000000

W zapytaniu dodałem komentarze przy filtrze dat i ilości żebyś mógł tym sobie posterować.

Jak masz kopię bazy to zrób sobie jeszcze jedną kopię żeby szło ją przywrócić jak coś pójdzie nie tak.
Jak pisałem wyżej - ja bym spróbował poprawić ilości i wartości na pechowych zamówieniach niż wywalał rekordy. Zapytanie powinno pozwolić ci namierzyć pechowe pozycje. Poprawy na pojedynczych rekordach i ogólne przeglądanie danych najwygodniej mi się robi w programie dbeaver.

Jak chcesz to wrzuć wyniki na forum, może będę miał czas żeby coś dalej pomóc.

PS. Najszybciej to by ogarnął serwisant. Nie macie takowego?

Offline Tomcies

  • Nowy użytkownik
  • *
  • Wiadomości: 3
  • Reputacja +0/-0
  • Wersja programu: 1.79 HF4
Błąd - Arithmetic overflow error converting expression to data type money
« Odpowiedź #5 dnia: Marzec 11, 2024, 08:16:58 »
Dzięki za pomoc. Udało mi się rozprawić z tym.
Tak naprawdę subiekta wysypywało zapytanie o Dom.dok_KwWartosc.
Dodałem do zapytania powyżej dd.dok_KwWartosc, zmieniłem datę na "od 2000 roku" i wypluło 147 takich zamówień (wcześniej radziliśmy sobie zakresami dat w subiekcie żeby nie wyrzucało). DBeaver jest super narzędziem, zaznaczyłem sobie tą wartość dla tych zepsutych dokumentów i zmieniłem wartość na 1. Teraz tylko wystarczyło wejść w subiekta i edytować w dokumencie ilość danego towaru i zapisać żeby poprawnie było policzone.
Dziękuję jeszcze raz za pomoc.

Wysłane z mojego ONEPLUS A6003 przy użyciu Tapatalka


Offline yemet

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 1250
  • Reputacja +46/-1
  • Wersja programu: Navireo
Odp: Błąd - Arithmetic overflow error converting expression to data type money
« Odpowiedź #6 dnia: Marzec 11, 2024, 14:22:40 »
Chciałem tylko na koniec zwrócić uwagę, że jeden zły ruch i można sobie sporą krzywdę zrobić dłubiąc ręcznie bazie. Przy dokumentach ZD na szczęście nie ma rozrachunków ani ruchu magazynowego ale na pewno dałoby się niejedną rzecz przy nich popsuć.

Forum Użytkownikow Subiekt GT

Odp: Błąd - Arithmetic overflow error converting expression to data type money
« Odpowiedź #6 dnia: Marzec 11, 2024, 14:22:40 »