Skocz do zawartości

[Sfera] Zwracanie błędów, podczas zakańczania rozbicia partii, podczas modyfikacji RW

Polecane posty

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ę:

obraz.thumb.png.6eb8511effb386647d4ac8f8f61d9402.png

Link to postu

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.

W dniu 18.01.2022 o 13:58, Wojciech Szopiński napisał:

Czy podany kod w Pana rozwiązaniu jest ujęty w blok try-catch?

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.

obraz.png.8bc53a0b21ce465066a83ce27c2add7d.png

Link to postu
W dniu 18.01.2022 o 15:12, Wojciech Szopiński napisał:

W tym przypadku najlepiej złapać ogólny typ czyli Exception.

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ł:

obraz.png.98c9da54560d76931ffd48656aee76d5.png

 

 

 

Link to postu

Z wyjątku AppLockNotAcquiredException można odczytać pole ResourceId, które zawiera informacje, który obiekt nie zwolnił blokady. Może wyjątek leci nie w linii kończącej rozbicie, a tej niżej:

aplikatorSM.AplikujSkutkiMagazynowe(poz)

?

Nie korzystałem z SharpDevelop, ale czy jest tam możliwość debugowania z wychwytywaniem wyjątków? Jeśli tak to proszę spróbować to włączyć i wtedy uruchomić debugowanie.

Link to postu
W dniu 19.01.2022 o 06:25, Wojciech Szopiński napisał:

Z wyjątku AppLockNotAcquiredException można odczytać pole ResourceId, które zawiera informacje, który obiekt nie zwolnił blokady. Może wyjątek leci nie w linii kończącej rozbicie, a tej niżej:

aplikatorSM.AplikujSkutkiMagazynowe(poz)

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ć.

 

W dniu 19.01.2022 o 06:25, Wojciech Szopiński napisał:

Nie korzystałem z SharpDevelop, ale czy jest tam możliwość debugowania z wychwytywaniem wyjątków? Jeśli tak to proszę spróbować to włączyć i wtedy uruchomić debugowanie.

Mogę włączyć coś takiego:

obraz.thumb.png.764565b39404ba8d1838ad1aa27ba892.png

Link to postu

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

obraz.thumb.png.c8f18a9901bc8ae0e5068521a19397db.png

Link to postu
  • 3 tygodnie później...

Dobra, to możemy wrócić do tematu, bo mam VS Profesional 2022.

Udało się osiągnąć taki sam efekt:

obraz.thumb.png.a60412132a38a7699f79ca1958b8bad8.png

Dodatkowe info - RW jest zablokowane, nie mogę go poprawić w NEXO.

Po odpuszczeniu blokady odpaliłem aplikację normalnie, z 10 razy zaktualizowałem to RW, bez żadnego problemu, po tym znowu odpalam z VS z debugera i od razu pierwszy zatrzymuje się jak na screenie. Generalnie całe funkcje są u mnie w CatchException.

 

Edit:

Lepsze jaja, przepraszam, uczę się jeszcze VS'a, obok linii jak widać na screnie r.ZakonczRozbicie, najechałem i był przycisk Play, kliknąłem i poleciało dalej.

Link to postu

Na górze jest również guzik "Kontynuuj". Miał Pan postawionego break-point'a w tym miejscu więc debugger zatrzymał się w danej linii i oczekiwał na reakcję użytkownika. Proszę jeszcze przed uruchomieniem programu z debug'a włączyć wychwytywanie wszystkich wyjątków w oknie Debug -> Windows -> Exception settings.

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