Skocz do zawartości

Nietypowy błąd przy aktualizacji asortymentu

Polecane posty

Robię masową aktualizację jednego zapisu w asortymencie i co jakiś czas, Sfera wywala mi takim błędem:

 

Cytat

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Data.SqlClient.SqlException: Wystąpił błąd związany z siecią lub wystąpieniem podczas ustanawiania połączenia z serwerem programu SQL Server. Nie można odnaleźć serwera lub jest on niedostępny. Sprawdź, czy nazwa wystąpienia jest poprawna i czy konfiguracja serwera programu SQL Server zezwala na połączenia zdalne.  (provider: TCP Provider, error: 0 - TCP Provider: ) ---> System.ComponentModel.Win32Exception: Połączenie nie zostało nawiązane, ponieważ w sieci istnieje duplikat nazwy. Jeśli przyłączasz się do domeny, przejdź do apletu System w Panelu sterowania, aby zmienić nazwę komputera, i spróbuj ponownie. Jeśli przyłączasz się do grupy roboczej, wybierz inną nazwę grupy

 

Póki co skrypt puściłem na bazie developerskiej, która jest na Expresie. Błąd wywala raczej w losowych pozycjach. Zauważyłem także spowolnienia w przetwarzaniu i myślę, że to wynika właśnie ze zbyt długiego oczekiwania. Jeśli chodzi o wiersz kodu, to dzieje się to też w różnych miejscach - pobranie jednostki, wczytanie asortymentu do edycji, zapisanie asortymentu.

Link to postu

We wszystkich przypadkach był ten sam błąd. Ale postanowiłem puścić skrypt na bazie produkcyjnej, po wykonaniu kopii, przeszedł bez problemu. Wygląda na to, że był on chyba spowodowany jakimiś ograniczeniami "Express Edition" - developerską właśnie mam na takim, a główną, na pełnym 2014.

Link to postu
  • 11 miesięcy temu...

Aby nie dodawać nowego tematu, dopnę do tego. Zauważyłem, że tak raz w tygodniu, podczas zapisywania WZ, Sfera wysypuje mi się z takim błędem. Jakiś pomysł, czy da radę go jakoś uniknąć? Te same dane, ponownie wysłane, najczęściej przechodzą przy drugiej próbie. Zastanawiam się, czy to nie jest kwestia, że aplikacja Sfery chodzi zbyt długo bez błędu :P

InsERT.Mox.Work.UnitOfWorkChangesAcceptedException: W trakcie akceptowania zmian wystąpiły błędy. ---> System.Data.SqlClient.SqlException: Upłynął limit Timeout. Limit upłynął przed ukończeniem operacji lub serwer nie odpowiada. ---> System.ComponentModel.Win32Exception: Upłynął limit czasu operacji oczekiwania
   --- Koniec śladu stosu wyjątków wewnętrznych ---
   w System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   w System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   w System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   w System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   w System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   w System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   w System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   w System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   w System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   w LockStoredProcedures.Wrappers.ExecuteReleaseLock(SqlConnection conn, String resourceId, Guid sessionId)
   w InsERT.Mox.Locking.SqlServer.SqlApplicationLock.<>c__DisplayClass9.<Dispose>b__8(SqlConnection conn)
   w InsERT.Mox.Locking.SqlServer.SqlApplicationLock.ManageConnection(Action`1 action)
   w InsERT.Mox.Locking.SqlServer.SqlApplicationLock.Dispose(Boolean disposing)
   w InsERT.Mox.Locking.SqlServer.SqlApplicationLock.System.IDisposable.Dispose()
   w InsERT.Mox.Locking.SqlServer.SqlApplicationLock.Release()
   w InsERT.Moria.Dokumenty.Logistyka.KoordynatorBazowy.ZwolnijWszystkieBlokady()
   w InsERT.Moria.Dokumenty.Logistyka.DokumentPart.ChangesAccepted(IBusinessObject businessObject, ChangesAcceptedEventArgs args)
   w InsERT.Moria.Dokumenty.Logistyka.WydanieZewnetrzneBO.ChangesAccepted(ChangesAcceptedEventArgs args)
   w InsERT.Moria.Dokumenty.Logistyka.WydanieZewnetrzneBO.ChangesAcceptedCore(ChangesAcceptedEventArgs args)
   w InsERT.Mox.BusinessObjects.BusinessObject`3.<>c__DisplayClass2c.<HandleSavedChangesNotification>b__2a()
   w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   w InsERT.Mox.Aop.Weaver.RuntimeWeave(RuntimeWeavedJoinpoint joinpoint, Action coreOperation)
   w InsERT.Mox.BusinessObjects.BusinessObject`3.HandleSavedChangesNotification(Object sender, ChangesAcceptedEventArgs args)
   w InsERT.Mox.Work.UnitOfWork.SaveChanges3(Boolean changesWereSaved)
   --- Koniec śladu stosu wyjątków wewnętrznych ---
   w InsERT.Mox.Work.UnitOfWork.SaveChanges3(Boolean changesWereSaved)
   w InsERT.Mox.Work.UnitOfWork.SaveChanges()
   w InsERT.Mox.BusinessObjects.BusinessObject`3.Zapisz()
   w SynchronousSocketListener.StartListening() w f:\SferaDEV\Sfera\Sfera\Program.cs:wiersz 1068 

 

Link to postu

Postaramy się zdiagnozować ten problem. Proszę mi jeszcze powiedzieć czy jest coś specyficznego w tych dokumentach? Czy są to nowe dokumenty, czy edycja istniejących? Czy wystawiane są na podstawie jakiś innych dokumentów? Ile osób pracuje jednocześnie na tej bazie danych? Czy program napisany w Sferze wykonuje się w trakcie pracy firmy, czy po jej zakończeniu?

Link to postu
8 godzin temu, Paweł Kubacki napisał:

Proszę mi jeszcze powiedzieć czy jest coś specyficznego w tych dokumentach?

Dokumenty WZ, z wskazaniem konkretnych partii i ilości - umieszczam też kod Sfery, odpowiedzialny, za tworzenie WZ.

8 godzin temu, Paweł Kubacki napisał:

Czy są to nowe dokumenty, czy edycja istniejących?

Tak, są to dokumenty nowe. Co ciekawe, nawet jak powstanie ten błąd, to ponowne wysłanie po chwili, nie zwraca już tego problemu i dokument się wystawia.

8 godzin temu, Paweł Kubacki napisał:

Czy wystawiane są na podstawie jakiś innych dokumentów?

Tak, wskazywane są zamówienia źródłowe, więcej szczegółów w kodzie Sfery widoczne.

8 godzin temu, Paweł Kubacki napisał:

Ile osób pracuje jednocześnie na tej bazie danych?

Obecnie mamy 42 licencje na Subiekt/Gestor + Gratyfikant i Rewizor, ale pierwsze dwa powiedzmy, że robią obciążenie. Do tego dochodzi serwer usług oraz aplikacja Sfery. Aplikacja Sfery, jest jedno-wątkowo, na jednej licencji i ona jest jednowątkowa. Dodatkowo, na tym serwerze, jest jeszcze baza drugiego podmiotu, ale tam użytkowana jest tylko aplikacja Sfery + sporadyczne wejścia na program.

Posiadamy SQL 2014 SP2 Standard Runtime, wraz z 50 licencjami klienckimi, ale CALe, to chyba z tego co pamiętam, to głównie papierek.

8 godzin temu, Paweł Kubacki napisał:

Czy program napisany w Sferze wykonuje się w trakcie pracy firmy, czy po jej zakończeniu?

Program pracuje 24/7 - nasłuchuje w oczekiwaniu na zadania, które otrzymuje z mojego głównego systemu, jest powiedzmy, że łącznikiem. Takich zadań jest około 500 dziennie, począwszy od tworzenia asortymentu, poprzez wystawianie dokumentów, czy zatwierdzanie urlopu.

Kod odpowiedzialny, za tworzenie WZ:

                // TWORZENIE WZ DLA WYBRANYCH POZYCJI ZK -------------------------------------------------------------------------------
                if(results.function=="addWZ")
                  {
                  Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - dodawanie WZki do wybranych pozycji."); 	
                	
                  // przygotowanie danych
                  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 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                  
                  
                  //Console.WriteLine(results.pos);
                  using (IWydanieZewnetrzne wz = dokumentWydania.Utworz(konfWz))
                    {
                  	ParametryGrupowaniaPodstawowe parametryGrupowania = new ParametryGrupowaniaPodstawowe();
                    parametryGrupowania.MetodaGrupowaniaPozycji = MetodaGrupowaniaPozycji.BezKonsolidacji;
                    parametryGrupowania.MetodaWyliczeniaCen = MetodaWyliczeniaCen.PrzepisanieZDokumentuGlownego;
                    parametryGrupowania.MiejsceDostawy = zk.MiejsceDostawy;
                    parametryGrupowania.MiejsceDostawyTyp = MiejsceDostawyTyp.Nabywca;
                    parametryGrupowania.NabywcaSprzedawca = zk.NabywcaSprzedawcaWybrany;
                    //parametryGrupowania.OdbiorcaDostawca = zk.NabywcaSprzedawcaWybrany;  
                  	
                  	wz.Dane.Magazyn = mag;
                  	wz.Dane.Uwagi = results.comment;
                  	wz.Dane.StatusDokumentu = statusyDD.Rozchod_WydanyTowar;
                  	
                  	IDokumentZRozbiciem dok = (IDokumentZRozbiciem)wz;
                  	//IDokumentZRozbiciem dok = (IDokumentZRozbiciem)wz;
                  	
                  	// wypełnienie pozycji
                  	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
                    //wz.Dane.StatusDokumentu = statusyDD.Rozchod_Odlozony; // ustawienie odłożonego statusu dokumentu
                  	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.PozycjeRealizowane.Where(p => p.TypDokumentuRealizowanego == 3).Single().PozycjaRealizowanaId

                    poz.Ilosc = 0; // ustawiamy na 0, wyjdzie z rozbicia
                    //wz.Dane.StatusDokumentu = statusyDD.Rozchod_WydanyTowar; // przywrócenie statusu powodującego rezerwacje
                  	//wz.Przelicz();
                  	       
                    /*
                  	var r = dok.RozpocznijRozbicie(poz) as IRozbiciePozycjiRozchodowe;
                  	var countZero = r.Pozycje.Where(p => p.Ilosc > 0).Count();
                  	for(int i=1;i<=countZero;i++) { r.Pozycje.Where(p => p.Ilosc > 0).FirstOrDefault().Ilosc = 0; } // bardzo brunde roziwązanie, ale działa
                  	Console.WriteLine("Wprowadzenie partii: "+posbatch+" w ilości "+posq);
                    r.Pozycje.Where(p => p.PartiaZrodlowa.Id == posbatch).FirstOrDefault().Ilosc = posq;
                    Console.WriteLine("Partia wprowadzona: "+posbatch);
                    r.ZakonczRozbicie(); */
                    
                    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;
                    Console.WriteLine("Partia wprowadzona: " + posbatch);
                    r.ZakonczRozbicie();
                    
                    Console.WriteLine("Ilość na pozycji: " + poz.Ilosc);
                    
                    wz.Przelicz();
                  	}
                  	

                  	// poprawka na nabywcę
                    if(wz.Dane.NabywcaSprzedawca==null)
                      {
                  	  wz.Dane.NabywcaSprzedawca = wz.Dane.Podmiot;
                      wz.Dane.RolaInnegoPodmiotu = (byte)RolaInnegoPodmiotu.InnyNabywca;                  	
                      }
 
                  	// dopisanie transportu, jeśli jest
                  	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;
                  	  }
 
                  	// 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);
                  	  }

                  	
                  	// osoba wystawiająca
                  	string sign = results.sign;
                  	wz.Dane.WystawilaOsoba = uzytkownicy.Dane.Wszystkie().Where(p => p.Sygnatura == sign).FirstOrDefault().Osoba;
                    //
                  	
                    if(wz.Zapisz())  
                      {
                      // odpowiedz
                      Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - dodano WZkę: "+wz.Dane.NumerWewnetrzny.PelnaSygnatura);
                      response = "{ \"number\":\""+wz.Dane.NumerWewnetrzny.PelnaSygnatura+"\", \"id\":\""+wz.Dane.Id+"\" }"; 
                      // eksportowanie do PDF
                      Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - eskportowanie pliku PDF: "+wz.Dane.NumerWewnetrzny.PelnaSygnatura);
                      IWydruki manager = sfera.PodajObiektTypu<IWydruki>();                       
                      using (IWydruk wydruk = manager.Utworz(TypWzorcaWydruku.WydanieZewnetrzne))
                        {
                        wydruk.ObiektDoWydruku = wz.Dane;
                        var wzorzec = wydruk.ParametryDrukowania.DostepneWzorce.Where(p => p.Id == 100057).FirstOrDefault();
                        wydruk.ParametryDrukowania.WybranyWzorzec = wzorzec;
                        wydruk.ParametryDrukowania.NazwaDokumentuUzytkownika = "wz" +wz.Dane.Id;
                        wydruk.ParametryDrukowania.SciezkaEksportu = @"N:\";
                        wydruk.Eksport();
                        }

                      }
                    else { Globals.errors = ""; wz.WypiszBledy(); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - błąd przy dodawaniu WZki: "+Globals.errors );  response = "{ \"error\":\""+Globals.errors+"\" }"; }
                    }
                	
                  }

 

Link to postu
  • 2 tygodnie później...
Dnia 22.01.2018 o 13:24, Radomił Ząbik napisał:

Zauważyłem, że tak raz w tygodniu, podczas zapisywania WZ, Sfera wysypuje mi się z takim błędem. Jakiś pomysł, czy da radę go jakoś uniknąć? Te same dane, ponownie wysłane, najczęściej przechodzą przy drugiej próbie.

Dzięki przekazanym przez Pana informacjom udało nam się zdiagnozować przyczynę tego problemu. Poprawka znajdzie się w wersji 20.0.0.

  • Dziękuję 1
Link to postu
  • 3 miesiące temu...
×
×
  • Dodaj nową pozycję...