Skocz do zawartości

Paweł Kubacki

InsERT
  • Liczba zawartości

    1 133
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    18

Zawartość dodana przez Paweł Kubacki

  1. Nic się w tym temacie nie zmieniło. Powyższa instrukcja dalej pozostaje aktualna.
  2. Proszę o przesłanie w wiadomości prywatnej danych diagnostycznych ze stanowiska komputerowego, na którym ten problem występuje.
  3. Proszę w pierwszej kolejności uruchomić program serwisowy i w ustawieniach tego programu włączyć szczegółowy poziom logowania zdarzeń Proszę z takimi ustawieniami popracować chwilę, uruchomić program na kilku podmiotach. Następnie proszę o utworzenie danych diagnostycznych z komputera, na którym ten problem występuje i przesłanie ich do mnie w wiadomości prywatnej. Informacja o sposobie komunikacji z serwerem SQL jest akurat w tym przypadku bardzo istotna. Proszę więc powiedzieć trochę więcej o konfiguracji: Ile jest komputerów w sieci? Czy łączą się z serwerem udostępnionym przez internet czy jest to praca w sieci lokalnej lub przez RDP? Czy na wszystkich komputerach występuje ten problem, czy tylko niektórych? Czy problem pojawia się tylko po wgraniu nowej wersji programu, czy przy każdym uruchomieniu?
  4. Taki błąd zazwyczaj jest objawem timeoutu przy przesyłaniu plików programu do tzw. bazy dystrybucyjnej. Pliki te są przesyłane z końcówki do bazy, po to, żeby inne końcówki mogły je pobierać, dzięki czemu przy aktualizacji wystarczy zainstalować nexo na jednej końcówce, żeby nowa wersja rozpropagowała się na pozostałe. Przesyłamy te pliki tylko podczas pierwszego uruchomienia w nowej wersji - potem już nie ma takiej potrzeby. Jeżeli ma Pan dostęp do komputera, na którym jest zainstalowany serwer SQL, to może Pan wgrać pakiety nexo na ten komputer, a potem za pomocą programu serwisowego do bazy dystrybucyjnej.
  5. Jeżeli chce Pan usunąć jedynie wybrane katalogi, to trzeba to zrobić ręcznie. Gdyby chciał Pan usunąć wszystkie, to w programie serwisowym jest do tego operacja o nazwie "Usuń binaria ze stacji roboczej". Proszę jednak nie spodziewać się, że w ten sposób odzyskane będzie tyle miejsca ile widać na tym obrazie. W katalogach tych przechowywane są jedynie linki do binariów programu i informacja pokazywana w systemie operacyjnym jest tutaj myląca. Jeżeli chce Pan odzyskać miejsce zajmowane przez binaria programu, to polecam ten artykuł e-Pomocy.
  6. Mogę potwierdzić to co napisał Pan Andrzej. Taki problem został poprawiony do wersji 40-stej i wpis o tym znalazł się na liście zmian.
  7. Można skorzystać z podglądu na dole okna, a można też skorzystać z nowego podglądu w osobnym oknie (F9), który zmienia się wraz ze zmianą zaznaczonego elementu na liście.
  8. Potrzebny będzie pełny komunikat błędu, gdyż ten jest ucięty w połowie. Proszę też o informację jaki rodzaj aplikacji korzysta w tym przypadku ze sfery, czy jest to aplikacja konsolowa, WPF, Windows Forms, ASP.NET?
  9. Jedną ze zmian w wersji 41, która właśnie się ukazała jest: Poprawiono problem z zapisem raportu SQL, w którym użyto parametru DR. Problem, który Pan opisuje występował, gdy dla parametru DR nie podano domyślnej wartości. Można więc zainstalować nową wersję programu lub pozostać przy obecnej i podać domyślną wartość dla tego parametru. To dlatego, że parametr, który sprawiał problem jest w tym przykładzie zakomentowany.
  10. Może Pan stworzyć plik startowy w programie serwisowym z zapisanymi ustawieniami serwera i wybranej bazy danych oraz podanym scenariuszem uruchomienia. Następnie przekazać ścieżkę do tego pliku do Launchera wraz z parametrami dla aplikacji. Ostatecznie będzie to wyglądało tak InsLauncher.exe /StartupFile=SciezkaDoPlikuStartowego -- parametr1 parametr2
  11. W pierwszej kolejności proszę się upewnić czy program jest zamykany. Samo wylogowanie użytkownika z programu nie zwalnia licencji. W drugiej kolejności proszę się upewnić, że w tle nie chodzą żadne programy, takie jak rozwiązania własne oparte na Sferze nexo lub serwer rozwiązań mobilnych. Do zdiagnozowania problemu może posłużyć program serwisowy. Na danej bazie danych w menu kontekstowym znajduje się operacja "Zarządzanie połączeniami". Widać tam wszystkie procesy podłączone pod bazę danych. Na podstawie nazwy hosta oraz ID procesu hosta można szukać programu, który zjada dodatkową licencję.
  12. Przy założeniu, że w bazie albo jest załącznik związany z FZ, albo nie ma go wcale, to kod jest z grubsza właściwy. Zwrócę jednak uwagę na kilka ważnych szczegółów. Użycie metody Single w sytuacji, gdy w bazie nie ma żadnych załączników wywoła wyjątek i nie dojdzie do tego if, które jest poniżej. Lepsze byłoby tutaj użycie metody SingleOrDefault. Drugie miejsce, na które należy zwrócić uwagę to porównywanie nazwy plików. W bibliotece przechowywana jest nazwa bez rozszerzenia, więc musi Pan taką samą nazwę użyć w warunku Where. Kod ten nie sprawdzi się także, gdy w bibliotece będzie załącznik o takiej samej nazwie, ale nie powiązany z wskazanym FZ.
  13. Dokładnie tak trzeba zrobić. Najpierw wyszukać załącznik i jeżeli taki istnieje, to podmienić jego zawartość za pomocą metody AktualizujZawartosc. W sferze nie ma takiej metody i nie planujemy jej dodawać. Takiego parametru też nie ma.
  14. Wcześniej też się nie usuwał. Jednak sugestia jest ciekawa, więc ją zapisujemy. Dlaczego nie pozwala? Wystarczy włączyć filtr "Typ obiektu powiązanego" i ustawić wartość "(brak)" lub włączyć kolumnę "Liczba powiązanych obiektów" i odfiltrować zapisy z wartością 0. Można i w ten sposób 😉
  15. Aby wywołać podgląd wydruku trzeba uruchomić Sfere z dostępem do interfejsu użytkownika. Polecam w tym celu zapoznanie się z tematem "Pierwsze kroki" -> "Wykorzystanie interfejsu użytkownika" w pomocy do Sfery.
  16. Proszę wykonać takie oto zapytanie na serwerze, na którym występują problemy: SELECT xdr.value('@timestamp', 'datetime') AS [Date], xdr.query('.') AS [Event_Data] FROM (SELECT CAST([target_data] AS XML) AS Target_Data FROM sys.dm_xe_session_targets AS xt INNER JOIN sys.dm_xe_sessions AS xs ON xs.address = xt.event_session_address WHERE xs.name = N'system_health' AND xt.target_name = N'ring_buffer' ) AS XML_Data CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xdr) ORDER BY [Date] DESC Najlepiej gdyby zapytanie to było wykonane w SQL Server Management Studio (SSMS). Jeżeli zwróci ono jakieś wyniki, to proszę otworzyć każdy z XML-i, zapisać i wysłać do mnie w wiadomości prywatnej.
  17. Proszę sprawdzić czy klient ma określoną płatność domyślną i czy nie jest to przypadkiem gotówka? Po realizacji dokumentu zawsze można usunąć wszystkie płatności wywołując ds.Dane.PlatnosciDokumentow.Clear(); W wersji 35.0.0 płatności przeszły dużą przebudowę. Zapowiedź różnic w obsłudze płatności była publikowana w poniższym wątku.
  18. Dziękuje. Teraz wiadomo już znacznie więcej. Ilość zwracanych danych nie jest w tym przypadku aż tak istotna. Bardziej istotna jest sama forma tego zapytania oraz postać generowanego zapytania SQL. Przy pomocy profilera SQL można je podejrzeć. Widać wówczas, że wynikowy SQL zawiera 115 JOIN-ów. Stosując drobną optymalizację można zmniejszyć ilość JOIN-ów do 36 (warunek WHERE ze względu na brak interfejsu użytkownika jest nieco inny niż w Pani przykładzie) zamowienia.Dane.Wszystkie() .Where(x => x.DataWprowadzenia > new DateTime(2000, 5, 1) && x.DataWprowadzenia < new DateTime(2020, 12, 31) && (x.FlagaWlasna == null || x.FlagaWlasna.Id == 1230)) .Select(x => new { Dok = x, Podmiot = x.Podmiot, Adres = x.Podmiot.AdresPodstawowy.Szczegoly, AdresDostaw = x.Podmiot.DomyslnyAdresDostaw.Szczegoly, }) .Select(select => new Zk() { id = select.Dok.Id, numerZamowienia = select.Dok.NumerZewnetrzny, numerZk = select.Dok.NumerWewnetrzny.PelnaSygnatura, chcekd = false, data = select.Dok.DataWprowadzenia, waluta = select.Dok.Waluta.Symbol, kontrahent = new Zk.Kontrahent() { nazwa = select.Podmiot.AdresPodstawowy.Nazwa, nazwaSkrocona = select.Podmiot.NazwaSkrocona, miejscowosc = select.Adres.Miejscowosc, kodPocztowy = select.Adres.KodPocztowy, nrDomu = select.Adres.NrDomu, nrLokalu = select.Adres.NrLokalu, ulica = select.Adres.Ulica, mail = select.Podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc, nip = select.Podmiot.NIP, firma = select.Podmiot.Firma.Nazwa }, kontrahentDostawa = new Zk.Kontrahent() { nazwa = select.AdresDostaw.Adres.Nazwa, miejscowosc = select.AdresDostaw.Miejscowosc, kodPocztowy = select.AdresDostaw.KodPocztowy, nrDomu = select.AdresDostaw.NrDomu, nrLokalu = select.AdresDostaw.NrLokalu, ulica = select.AdresDostaw.Ulica, }, produkty = select.Dok.Pozycje .Select(p => new Zk.Produkt() { ilosc = p.Ilosc, indeks = p.AsortymentAktualny.Symbol, typ = p.RodzajAsortymentuId, cena = p.Cena.BruttoPrzedRabatem, rabat = p.Cena.RabatProcent, vat = p.StawkaVat.Stawka, }) }) .ToList() Jednak najlepszą optymalizację można uzyskać zmieniając nieco formę zapytania. Wówczas ilość JOIN-ów zmniejsza się do 17. (from z in zamowienia.Dane.Wszystkie() let podmiot = z.Podmiot let adres = podmiot.AdresPodstawowy let adresSzczegoly = adres.Szczegoly let adresDostaw = podmiot.DomyslnyAdresDostaw let adresDostawSzczegoly = adresDostaw.Szczegoly where z.DataWprowadzenia > new DateTime(2000, 5, 1) && z.DataWprowadzenia < new DateTime(2020, 12, 31) && (z.FlagaWlasna == null || z.FlagaWlasna.Id == 1230) select new Zk() { id = z.Id, numerZamowienia = z.NumerZewnetrzny, numerZk = z.NumerWewnetrzny.PelnaSygnatura, chcekd = false, data = z.DataWprowadzenia, waluta = z.Waluta.Symbol, kontrahent = new Zk.Kontrahent() { nazwa = adres.Nazwa, nazwaSkrocona = podmiot.NazwaSkrocona, miejscowosc = adresSzczegoly.Miejscowosc, kodPocztowy = adresSzczegoly.KodPocztowy, nrDomu = adresSzczegoly.NrDomu, nrLokalu = adresSzczegoly.NrLokalu, ulica = adresSzczegoly.Ulica, mail = podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc, nip = podmiot.NIP, firma = podmiot.Firma.Nazwa }, kontrahentDostawa = new Zk.Kontrahent() { nazwa = adresDostaw.Nazwa, miejscowosc = adresDostawSzczegoly.Miejscowosc, kodPocztowy = adresDostawSzczegoly.KodPocztowy, nrDomu = adresDostawSzczegoly.NrDomu, nrLokalu = adresDostawSzczegoly.NrLokalu, ulica = adresDostawSzczegoly.Ulica, }, produkty = z.Pozycje .Select(p => new Zk.Produkt() { ilosc = p.Ilosc, indeks = p.AsortymentAktualny.Symbol, typ = p.RodzajAsortymentuId, cena = p.Cena.BruttoPrzedRabatem, rabat = p.Cena.RabatProcent, vat = p.StawkaVat.Stawka, }) }).ToList()
  19. Pani Aniu, jeżeli mamy Pani pomóc w rozwiązaniu tego problemu, to prosiłbym bardzo o umieszczenie oryginalnego kodu tego rozwiązania własnego, bez uproszczeń, modyfikacji i wycinania czegokolwiek. Treść zamieszczonego wyjątku nie odpowiada przykładowi, który Pani podała.
  20. Tak. Jeżeli gotówka jest domyślną płatnością na stanowisku kasowym, to tak właśnie będzie. Jeśli potrzebna jest inne działanie niż to istniejące w programie, to zawsze można to oprogramować według własnych potrzeb, np. tak: var kwotaDoZaplaty = zk.Dane.Wartosc.BruttoPoRabacie; var podmiot = zk.Dane.PodmiotFinansowy(); var domyslneFormyPlatnosci = zk.Dane.CzyDokumentZakupowy() ? podmiot.DomyslneFormyPlatnosci.Where(x => x.FormaPlatnosci.TypPlatnosci.Zakupu) : podmiot.DomyslneFormyPlatnosci.Where(x => x.FormaPlatnosci.TypPlatnosci.Sprzedazy); int precyzja = zk.Dane.Waluta != null ? zk.Dane.Waluta.Precyzja : 2; foreach (var fp in domyslneFormyPlatnosci) { var kwota = Decimal.Round(kwotaDoZaplaty * fp.Procent * 0.01M, precyzja, MidpointRounding.AwayFromZero); if (fp.FormaPlatnosci.TypPlatnosci.Odroczony) { zk.Platnosci.DodajPlatnoscOdroczona(fp.FormaPlatnosci, kwota); } else { zk.Platnosci.DodajPlatnoscNatychmiastowa(fp.FormaPlatnosci, kwota); } } Oczywiście przy wielu płatnościach domyślnych mogą wyjść groszowe różnice w sumie płatności i kwocie do zapłaty. Wówczas trzeba skorygować kwotę jednej z płatności o wartość tej różnicy.
  21. Nie trzeba czyścić kolekcji płatności. Metoda DodajPlatnosciDomyslne sama usuwa wszelkie płatności przed dodaniem płatności domyślnych. Powinno się to zachować tak jakby dokument był wystawiany w programie. Jeżeli klient ma określone płatności domyślne, to one zostaną dodane. Jeżeli klient nie ma określonych płatności domyślnych, ale jest określona płatność domyślna dla stanowiska kasowego, to ona zostanie dodana. Uwzględnione również zostaną ustawienia domyślnych płatności z parametrów płatności (obsługuj, nie obsługuj, obsługuj tylko odroczone).
×
×
  • Dodaj nową pozycję...