Skocz do zawartości

Radomił Ząbik

Użytkownik
  • Liczba zawartości

    2 022
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    38

Ostatnia wygrana Radomił Ząbik w dniu 1 Listopada 2021

Użytkownicy przyznają Radomił Ząbik punkty reputacji!

Ostatnie wizyty

3 710 wyświetleń profilu

Radomił Ząbik's Achievements

185

Reputacja

  1. No dobra, to zobaczymy, czy dobrze załapałem sugestie using(ICennik dodatkowyBo = cenniki.Znajdz(dodatkowy)) foreach (Cennik dodatkowy in usluga.Dane.PozycjeCennika.Select(p => p.Cennik).Distinct().Where(c => c.Bazowy == false)) ICennikPozycje pozycjeCennika = dodatkowyBo.Pozycje; var uslugaDoUsuniecia = asortymenty.Dane.Wszystkie().Where(a => a.Id == usluga.Dane.Id).FirstOrDefault(); foreach(var pozycja in pozycjeCennika.ZnajdzPozycjeCennika(uslugaDoUsuniecia)) dodatkowyBo.Pozycje.Usun(pozycja); Swoją drogą, szkoda, że WypelnijNaPodstawie dla asortymentu, nie może pominąć kopiowania cenników, bo usuwanie tych pozycji z cennika trwa bardzo długo. Dlatego też w ostatecznej wersji Swojego kodu, pominąłem cenniki, które są zamknięte - ryzyko ponownego otwarcia w mojej organizacji jest znikome, więc można zaryzykować. Ostatecznie, kod wygląda tak - jest ok (to wtedy wrzucę nową wersję do tamtego postu, może komuś pomoże). foreach (Cennik dodatkowy in usluga.Dane.PozycjeCennika.Select(p => p.Cennik).Distinct().Where(c => c.Bazowy == false && c.Status != 2)) { using(ICennik dodatkowyBo = cenniki.Znajdz(dodatkowy)) { Console.WriteLine("Cennik: "+dodatkowyBo.Dane.Tytul); ICennikPozycje pozycjeCennika = dodatkowyBo.Pozycje; var uslugaDoUsuniecia = asortymenty.Dane.Wszystkie().Where(a => a.Id == usluga.Dane.Id).FirstOrDefault(); foreach(var pozycja in pozycjeCennika.ZnajdzPozycjeCennika(uslugaDoUsuniecia)) { Console.WriteLine("Usuwanie pozycji: "+pozycja.Id+"/"+pozycja.CenaBazowa); dodatkowyBo.Pozycje.Usun(pozycja); } if(!dodatkowyBo.Zapisz()) dodatkowyBo.WypiszBledy(); } }
  2. Mam w rozwiązaniu sferycznym jedną funkcję, która tworzy dodatkowy asortyment, a właściwie usługę, na podstawie innego asortymentu. Częścią tego procesu, jest usunięcie zbędnych informacji związanych z asortymentem, między innymi wywalenie go z cenników dodatkowych, jeśli się znajduje. Robię to takim kodem: foreach (Cennik dodatkowy in usluga.Dane.PozycjeCennika.Select(p => p.Cennik).Distinct()) { ICennik dodatkowyBo = cenniki.Znajdz(dodatkowy); foreach (IUproszczonaPozycjaCennika uprPozCen in dodatkowyBo.Pozycje.Wszystkie.Where(p => p.IdAsortymentu == usluga.Dane.Id)) dodatkowyBo.Pozycje.Usun(uprPozCen); if(!dodatkowyBo.Zapisz()) dodatkowyBo.WypiszBledy(); } Dzisiaj, dostałem taki oto błąd: System.OutOfMemoryException: Zgłoszono wyjątek typu 'System.OutOfMemoryException'. w lambda_method(Closure , Shaper ) w System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) w System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() w System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() w System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) w System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) w InsERT.Moria.CennikiICeny.KoordynatorUproszczonychPozycjiCennika.UtworzUproszczonePozycjeInternal(IQueryable`1 query) w InsERT.Moria.CennikiICeny.KoordynatorUproszczonychPozycjiCennika.UtworzUproszczonePozycje(IQueryable`1 query) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycji`4.PodajPozycje() w InsERT.Moria.CennikiICeny.CennikBO.InsERT.Moria.CennikiICeny.ICennikPozycje.get_Wszystkie() w SynchronousSocketListener.StartListening() Całkiem możliwe, że wczytywanie takie zakresu danych sprawia problem dla pamięci, bo mamy sporo produktów, przewinęło się też sporo cenników. Metoda była skonstruowana w sumie w 2017 roku, na podstawie tego postu: W międzyczasie, cenniki się zmieniły, więc może można to zrobić lepiej?
  3. Sprawdziłem, chociaż nie wiem, jak od was idą INSERT/UPDATE, bo mi same SELECT wychodzą, jak wezmę wszystkie zdarzenia TSQL. Zatrzymuje się jak niżej. Dodam, że na bezpośrednio odpalonym programie nie wywaliło się ani razu, więc naprawdę chyba jest wina po stronie programu kompilującego - może kwestia ponownego odpalenia takiej samej funkcji, bo pierwszy raz przechodzi, drugi nie, może coś w pamięci zostaje. Nic trzeba wyłożyć te 2k na licencję VS'a - rozumiem, że taki będzie ok? https://www.microsoft.com/pl-pl/d/visual-studio-professional-2022/dg7gmgf0d3sj
  4. Spróbowałem to odpali i po przebrnięciu miliarda wyjątków od Newtonsoft, nie zwróciło nic w momencie rozbijania, poza pojawieniem się zmiennej w debuggerze, jak wspominałem wcześniej.
  5. Raczej nie, bo zanim do was napisałem, to także wywaliłem tą linię na próbę, aby zobaczyć, czy to ona. Wcześniej miałem nawet wyświetlenie informacji pomiędzy, aby to sprawdzić. Mogę włączyć coś takiego:
  6. Też racja, przeoczyłem, aczkolwiek, dalej nic nie zwraca. Swoją drogą, to drugie wykonanie aktualizacji, na debuggerze, psuje dokument, bo zostaje zablokowany - to efekt odpalenia na tej skompilowanej aplikacji, ponownie na tym dokumencie, co się kod zatrzymał:
  7. EDIT: Dobra, chyba nie było tematu. Odpalałem aplikację z debugger, SharpDevelop (tak nie korzystam z VS, kwestie licencyjne, ale chyba trzeba będzie się przesiąść, tylko nie ma kiedy). Po odpaleniu aplikacji normalnie z poziomu Windows, problem nie występu, tak że lekko zgłupiałem, i przepraszam za zawracanie gitary. Nie był, ale dodałem. Próbowałem zarówno na cały kod jak i na samo rozbicie i nic mi nie zwraca. Aczkolwiek, może nie umiem używać catch exception w C#. Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Zakańczanie rozbicia."); try { r.ZakonczRozbicie(); } catch (InvalidCastException e) { Console.WriteLine("{0} Exception caught.", e); } aplikatorSM.AplikujSkutkiMagazynowe(poz); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Pozycja zaktualizowana."); Dodatkowo mogę dodać, że jest to odpalane z Debuggera kompilatora i w momencie zatrzymania, pokazuje informacje w Local variables - nie używam VS'a.
  8. Mam kod, który pozwala zaktualizować ilość w dokumencie RW, korzystającym z rozbicia. Kod działa i wygląda tak: Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Aktualizacja ilości pozycji RW."); // przygotowanie danych IAsortymenty asortyment = sfera.PodajObiektTypu<IAsortymenty>(); IStatusyDokumentowDaneDomyslne statusyDD = sfera.PodajObiektTypu<IStatusyDokumentow>().DaneDomyslne; IRozchodyWewnetrzne dokumentyRozchodu = sfera.PodajObiektTypu<IRozchodyWewnetrzne>(); // pobranie PW int id = results.id; var rwDoEdycji = dokumentyRozchodu.Dane.Wszystkie().Where(dok => dok.Id == id).FirstOrDefault(); using (IRozchodWewnetrzny rw= dokumentyRozchodu.Znajdz(rwDoEdycji)) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - aktualizowanie RW: "+rw.Dane.NumerWewnetrzny.PelnaSygnatura); var status = rw.Dane.StatusDokumentu; // pobranie i zaktualizowanie ilości pozycji int pos = results.pos; var poz = rw.Dane.Pozycje.Where(p => p.Id == pos).Single(); Console.WriteLine("Modyfikacja: "+poz.AsortymentAktualny.Nazwa); // uproszczone, bez partii if(results.quantity!=null) { decimal posq = results.quantity; Console.WriteLine("Uproszczona aktualizajca: "+posq); poz.Ilosc = posq; } // aktualizacja z uwzględnieniem partii else { IDokumentZRozbiciem dok = (IDokumentZRozbiciem)rw; // włączamy rozbicie dokumentu poz.Ilosc = 0; IAplikatorSkutkowMagazynowych aplikatorSM = (IAplikatorSkutkowMagazynowych)rw; aplikatorSM.AplikujSkutkiMagazynowe(poz); // poprawka od Insertu na poprawne działanie skutku magazynu var r = dok.RozpocznijRozbicie(poz) as IRozbiciePozycjiRozchodowe; foreach(var posbatch in results.batches) { decimal batchquantity; int batchid; batchquantity = posbatch.quantity; batchid = posbatch.batch; Console.WriteLine("Partia: "+batchid); Console.WriteLine("Aktualizajca: "+batchquantity); var pr = r.Pozycje.Where(p => p.PartiaZrodlowa.Id == batchid).Single(); pr.Ilosc = batchquantity; foreach(var pozr in r.Pozycje.Where(p => p.PartiaZrodlowa.Id != batchid && 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); } Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Zakańczanie rozbicia."); r.ZakonczRozbicie(); aplikatorSM.AplikujSkutkiMagazynowe(poz); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Pozycja zaktualizowana."); } rw.Przelicz(); // zapisanie PW po zmianach if(rw.Zapisz()) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - zapisano RW: "+rw.Dane.NumerWewnetrzny.PelnaSygnatura); response = "{ \"number\":\""+rw.Dane.NumerWewnetrzny.PelnaSygnatura+"\", \"id\":\""+rw.Dane.Id+"\" }"; } else { Globals.errors = ""; rw.WypiszBledy(); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - błąd przy dodawaniu PW: "+Globals.errors); response = "{ \"error\":\""+Globals.errors+"\" }"; } } Niestety, przy próbie ponownego użycia na tym samym dokumencie, zatrzymuje się on na r.ZakonczRozbicie();. Czy można jakoś wyciągnąć błędy z tej metody? Cały proces wypada ok, ładnie znajduje partie, zeruje, poprawia ilość, ale jednak się zatrzymuje, nie zwracają błędu. Poniżej cały cykl, od utworzenia RW, potem zwiększenia na nim ilości powyższym kodem o 1, a przy kolejnej próbie, zatrzymuje się:
  9. Tak, do 40 klientów. Tak na klientach właśnie odpala się lepiej, co jest mega dziwne. Oczywiście są różnice Windows i sprzętu, ale serwer jednak ma zdecydowanie więcej zasobów. Każdym. Nawet na tych mniejszych podmiotach. Ciężko to określić dla NEXO, bo to mierzenie na zegarku. Aplikacje sferyczne odpalają się zdecydowanie dłużej, i widać około 20-30% różnicy po czasach, chociaż nie rejestruje ms. Nie, kompilowane na bieżąco, bo są rozwijane cały czas. Poniżej, załączam filmik z odpalenia Subiekta na serwerze (co prawda RDP, ale nie powinno to mieć wpływu) ... serwer.mp4 ... oraz komputerze kliencie, podłączonym przez uwierzytelnianie użytkownikiem i hasłem do bazy: klient.mp4 Na oko, od wpisania hasła, na serwerze trwa to 3x dłużej.
  10. W międzyczasie udało mi się wydobyć prawdopodobny scenariusz: - użytkownik Ja, pracował wczoraj zdalnie bezpośrednim podłączeniem do bazy i dodawał ZK, skończył na numerze 21120890 - użytkownik prawdopodobnie nie wyłączył programu, zamknął klapę laptopa - dzisiaj po 9 zaczął pracę, grzebał w asortymencie, po 10, postanowił utworzyć ZK - dodało mu ZK, z kolejnym numerem, ale jakby z dnia jak wczoraj skończył pracę - jakby system utrzymał w jakieś pamięci podręcznej ten numer - nie było komunikatu o zajętości numeru - użytkownik zarzeka się, że otwierał ZK od nowa i je tworzył normalnie na nowo dzisiaj i w sumie Ślad Rewizyjny to trochę potwierdza
  11. Jeszcze luki w numeracji, dla całości wizji - obecne numery poprawiłem.
  12. Dodam jeszcze, że numer 21120891, istniał wczoraj w systemie, i ogólnie dziwne, że pozwoliło zapisać z tym numerem.
×
×
  • Dodaj nową pozycję...