Skocz do zawartości

Anna Sałacińska

Użytkownik
  • Liczba zawartości

    66
  • Rejestracja

  • Ostatnia wizyta

Zawartość dodana przez Anna Sałacińska

  1. Baza subiekta została postawiona na nowo z wyczyszczoną bazą kontrahentów. Od tej pory działa prawidłowo. A z tego wnioskuję że sfera przestaje działać przy zbyt dużej ilości kontrahentów.
  2. Wstawiam większy fragment kodu może będzie łatwiej. Tu faktycznie może trochę w błąd wprowadzać to że moje klasy i klasy sfery mają te same nazwy. Te bez przestrzeni nazw InsERT są moje. Klasa kontrahentów: class Kontrahent { public int dodaj(Klient klient) { InsERT.Kontrahent kon = null; try { using (SqlCommand qis = new SqlCommand(@"SELECT isnull( CONVERT(int, (SELECT TOP 1[kh_Id] FROM[dbo].[kh__Kontrahent] JOIN[dbo].[adr__Ewid] on[adr_IdObiektu] =[kh_Id] and[adr_TypAdresu] = 1 WHERE adr_NIP = @nip AND adr_NIP != '' AND kh_Zablokowany = 0)) , isnull( CONVERT(int, (SELECT TOP 1 kh_Id FROM[dbo].kh__Kontrahent WHERE[kh_EMail] = @mail AND kh_Zablokowany = 0)) , 0)) ") ) { qis.Parameters.Add("@mail", SqlDbType.VarChar, 255).Value = klient.email; qis.Parameters.Add("@nip", SqlDbType.VarChar, 255).Value = klient.nip; kid = (int)qis.ExecuteScalar(); if (kid == 0) { kon = this.sfera.sgt.Kontrahenci.Dodaj(); kon.Typ = 0; kon.Miejscowosc = klient.miasto; kon.Ulica = klient.ulica; kon.NrDomu = klient.dom; kon.NrLokalu = klient.lokal; kon.KodPocztowy = klient.kod; kon.Telefony.Dodaj(klient.telefon); kon.Email = klient.email; kon.NIP = klient.nip; .... kon.Zapisz(); kid = kon.Identyfikator; } else { kon = this.sfera.sgt.Kontrahenci.Wczytaj(kid); kon.Miejscowosc = klient.miasto; kon.Ulica = klient.ulica; kon.NrDomu = klient.dom; kon.NrLokalu = klient.lokal; ... kon.Zapisz(); } } } catch (Exception ex) { .... } finally { if (kon != null) { kon.Zamknij(); System.Runtime.InteropServices.Marshal.ReleaseComObject(kon); } } return kid; } } Klasa zamówień: class Zamowienie { public int dodaj(Zamowienie zamowienie) { int dokumentId = 0; InsERT.SuDokument zk = null; try { Kontrahent kontrahent = new Kontrahent(); kontrahentId = kontrahent.dodaj(zamowienie.klient); if (kontrahentId == 0) { throw new Exception("Brak kontrahenta"); } zk = this.sfera.sgt.SuDokumentyManager.DodajZK(); zk.NumerOryginalny = zamowienie.id; zk.Podtytul = ""; zk.StatusDokumentu = 6; zk.KontrahentId = kontrahentId; foreach (Produkt produkt in zamowienie.produkty) { using (SqlCommand qProd = new SqlCommand(@"SELECT TOP 1 [tw_Id] FROM [tw__Towar] WHERE [tw_Symbol]= @ob_TowId")) { qProd.Parameters.Add("@ob_TowId", SqlDbType.VarChar, 20).Value = produkt.index; int prodId = 0; try { prodId = Convert.ToInt32(qProd.ExecuteScalar()); } catch (Exception) { } InsERT.SuPozycja poz = null; if (prodId > 0) { poz = zk.Pozycje.Dodaj(prodId); } else { poz = zk.Pozycje.DodajUslugeJednorazowa(); poz.UslJednNazwa = produkt.nazwa; } poz.CenaBruttoPrzedRabatem = produkt.brutto; poz.RabatProcent = produkt.rabat; poz.IloscJm = produkt.ilosc; System.Runtime.InteropServices.Marshal.ReleaseComObject(poz); } } zk.Zapisz(); dokumentId = zk.Identyfikator; zk.Zamknij(); System.Runtime.InteropServices.Marshal.ReleaseComObject(zk); } catch (Exception ex) { ... } finally { if (zk != null) { zk.Zamknij(); System.Runtime.InteropServices.Marshal.ReleaseComObject(zk); } } return dokumentId; } } Oraz dodawanie Subiekt.Zamowienie zamowinie = new Zamowienie(); foreach (Zamowienie zamowienie in lista) { zamowinie.dodaj(zamowienie); } Jak widać klasa Kontrahent dodaje lub otwiera do edycji InsERT.Kontrahent, zmienia dane, zapisuje i zamyka obiekt sfery. I dopiero jak doda kontrahenta to tworzy InsERT.SuDokument Ok, jest dokładniej InsERT.SuDokument zk = null; kontrahent.dodaj(zamowienie.klient);// tu moja klasa kontrahent która wywołuje sgt.Kontrahenci.Dodaj() lub sgt.Kontrahenci.Wczytaj() sgt.SuDokumentyManager.DodajZK(); no ale skoro zk na początku jest równe null to to nie powinno mieć żadnego wpływu. Przed wystąpieniu błędu w tabeli [dbo].[ins_blokada] albo nie ma wpisu albo jest z workstation podanym na stanowisko na którym jest uruchamiany ten program. Więc wychodzi na to że on blokuje sam siebie. Tego programu nie da się uruchomić kilka razy więc odpada opcja że niechcący został uruchomiony dwa razy i dwie instancje się na siebie nadkładają, próbując edytować tego samego kontrahenta.
  3. Faktycznie mea culpa, tu jest edycja. W każdym razie można powiedzieć że wykonuję metodę dodającą lub edytującą kontrahenta - obiekt kontrahenta zostaje zamknięty. A dopiero później zaczynam dodawać zk, w którym kontrahenta poprzez jego id Czyli to jest dosłownie zk.KontrahentId = 123; A wywala się na zapisie kontrahenta. foreach(zamówienia){ kontrahentId = kontrahent.dodaj(...); zk = sgt.SuDokumentyManager.DodajZK(); zk.KontrahentId = kontrahentId; zk.Zamknij(); System.Runtime.InteropServices.Marshal.ReleaseComObject(zk); } to kontrahent.dodaj dodaje lub edytuje kontrahenta kon = sgt.Kontrahenci.Dodaj(); lub kon = sgt.Kontrahenci.Wczytaj(kid); kon.Miejscowosc = klient.miasto; kon.Ulica = klient.ulica; kon.Zapisz(); kon.Zamknij(); System.Runtime.InteropServices.Marshal.ReleaseComObject(kon); To do dodawania zk nawet nie dochodzi. Dlatego nie wiem czy dodawanie produktów w pierwszym zk, może popsuć zapis kontrahenta przy następnym.
  4. Kod dodający kontrahenta wygląda dokładnie tak InsERT.Kontrahent kon = null; try { kon = this.sfera.sgt.Kontrahenci.Wczytaj(kid); kon.Miejscowosc = klient.miasto; kon.Ulica = klient.ulica; kon.NrDomu = klient.dom; kon.NrLokalu = klient.lokal; kon.KodPocztowy = klient.kod; try { if (kon.Telefony.Liczba == 0) { kon.Telefony.Dodaj(klient.telefon); } else { kon.Telefony[1].Numer = klient.telefon; } } catch (Exception e) { } kon.Email = klient.email; kon.NIP = klient.nip; if (klient.imie.Trim() != "") { kon.OsobaImie = klient.imie; } if (klient.nazwisko.Trim() != "") { kon.OsobaNazwisko = klient.nazwisko; } kon.AdresDostawy = true; kon.AdrDostKodPocztowy = klient.dowysylki_kod; kon.AdrDostMiejscowosc = klient.dowysylki_miasto; kon.AdrDostNrDomu = klient.dowysylki_dom; kon.AdrDostNrLokalu = klient.dowysylki_lokal; kon.AdrDostUlica = klient.dowysylki_ulica; string nazwa = ""; if (klient.firma != "") { kon.NazwaPelna = klient.firma; nazwa = klient.firma; } else { kon.NazwaPelna = klient.imie + " " + klient.nazwisko; nazwa = klient.imie + " " + klient.nazwisko; } kon.Nazwa = nazwa; kon.Zapisz(); } finally { if (kon != null) { kon.Zamknij(); System.Runtime.InteropServices.Marshal.ReleaseComObject(kon); } } Wywala się na kon.Zapisz(); I dopiero jak doda kontrahenta to przechodzi do dodawania zk. No ok zk, są dodawane w pętli ale i tak dodaje kontrahenta, a później zk. Więc mam rozumieć że błąd w dodawaniu pozycji spowoduje zablokowanie kontrahentów?
  5. Zaczęłam przerabiać ale to nie zadziała. Ja nie edytuje dokumentu tylko dodaje nowe ZK. Więc nie mogę pobrać produktów z dokumentu i przejść po nich pętlą. Tylko ja napycham nowy pusty dokument pozycjami. I tak jak pisałam ten foreach nie przechodzi po danych ze sfery tylko po moich. I może to głupie pytanie, ale czy źle dodawane pozycje mogą spowodować błąd kontrahenta?
  6. suDodument.Pozycje jest tylko jako get, jak mam tam przekazać całą listę? I jak mam dodawać same pozycje? Bo w dokumentacji wszędzie jest że dodaje się je w taki sposób. Trochę nie rozumiem czemu mam zmieniać foreach na for - bo jak się domyślam to jest "zwykła" pętla. Przecież to jest pętla po danych które dostaje z mojego API, to nie coś co odczytuję ze sfery.
  7. Xeon Gold 6248 (20c/40t). Pamięć to 128GB i dysk ssd raid10 (4dyksów ssd). Platforma Insert chodzi na Wirtualnej maszynie gdzie są przydzielone 32core i 60gb ram, SQL Runtime 2017 (14.0.2047.8), baza zajmuje ~30gb a miejsca wolnego jest około 100gb. Problem pojawia się trochę losowo, działa kilka godzin po czym zaczyna sypać błędami. Przykładowo, w sobotę było jakieś 4godziny dobrze, później były błędy jakieś dwie godziny z znowu chwilę działało. W niedzielę działało około dwie godziny i od tej pory non stop błędy. To znaczy wygląda to tak że dodaje jedno max dwa zamówienia ale zajmuje to 7-10sekund na każde i przy kolejnym wali błędem. Jak działa dobrze to zamówienie dodaje się dosłownie w 1-2sekundy. Trochę szkoda że nie jest to podane wprost w przykładach... Jest już dodane wszędzie, wydawało się że pomogło ale po jakichś dwóch godzinach znowu to samo. są tworzone dosłownie tak jak jest to podane wyżej. Operacje jakie to dokładnie: - Otwarcie lub utworzenie kontrahenta - Uzupełnienie danych adresowych kontrahenta - zamknięcie kontrahenta - dodaje zk -- dodaje pozycje do zk - zamykam zk dodawanie pozycji wygląda tak foreach(p in produkty){ poz = zk.Pozycje.Dodaj(prodId); poz.CenaBruttoPrzedRabatem = p.brutto; poz.RabatProcent = p.rabat; poz.IloscJm = p.ilosc; System.Runtime.InteropServices.Marshal.ReleaseComObject(poz); }
  8. Dzień dobry, mam program dodający zk przez sferę, w celu dodania tego zk wykonuję następujące kroki: Sprawdzam czy kontrahent istnieje jeśli nie istnieje dodaje nowego InsERT.Kontrahent kon = this.sfera.sgt.Kontrahenci.Dodaj(); kon.Typ = 0; kon.Symbol = ".."; kon.Miejscowosc = ".."; kon.Ulica = ".."; kon.Telefony.Dodaj(".."); kon.Zapisz(); kon.Zamknij(); Jeśli istnieje to wczytuję po id i aktualizuję InsERT.Kontrahent kon = this.sfera.sgt.Kontrahenci.Wczytaj(ID); kon.Miejscowosc = ".."; kon.Ulica = ".."; kon.NrDomu = ".."; if (kon.Telefony.Liczba == 0) { kon.Telefony.Dodaj(".."); } else { kon.Telefony[1].Numer = ".."; } kon.Zapisz(); kon.Zamknij(); Następnie dodaje zk dla tego kontrahenta zk = this.sfera.sgt.SuDokumentyManager.DodajZK(); zk.UwagiExt = ".."; zk.NumerOryginalny = ".."; zk.Podtytul = "..."; zk.StatusDokumentu = 6; zk.KontrahentId = kontrahentId; zk.Zapisz(); zk.Zamknij(); I to działa ale czym dłużej działa serwer tym częściej mam błędy 0x80040E31 Błąd pojawia się dla nowych kontrahentów i tych edytowanych, dodatkowo dla tych edytowanych przed wczytaniem do edycji sprawdzam tabelę ins_blokada. Najczęściej jest pusty ale czasami faktycznie pojawia się blokada Tylko odnoszę wrażenie że najpierw jest błąd bez wpisu, a później kilka takich z wpisem w blokadach. Czy coś tu robię źle? W przykładach w dokumentacji wygląda to podobnie ale nie wiem, może jakiś zasób źle zamykam albo coś w tym stylu?
  9. Dzień dobry, potrzebuję pobrać dokumenty zawierające określony produkt, mające określony status oraz będące określonego typu. Mam coś takiego IDokumenty dokumenty = sfera.PodajObiektTypu<IDokumenty>(); int asortymentId = 100047; string[] statusy = { "P", "S", "W" }; var dokumentyZProduktem = dokumenty.Dane.Wszystkie() .Where( w => w.Pozycje.Where(poz => poz.AsortymentAktualnyId == asortymentId).Count() > 0 && statusy.Contains(w.StatusDokumentu.Mnemonik) && w.Is(TypDokumentu.DokumentZakupu | TypDokumentu.DokumentSprzedazy | TypDokumentu.KorektaDokumentuSprzedazy) ); Dwa pierwsze warunki działają, ale trzeci zwraca błąd Wiem z czego wynika ten błąd - nie można używać własnych funkcji gdy linq odwołuje się do sql - oraz wiem że można to rozwiązać pobierając wszystkie dokumenty i filtrując je po stronie aplikacji. Ale to dodatkowe spowolnienie dla aplikacji. Dlatego chała bym się dopytać czy jest jakaś opcja żeby określić kilka typów już na poziomie wyszukiwania w bazie?
  10. Szczerze to nie wiem o co chodzi ale teraz bez wprowadzania zmian w kodzie działa. Chociaż mam wrażenie że to przestawało działać po większej ilości prób i po restarcie komputera znowu działo
  11. Wygeneruj nazwę pomogło, natomiast z tym przypisywaniem cech jest coś nie tak, raz zadziałało i miałam pisać że obie wersje działają ale teraz po kilku próbach nagle przestało działać i jest ten sam błąd. Czy z tym sposobem gdzie robię new WlasciwoscAsortymentu() jest coś nie tak , czy może tak zostać?
  12. Próbowałam w ta stronę ale uznałam że skoro model jest nullem to pewnie trzeba jakoś od strony modelu. A w jaki sposób przypisywać cechy dla nowego asortymentu? Bo ta metoda coś nie działa Próbowałam tak jak przy dodawaniu cech modelu ale coś tu nie działa using (IAsortyment asortyment = asortymenty.Utworz()) { asortyment.Dane.Nazwa = "A1 Rozmiar: XS Kolor: Czarny"; asortyment.WypelnijNaPodstawieSzablonu(szablon.DaneDomyslne.Towar); asortyment.AutoSymbol(); asortyment.Dane.Model = model.Dane; if (!asortyment.Zapisz()) { asortyment.WypiszBledy(); } asortyment.Dane.WlasciwosciAsortymentu.Clear(); { var wl = new WlasciwoscAsortymentu(); asortyment.Dane.WlasciwosciAsortymentu.Add(wl); wl.LP = 1; wl.Wlasciwosc = wlasciwosci.Dane.Wszystkie().Where(w => w.Id == 100001).FirstOrDefault(); wl.CechyAsortymentu.Add(cechy.Dane.Wszystkie().Where((w) => w.Id == 100011).FirstOrDefault()); } { var wl = new WlasciwoscAsortymentu(); asortyment.Dane.WlasciwosciAsortymentu.Add(wl); wl.LP = 2; wl.Wlasciwosc = wlasciwosci.Dane.Wszystkie().Where(w => w.Id == 100000).FirstOrDefault(); wl.CechyAsortymentu.Add(cechy.Dane.Wszystkie().Where((w) => w.Id == 100008).FirstOrDefault()); } if (!asortyment.Zapisz()) { asortyment.WypiszBledy(); } } Drugi tworze tak samo tylko ma inne cechy { var wl = new WlasciwoscAsortymentu(); asortyment.Dane.WlasciwosciAsortymentu.Add(wl); wl.LP = 1; wl.Wlasciwosc = wlasciwosci.Dane.Wszystkie().Where(w => w.Id == 100001).FirstOrDefault(); wl.CechyAsortymentu.Add(cechy.Dane.Wszystkie().Where((w) => w.Id == 100011).FirstOrDefault()); } { var wl = new WlasciwoscAsortymentu(); asortyment.Dane.WlasciwosciAsortymentu.Add(wl); wl.LP = 2; wl.Wlasciwosc = wlasciwosci.Dane.Wszystkie().Where(w => w.Id == 100000).FirstOrDefault(); wl.CechyAsortymentu.Add(cechy.Dane.Wszystkie().Where((w) => w.Id == 100010).FirstOrDefault()); }
  13. Dzień dobry, w jaki sposób dodaje się asortyment do modelu? Mam coś takiego IModele modele = sfera.PodajObiektTypu<IModele>(); IAsortymenty asortymenty = sfera.PodajObiektTypu<IAsortymenty>(); var mmodel = modele.Dane.Wszystkie().Where(m => m.Sygnatura.PelnaSygnatura == "l100").First(); using (IModel model = modele.Znajdz(mmodel)) { model.Dane.Asortymenty.Add(asortymenty.Dane.Wszystkie().Where(w => w.Id == 100030).FirstOrDefault()); model.Zapisz(); model.WypiszBledy(); } I to powoduje wyjątek na linijce model.Dane.Asortymenty.Add Asortyment o id 100030 oczywiście istnieje.
  14. Dzień dobry, od pewnego czasu podczas wystawiania paragonu przez sferę występuje poniższy wyjątek, nie pojawia się on za każdym razem ale ostatnio jest coraz częściej. Ostatni wyjątek OutOfMemoryException wskazuje na brak pamięci, ale można powiedzieć że mamy jej aż naddto Schemat dzialania programu jest nastepujący Zaloguj się do sfery => przekształć zk na pa => wydrukuj pa => wyloguj się Ostatni komunikat wskazuje na to że bąd wystąpił już podczas logowania, ale jak wykonuję inne operacje typu "dodaj zk" to ten probem nie występuje
  15. To znaczy asortymentu nie zapisuję ponieważ nie chcę modyfikować asortymentu tylko nazwę pozycji na dokumencie, a pozycja na dokumencie nie ma opcji modyfikacji nazwy
  16. Program wywala się na tej linijce produkt.Nazwa = "Nowa nazwa"; więc dalej nie mam możliwości zrobienia czegokolwiek
  17. Witam, załóżmy że mam subiekta nexo pro na 3 stanowiska oraz chcę korzystać ze sfery/sdk. Jak są wtedy liczone licencje ? Trzech użytkowników może się zalogować do subiekta i dodatkowo ci sami użytkownicy mogą korzystać z sdk czy do sdk muszę dokupić kolejne licencje ?
  18. Witam, losowo przy probie połączenia ze sferą występuje mi taki błąd, co najgorsze występuje tylko na serwerze produkcyjnym, na testowym nie zdarzyło mi się ani razu. Problem występuje przy tym kodzie var laucher = new SferaLauncher(Db.host, spolka.podmiot, daneNexo.login, daneNexo.password, Db.login, Db.haslo); return laucher.UruchomSfere(); .... public Uchwyt UruchomSfere() { DanePolaczenia danePolaczenia = DanePolaczenia.Jawne(_serwer, _baza, autentykacjaWindowsDoSerwera: false, uzytkownikSerwera: _uzytkownikSerwera, hasloUzytkownikaSerwera: _hasloSerwera); MenedzerPolaczen mp = new MenedzerPolaczen(); Uchwyt sfera = mp.Polacz(danePolaczenia, InsERT.Mox.Product.ProductId.Subiekt); if (!sfera.ZalogujOperatora(_login, _haslo)) throw new ArgumentException("Nieprawidłowa nazwa lub hasło użytkownika.(" + _baza + "|" + _login + ") - " + sfera.Zaloguj(_login, _haslo)); return sfera; } Połączenie jest tworzone w BackgroundWorker, jest tworzone jedno w połączenie w jednym czasie
  19. Witam, mam program który dodaje zk z zewnętrznego systemu do subiekta, produkty są wyszukiwana na podstawie ean-u, następnie muszę zmienić nazwę pozycji na taką jak w zewnętrznym systemie IAsortymenty produkty = sfera.PodajObiektTypu<IAsortymenty>(); InsERT.Moria.ModelDanych.Konfiguracja konfZk = sfera.PodajObiektTypu<IKonfiguracje>().DaneDomyslne.ZamowienieOdKlienta; using (IZamowienieOdKlienta zk = zamowienia.Utworz(konfZk)) { .... Asortyment produkt = produkty.Dane.Wszystkie().Where(e => e.PodstawowaJednostkaMiaryAsortymentu.PodstawowyKodKreskowy.Kod.Trim()== "123456").FirstOrDefault(); produkt.Nazwa = "Nowa nazwa"; zk.Pozycje.Dodaj(produkt, 1, produkt.JednostkaSprzedazy); ... } i właśnie przy zmianie nazwy dostaję wyjątek W czasie działania tego programu nikt inny nie pracuje na subiekcie, nie są również uruchamiane inne programy. Przy probie pobrania jakichś 30 zk przy 20 potrafi wywalić ten błąd. Wiem że błąd może występować jeśli ktoś inny edytuje produkt ale mam informacje od pracowników że nikt nic nie robi, drugą opcją jest nagle wyłączenie serwera ale wszystko jest cały czas uruchomione.
  20. Ehhh.... jak się człowiek spieszy ... nie ten log skopiowałam 🤦‍♀️
  21. Witam, co może powodować błąd 0x800414C0 ? jedyne informacje jakie mi się pojawiają to Według opisu błąd oznacza "Konto o podanym numerze już istnieje." ale jakie konto ? Chodzi o kontrahenta ?
  22. Witam, mam problem z przepisywaniem parności natychmiastowych z ZK na paragon parametryGrupowania.PrzeniesNatychmiastowe = PrzenoszeniePlatnosciNatychmiastowych.Przepisz; ... ds.WypelnijNaPodstawieZK(zk.Dane.Pozycje, zk.Dane, parametryGrupowania); Na zk mam dodaną testową formę płatności p1 typu "Zapłacono przelewem", na paragonie dodaje mi się wpłata bankowa Czy opcja "przepisz" nie powinna działać w taki sposób że skoro na ZK formę p1 to na dokumencie wynikowym też powinno być p1 ?
  23. Teoretycznie mogę ale po doświadczeniach ze sferą gt jakoś temu nie ufam, obecnie problemem jest to że każdorazowe uruchamianie sfery jest wolne. Zobaczymy jeśli będą problemy ze zbyt wolnym działaniem to spróbuje uruchamiać "na stałe"
×
×
  • Dodaj nową pozycję...