Skocz do zawartości

[Sfera] Walidacja przy dodawaniu PW (może i innych dokumentów), od wersji 42, związana weryfikacji precyzji jednostki

Polecane posty

Może i będąc nonszalancki, ale też zakładając, że jak coś się dodaje do bazy danych, to sama zaokrągli, do tej pory, w sumie przez 6 lat, nie zaokrąglałem do precyzji jednostki asortymentu, podczas przekazania partii rozbicia, podczas tworzenia dokumentu PW. Okazuje się jednak, że od wersji 42, została na to nałożona weryfikacj:

Cytat

Ilość 24,4337 jest niezgodna z precyzją zdefiniowaną w jednostce miary. na polach: PozycjaDokumentu.Ilosc
Podanej ilości (24,4337 kg) nie można przeliczyć dokładnie na ilość w jednostce bazowej (magazynowej) - precyzja jednostki bazowej jest zbyt mała. Po przeliczeniu: 24,434 kg na polach: PozycjaDokumentu.Ilosc 

Zapewne wynika to z tej zmiany:

Cytat

W oknie dodawania pozycji do dokumentu zakupu, w sekcji rozbicia na partie wprowadzono liczne poprawki, m.in. w zakresie przeliczania jednostki miary oraz respektowania sposobu rozbicia pozycji na partie.

Post w sumie częściowo jako ostrzeżenie dla tworzących rozwiązanie własne, aby się potem nie nadziali po aktualizacji, bo wiem, że niektórzy mieli bardzo, bardzo dużo dokumentów.

A w drugiej części, z pytaniem, czy jest to rozwiązanie wprowadzone dla wszystkich dokumentów, czy tylko dokumentów przyjęcia?

Czy nie można Sfery aby zmusić, aby sama to zaokrąglała (to są często przypadki wynikające z obliczeń, bo matematyka to su...)?

Czy jednak w grę wchodzi pobieranie za każdym razem precyzji jednostki asortymentu i zaokrąglanie, tak w razie czego?

Post trochę na świeżo, bo przy prawie 3 tysiącach manipulacji Sferycznych na obiektach dziennie, w rozwiązaniu, którego to dotyczy, mam teraz co sprawdzać i analizować.

 

Link to postu

Jest to wycinek z całego rozwiązania, gdzie dane są przekazywane z JSON, do results:

      WriteLine("Dodawanie PW");
      IAsortymenty asortyment = sfera.PodajObiektTypu<IAsortymenty>();
      IJednostkiMiar jednostkiMiary = sfera.PodajObiektTypu<IJednostkiMiar>();
      IPodmioty podmioty = sfera.PodajObiektTypu<IPodmioty>();
      IUzytkownicy uzytkownicy = sfera.PodajObiektTypu<IUzytkownicy>();
      IStatusyDokumentowDaneDomyslne statusyDD = sfera.PodajObiektTypu<IStatusyDokumentow>().DaneDomyslne;
      Konfiguracja konfPw = sfera.PodajObiektTypu<IKonfiguracje>().DaneDomyslne.PrzychodWewnetrzny;
      int stock; stock = results.stock;
      Magazyn mag = sfera.PodajObiektTypu<IMagazyny>().Dane.Wszystkie().Where(m => m.Id == stock).FirstOrDefault();
      int spot; spot = results.spot;
      Oddzial odd = sfera.PodajObiektTypu<IOddzialy>().Dane.Wszystkie().Where(o => o.Id == spot).FirstOrDefault();
      IPrzychodyWewnetrzne dokumentyPrzyjecia = sfera.PodajObiektTypu<IPrzychodyWewnetrzne>();
      using (IPrzychodWewnetrzny pw = dokumentyPrzyjecia.Utworz(konfPw))
        {
        if (spot != 100000) pw.Dane.MiejsceWprowadzenia = odd;
        pw.Dane.Magazyn = mag;
        pw.Dane.Uwagi = results.comment;
        if (results.subtitle != "" && results.subtitle != null) pw.Dane.Podtytul = results.subtitle;
        var status = pw.Dane.StatusDokumentu;
        WriteLineInfo("Magazyn: ", pw.Dane.Magazyn.Nazwa);
        // dodawanie podmiotu
        if (results.buyer != null)
          {
          int buyer; buyer = results.buyer;
          var klient = podmioty.Dane.Wszystkie().Where(p => p.Id == buyer).FirstOrDefault();
          pw.Dane.Podmiot = klient;
          WriteLineInfo("Podmiot: ", pw.Dane.Podmiot.NazwaSkrocona);
          }
        // wypełnienie pozycji
        IDokumentZRozbiciem dok = (IDokumentZRozbiciem)pw;
        foreach (var posadd in results.pos)
          {
          int posid; decimal posp; string comment;
          posid = posadd.id; posp = posadd.price; comment = posadd.comment;
          pw.Dane.StatusDokumentu = statusyDD.Przychod_Odlozony;
          Asortyment a = asortyment.Dane.Wszystkie().Where(t => t.Id == posid).First();
          WriteLineInfo("Asortyment: ", a.Nazwa);
          var poz = pw.Pozycje.Dodaj(a, 1, a.JednostkaSprzedazy);
          poz.Cena.NettoPrzedRabatem = posp;
          poz.Cena.RabatWartosc = 0m;
          poz.Ilosc = 0m;
          poz.Opis = comment;
          pw.Dane.StatusDokumentu = status;
          var r = dok.RozpocznijRozbicie(poz) as IRozbiciePozycjiPrzyjeciowe;
          // obsługa partii 
          WriteLineInfo("Dodawanie partii:","");
          int batches = 1;
          foreach (var posbatch in posadd.batches)
            {
            decimal batchquantity; string batchname; string batchhash;
            batchquantity = posbatch.quantity; batchname = posbatch.batch; batchhash = posbatch.hash;
            IPozycjaRozbiciaPrzyjeciowa pr = r.DodajPozycje();
            pr.Ilosc = batchquantity;
            pr.KodDostawy = batchname;
            pr.OpisDostawy = batchhash;
            WriteLineInfo("Numer: ", pr.KodDostawy);
            WriteLineInfo("Ilość: ", ""+ pr.Ilosc);
            batches++;
            }
          r.ZakonczRozbicie();
          pw.Przelicz();
          }
        // osoba wystawiająca                   
        string sign = results.sign;
        pw.Dane.WystawilaOsoba = uzytkownicy.Dane.Wszystkie().Where(p => p.Sygnatura == sign).FirstOrDefault().Osoba;
        WriteLineInfo("Wystawił: ", pw.Dane.Wystawil);
        // ustawienie daty
        if (results.date != null)
          {
          string dateString = results.date + " 07:00:00,000";
          DateTime pwDate = DateTime.ParseExact(dateString, "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
          pw.Dane.DataWydaniaWystawienia = pwDate;
          pw.Dane.DataWprowadzenia = pwDate;
          WriteLineInfo("Data wprowadzenia: ", ""+ pw.Dane.DataWprowadzenia);
          }
        // zapisywanie  
        if (pw.Zapisz()) { WriteLine("Dodano PW: " + pw.Dane.NumerWewnetrzny.PelnaSygnatura, ConsoleColor.White, ConsoleColor.Blue); response = JsonConvert.SerializeObject(new { id = pw.Dane.Id, number = pw.Dane.NumerWewnetrzny.PelnaSygnatura }, Formatting.None); }
        else { Globals.errors = ""; pw.WypiszBledy(); WriteLine("Błąd podczas dodawania PW: " + Globals.errors, ConsoleColor.White, ConsoleColor.Red); response = JsonConvert.SerializeObject(new { error = Globals.errors }, Formatting.None); }
        }

A poniżej przekazane dane JSON:

{
   "function":"addPWprod",
   "spot":100000,
   "stock":100000,
   "comment":"ZLECENIE CI\u0118CIA - B42965\nRozch\u00f3d materia\u0142u: RW 22110265\/LCI",
   "date":"2022-11-14",
   "sign":"MPO",
   "pos":[
      {
         "pos":"208124",
         "id":"166612",
         "price":337.712498,
         "batches":[
            {
               "batch":"B42965, 2ACM",
               "good":"166612",
               "hash":"6371e34ed85bd",
               "field":"2575",
               "quantity":1,
               "desc":"",
            }
         ],
         "comment":"Pracownik - 14.11.2022 07:41:52"
      },
      {
         "pos":"56686",
         "id":"216507",
         "price":6.65,
         "batches":[
            {
               "batch":"B42965, 2ACM",
               "good":"216507",
               "hash":"6371e34f0d5d4",
               "field":"2575",
               "quantity":6,
               "desc":"",
            }
         ],
         "comment":"Pracownik - 14.11.2022 07:41:52"
      },
      {
         "pos":999999,
         "id":"113083",
         "price":7.071899999999999,
         "batches":[
            {
               "batch":"B42965",
               "good":"113083",
               "hash":"6371e34f69f1e",
               "field":"1224",
               "quantity":2.6572,
               "desc":""
            }
         ],
         "comment":"Z\u0142om kawa\u0142kowy, Pracownik - 14.11.2022 07:42:23"
      }
   ]
}

Problem dotyczy ostatniej pozycji, w której przekazuje efekt obliczeń po mojej stronie, dlatego wiele miejsc po przecinku, co już zniwelowałem.

No i komunikat błędu dla tego przypadku:

Cytat
Ilość 2,6572 jest niezgodna z precyzją zdefiniowaną w jednostce miary. na polach: PozycjaDokumentu.Ilosc
Podanej ilości (2,6572 kg) nie można przeliczyć dokładnie na ilość w jednostce bazowej (magazynowej) - precyzja jednostki bazowej jest zbyt mała. Po przeliczeniu: 2,657 kg na polach: PozycjaDokumentu.Ilosc

Ja nie mam zastrzeżeń do tego, że takową walidację wprowadziliście, aczkolwiek, szkoda, że nie ucina już Sferycznie, jak to robiło do tej pory.

  • Lubię to 2
Link to postu

Tak naprawdę zaokrąglanie cały czas się odbywa – problem polega na tym, że podpinany błąd precyzji patrzy na ilość jeszcze sprzed zaokrąglenia ilości w partii.
Dotyczy to nie tylko PW, a wszystkich dokumentów implementujących interfejs IDokumentZeSpecyfikacjami.

Zapisaliśmy to do poprawy – przewidywalnie do wersji 45.

Na teraz obejściem problemu jest, po przeliczeniu dokumentu, ustawienie ilości pozycji na samą siebie, aby zabrać błąd z pola:

poz.Ilosc = poz.Ilosc;
Edytowane przez Przemysław Czerwiński
  • Dziękuję 1
Link to postu
12 minut temu, Przemysław Czerwiński napisał:

Na teraz obejściem problemu jest, po przeliczeniu dokumentu, ustawienie ilości pozycji na samą siebie, aby zabrać błąd z pola

No takiego rozwiązania się nie spodziewałem. Dziękuje za informacje!

Link to postu
×
×
  • Dodaj nową pozycję...