Radomił Ząbik 310 Napisano 18 Października 2018 Udostępnij Napisano 18 Października 2018 w [Sfera] Realizacja ZK w WZ, a magazyny ZK i jej pozycji Podczas realizacji ZK w WZ, za pomocą mojego rozwiązania sferycznego (znany wam już kod, poniżej), natrafiłem na problem - albo powinienem coś zmodyfikować w Swoim kodzie, albo jest pewnego rodzaju błąd po stronie Sfery. Otóż, naszemu działowi handlowemu, zdarza się raz na jakiś czas popełni ZK, które spełnia następujące warunki: - jest tam wiele pozycji, w przypadku, w którym to wykrywałem, było 7 - magazyn na pozycjach jest inny niż magazyn na ZK, na co zresztą sam Subiekt zwraca uwagę ostrzeżeniem W przypadku, gdy ja realizuję takie ZK, przesyłam dane do WZ z wskazanymi ilościami partii dla każdej pozycji, na pierwszy rzut oka, wszystko wygląda ok i to co przesłałem, zwraca mi się prawidłowo, w pętli weryfikującej ustawienie ilości, na partiach rozbicia danej pozycji. Gdzieś po tym, następuje coś po stronie Sfery, co powoduje wyczyszczenie zasugerowanego przez mnie rozbicia i wprowadzenia rozbicia po FIFO, tak jakby na chwilę zmieniła magazyn na ten z dokumentu, potem wróciła do tego co był nie wiem. Ten problem nie występuję w Subiekcie lub jeśli realizuję tylko jedną pozycję. // przygotowanie danych IAsortymenty asortyment = sfera.PodajObiektTypu<IAsortymenty>(); IPodmioty podmioty = sfera.PodajObiektTypu<IPodmioty>(); IUzytkownicy uzytkownicy = sfera.PodajObiektTypu<IUzytkownicy>(); IStatusyDokumentowDaneDomyslne statusyDD = sfera.PodajObiektTypu<IStatusyDokumentow>().DaneDomyslne; Konfiguracja konfWz = sfera.PodajObiektTypu<IKonfiguracje>().DaneDomyslne.WydanieZewnetrzne; string stock; stock = results.stock; Magazyn mag = sfera.PodajObiektTypu<IMagazyny>().Dane.Wszystkie().Where(m => m.Symbol == stock).FirstOrDefault(); IWydaniaZewnetrzne dokumentWydania = sfera.PodajObiektTypu<IWydaniaZewnetrzne>(); IZamowieniaOdKlientow zamowienia = sfera.PodajObiektTypu<IZamowieniaOdKlientow>(); // pobranie danych jakiegokolwiek ZK, aby ustawić parametry int docid; docid = results.docid; var zk = zamowienia.Dane.Wszystkie().Where(p => p.Id == docid).FirstOrDefault(); // znalezienie zamówienia using (IWydanieZewnetrzne wz = dokumentWydania.Utworz(konfWz)) { // przeniesienie parametrów z ZK ParametryGrupowaniaPodstawowe parametryGrupowania = new ParametryGrupowaniaPodstawowe(); parametryGrupowania.MetodaGrupowaniaPozycji = MetodaGrupowaniaPozycji.BezKonsolidacji; parametryGrupowania.MetodaWyliczeniaCen = MetodaWyliczeniaCen.PrzepisanieZDokumentuGlownego; parametryGrupowania.MiejsceDostawy = zk.MiejsceDostawy; parametryGrupowania.MiejsceDostawyTyp = MiejsceDostawyTyp.Nabywca; parametryGrupowania.NabywcaSprzedawca = zk.NabywcaSprzedawcaWybrany; IAplikatorSkutkowMagazynowych aplikatorSM = (IAplikatorSkutkowMagazynowych)wz; wz.Dane.Magazyn = mag; wz.Dane.Uwagi = results.comment; wz.Dane.StatusDokumentu = statusyDD.Rozchod_WydanyTowar; IDokumentZRozbiciem dok = (IDokumentZRozbiciem)wz; // wypełnienie pozycji na podstawie ZK foreach(var posadd in results.pos) { int posdocid; int posid; decimal posq; int posbatch; string comment; posdocid = posadd.docid; posid = posadd.id; posq = posadd.quantity; posbatch = posadd.batch; comment = posadd.comment; //Console.WriteLine("Pobieranie pozycji: "+posid+" z ZK "+posdocid); var zamowienie = zamowienia.Dane.Wszystkie().Where(p => p.Id == posdocid).FirstOrDefault(); // znalezienie zamówienia var poz = wz.WypelnijNaPodstawieZK(zamowienie.Pozycje.Where(p => p.Id == posid),zamowienie,parametryGrupowania).Single(); // dodanie pozycji z ZK Console.WriteLine("Dodanie pozycji: "+posid+", "+poz.AsortymentAktualny.Nazwa); poz.Opis = comment; poz.CenaRecznieEdytowana = true; if(posadd.batch!=null) { poz.Ilosc = 0; // ustawiamy na 0, wyjdzie z rozbicia aplikatorSM.AplikujSkutkiMagazynowe(poz); // poprawka od Insertu na poprawne działanie skutku magazynu var r = dok.RozpocznijRozbicie(poz) as IRozbiciePozycjiRozchodowe; Console.WriteLine("Wprowadzenie partii: "+posbatch+" w ilości "+posq); r.Pozycje.Where(p => p.PartiaZrodlowa.Id == posbatch).Single().Ilosc = posq; foreach(var pozr in r.Pozycje.Where(p => p.PartiaZrodlowa.Id != posbatch && p.Ilosc > 0m)) { pozr.Ilosc = 0m; } foreach(var pozr in r.Pozycje.Where(p => p.PartiaZrodlowa.Id != 0 )) { Console.WriteLine("Wybrane partie: "+pozr.PartiaZrodlowa.Id+" = "+pozr.Ilosc); } r.ZakonczRozbicie(); aplikatorSM.AplikujSkutkiMagazynowe(poz); // ponowna poprawka na poprawne rozbicie } else { poz.Ilosc = posq; // ustawiamy na 0, wyjdzie z rozbicia aplikatorSM.AplikujSkutkiMagazynowe(poz); } //Console.WriteLine("Ilość na pozycji: " + poz.Ilosc); //wz.Przelicz(); } // wypełnienie pozycji na podstawie asortymentu foreach(var posadd in results.posextra) { int posid; decimal posq; posid = posadd.id; posq = posadd.quantity; Asortyment a = asortyment.Dane.Wszystkie().Where(t => t.Id == posid).First(); var poz = wz.Pozycje.Dodaj(a,posq, a.JednostkaSprzedazy); Console.WriteLine("Dodanie pozycji dodatkowej: "+poz.AsortymentAktualny.Nazwa); // jeśli jest opis pozycji if(posadd.desc!=null && posadd.desc!="") { string posd; posd = posadd.desc; poz.Opis = posd; } // jeśli jest cena pozycji if(posadd.price!=null) { decimal posp; posp = posadd.price; poz.Cena.NettoPoRabacie = posp; } wz.Przelicz(); } // poprawka na nabywcę if(wz.Dane.NabywcaSprzedawca==null) { wz.Dane.NabywcaSprzedawca = wz.Dane.Podmiot; wz.Dane.RolaInnegoPodmiotu = (byte)RolaInnegoPodmiotu.InnyNabywca; } // ustawienie daty if(results.date!=null && results.date!="") { string dateString = results.date+" 07:00:00,000"; DateTime wzDate = DateTime.ParseExact(dateString,"yyyy-MM-dd HH:mm:ss,fff",System.Globalization.CultureInfo.InvariantCulture); wz.Dane.DataWydaniaWystawienia = wzDate; wz.Dane.DataWprowadzenia = wzDate; Console.WriteLine("Data wystawienia: " + wzDate); } // dopisanie transportu, jeśli jest - DO USUNIĘCIA!!!! decimal transport; transport = results.transport; if(transport!=0) { Asortyment a = asortyment.Dane.Wszystkie().Where(t => t.Symbol == "U Transport").First(); var poz = wz.Pozycje.Dodaj(a, 1m, a.JednostkaSprzedazy); poz.Cena.NettoPoRabacie = transport; } // osoba wystawiająca string sign = results.sign; wz.Dane.WystawilaOsoba = uzytkownicy.Dane.Wszystkie().Where(p => p.Sygnatura == sign).FirstOrDefault().Osoba; Link to postu
Mateusz Matuszewski 92 Napisano 19 Października 2018 Udostępnij Napisano 19 Października 2018 w [Sfera] Realizacja ZK w WZ, a magazyny ZK i jej pozycji Problemem jest wielokrotne wywoływanie metody WypelnijNaPodstawieZK, ponieważ za każdym wypełnia ona WZ "od nowa", czyli między innymi ponownie ustawia magazyn (pobrany z dodawanej pozycji). Metoda powinna być wywoływana tylko raz, a pozycje można później odnaleźć np. przez realizacje: IDokumentZRozbiciem dok = (IDokumentZRozbiciem)wz; var zamowienie = zamowienia.Dane.Wszystkie().Where(p => p.Id == results.docid).FirstOrDefault(); // znalezienie zamówienia var pozycje = wz.WypelnijNaPodstawieZK(zamowienie.Pozycje, zamowienie, parametryGrupowania); // dodanie pozycji z ZK // wypełnienie pozycji na podstawie ZK foreach (var posadd in results.pos) { int posdocid; int posid; decimal posq; int posbatch; string comment; posdocid = posadd.docid; posid = posadd.id; posq = posadd.quantity; posbatch = posadd.batch; comment = posadd.comment; //Console.WriteLine("Pobieranie pozycji: "+posid+" z ZK "+posdocid); var poz = pozycje.Single(p => p.ZnajdzPozycjeRealizowane(TypDokumentu.ZamowienieOdKlienta).Any(pr => pr.Id == posid)); Console.WriteLine("Dodanie pozycji: " + posid + ", " + poz.AsortymentAktualny.Nazwa); Link to postu
Radomił Ząbik 310 Napisano 19 Października 2018 Autor Udostępnij Napisano 19 Października 2018 w [Sfera] Realizacja ZK w WZ, a magazyny ZK i jej pozycji Jest wywoływana wielokrotnie, gdyż pozycje mogą pochodzi z różnych zamówień - łączona wysyłka, dla zmniejszenia ilości dokumentów końcowych. Jedno ZK jest wczytywane bezpośrednio tylko po to aby ustawić główne parametry. Póki co, problem zniwelowałem na poziomie rozwiązania zewnętrznego, poprzez blokadę realizacji z odpowiednim komunikatem, więc docelowo, może się udać zniwelować błędne wystawienie po stronie handlowca i ZK. A gdybym poprawiał ten magazyn gdzieś po drodze? Link to postu
Mateusz Matuszewski 92 Napisano 19 Października 2018 Udostępnij Napisano 19 Października 2018 w [Sfera] Realizacja ZK w WZ, a magazyny ZK i jej pozycji Przekazywane w parametrze pozycje mogą pochodzić z różnych zamówień. var pozycjeId = results.pos.Select(pd => pd.id).ToList(); var pozycjeZK = zamowienia.Dane.Wszystkie().SelectMany(p => p.Pozycje).Where(p => pozycjeId.Contains(p.Id)).ToList(); var pozycje = wz.WypelnijNaPodstawieZK(pozycjeZK, zk, parametryGrupowania); // dodanie pozycji z ZK Jeśli jednak woli Pan dodawać pozycje pojedynczo, to można spróbować najpierw dodać wszystkie, a później dopiero je rozbić. 1 Link to postu
Radomił Ząbik 310 Napisano 19 Października 2018 Autor Udostępnij Napisano 19 Października 2018 w [Sfera] Realizacja ZK w WZ, a magazyny ZK i jej pozycji Dziękuje i witam na forum Link to postu
Polecane posty