Skocz do zawartości

Wojciech Szopiński

InsERT
  • Liczba zawartości

    1 568
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    14

Community Answers

  1. Wojciech Szopiński's post in [Sfera] Zmiana waluty na dokumencie ZK a płatności was marked as the answer   
    Jeśli chce Pan zachować "procent" płatności przy przewalutowywaniu dokumentu wystarczy przed zmianą waluty ustawić odpowiedni tryb przeliczania:
    using (IZamowienieOdKlienta zamowienie = zamowienia.Znajdz(...)) { zamowienie.Platnosci.TrybPrzeliczania |= TrybPrzeliczaniaPlatnosci.PrzeliczanieWgProcentu; // zmiana waluty } Warto jednak wspomnieć, że w przypadku gdy zmienia Pan walutę na dokumencie z już dodanymi pozycjami to samo ustawianie jej tak jak to zostało opisane w przytoczonym wątku może być niewystarczające gdyż wtedy NIE zostaną przeliczone odpowiednio ceny na pozycjach więc będziemy mieli "pomieszane różne systemy walutowe". Można wtedy skorzystać z metody Przewalutuj, która przelicza również odpowiednio ceny na pozycjach:
    ILinieKursowWalut linieKursow = sfera.LinieKursowWalut(); var linia = linieKursow.Dane.Wszystkie().Where(...).FirstOrDefault(); using (IZamowienieOdKlienta zamowienie = zamowienia.Znajdz(...)) { Waluta usd = sfera.Waluty().DaneDomyslne.USD; Waluta pln = waluty.DaneDomyslne.PLN; zamowienie.Platnosci.TrybPrzeliczania |= TrybPrzeliczaniaPlatnosci.PrzeliczanieWgProcentu; zamowienie.ObslugaWaluty.Przewalutuj( // ustawiana waluta: usd // wybrana linia kursów walut: , linia // kurs na wybrany dzień: , linieKursow.Dane.PobierzKursNaDzien(linia, usd, pln, zamowienie.Dane.DataWprowadzenia) , true , null , null); if (!zamowienie.Zapisz()) zamowienie.WypiszBledy(); }  
  2. Wojciech Szopiński's post in [Sfera] Sprawdzenie zablokowania dokumentu was marked as the answer   
    Można oczywiście wyłapywać wyjątki pojawiające się przy próbie edycji zablokowanego obiektu:
    using (IDokumentSprzedazy dokumentSprzedazy = dokumentySprzedazy.Znajdz(dokument)) { try { dokumentSprzedazy.Dane.Uwagi = "zmieniam uwagi!!!"; } catch (InsERT.Mox.Locking.AppLockNotAcquiredException e) { Console.WriteLine($"Dokument {dokumentSprzedazy.Dane.NumerWewnetrzny.PelnaSygnatura} " + $"zablokowany na stacji {e.OwningWorkstationName} " + $"przez użytkownika o Id: {e.OwningUserId}"); } } Ale we wszystkich obiektach biznesowych istnieje też metoda Zablokuj(), która nakłada blokadę aplikacyjną na dany obiekt i jeśli się to nie uda (czyli obiekt został zablokowany na innym stanowisku) - zwraca false:
    using (IDokumentSprzedazy dokumentSprzedazy = dokumentySprzedazy.Znajdz(dokument)) { if (dokumentSprzedazy.Zablokuj()) { Console.WriteLine("Zablokowano - możemy działać."); } else { Console.WriteLine("Nie zablokowano - trzeba poczekać."); } }  
  3. Wojciech Szopiński's post in [sfera]Pobranie dokumentów kilku określonych typów was marked as the answer   
    Można po prostu sprawdzić czy encja dokumentu jest określonego typu:
    w => w is DokumentDZ // dokument zakupu || w is DokumentDS // dokument sprzedaży || w is DokumentKDS // korekta dokumentu sprzedaży  
  4. Wojciech Szopiński's post in Zmiana różnicy ceny netto po rabacie nie aktualizuje pozostałych cen was marked as the answer   
    Potwierdzam występowanie błędu, który zapisuję do poprawy. Na ten moment można go obejść ustawiając cenę po korekcie:
    correctionItemNexo.Cena.NettoPoRabacie = correctionItemNexo.CenaOryginalna.NettoPoRabacie + item.CorrectionUnitNetPriceDifference;  
  5. Wojciech Szopiński's post in Sfera - Rozwiązanie własne. Błąd przy zapisie zamówienia od klienta was marked as the answer   
    Problem jest w mechanizmie numeracji dokumentów - każde nadanie numeru dla dokumentu (czy też innego numerowanego obiektu) poprzedzone jest "rezerwacją" tego numeru (tak aby inny równolegle pracujący program nie "ukradł" go) co polega na dodaniu do bazy wpisu w tabeli Przedzialy z zarezerwowanym numerem i powiązanym z identyfikatorem sesji aplikacyjnej. Taki błąd można łatwo powtórzyć otwierając formularz nowego zamówienia (czy innego obiektu numerowanego), wypełnienie go danymi i przed zapisem uruchomienie na bazie zapytania:
    DELETE FROM mox.application_session; Wtedy program próbuje powiązać "rezerwację" numeru z nieistniejącą w bazie sesją aplikacyjną. Tutaj zapewne taka sytuacja z jakiegoś bliżej nieokreślonego powodu nastąpiła. Na ten moment jedyną potencjalną przyczyną pojawienia się takiego problemu jest usypianie komputera, na którym jest uruchomione rozwiązanie własne co mogło spowodować, że sesja aplikacyjna została potraktowana jako "wygasła". Czy taka sytuacja tutaj mogła nastąpić?
  6. Wojciech Szopiński's post in [SFERA nexo] - faktura zaliczkowa błąd was marked as the answer   
    W takim najprostszym przypadku wystarczy ustawić zaliczkę na pozycji tak:
    decimal zaliczka; //... poz.AspektZaliczkiPozycji.Zaliczka.Brutto = zaliczka; a następnie ustawić taką samą kwotę zaliczki dla całego dokumentu:
    fs.Dane.AspektZaliczki.Zaliczka = zaliczka;  
  7. Wojciech Szopiński's post in Sfera - dynamiczne rezerwowanie asortymenty podczas tworzenia/edycji ZK was marked as the answer   
    Jak rozumiem chodzi o przypadkek, w którym dodajemy pozycje lub zmieniamy ilość w zamówieniu od klienta/fakturze pro forma z pełną/częściową rezerwacją dostaw co powoduje, że automatycznie odświeża nam się ilość w kolumnie "Dostępne"?
    W jaki sposób? Skąd pobiera Pan dane o ilości dostępnej? Z tego co zrozumiałem to z tabeli StanyMagazynowe?
    Jeśli pobrał Pan te dane do jakichś swoich wewnętrznych struktur lub po prostu pobrał Pan całe encje z bazy to one same z siebie nie zaktualizują się. Trzeba te dane pobrać jeszcze raz i odświeżyć na własnym interfejsie użytkownika.
    Można do tego celu wykorzystać metodę OszacujWolnaIloscAsortymentu z interfejsu IDokumentSzacujacyWolnaIloscAsortymentu. W przypadku zamówienia od klienta może to wyglądać tak:
    using (IZamowienieOdKlienta zamowienie = sfera.ZamowieniaOdKlientow().UtworzZamowienieOdKlienta()) { zamowienie.Dane.StatusDokumentu = sfera.StatusyDokumentow().DaneDomyslne.ZamowienieOdKlienta_RezerwacjaDostawy; PozycjaDokumentu pozycja = zamowienie.Pozycje.Dodaj("BANAW200"); decimal iloscDostepna = zamowienie.ObslugaRezerwacji.OszacujWolnaIloscAsortymentu(pozycja.AsortymentAktualny, pozycja.Magazyn ?? zamowienie.Dokument.Magazyn); decimal iloscDostepnaWJednostcePozycji = pozycja.AsortymentAktualny.PodstawowaJednostkaMiaryAsortymentu.PrzeliczIloscNaJednostke(iloscDostepna, pozycja.JednostkaMiaryAs); pozycja.Ilosc += 10m; iloscDostepna = zamowienie.ObslugaRezerwacji.OszacujWolnaIloscAsortymentu(pozycja.AsortymentAktualny, pozycja.Magazyn ?? zamowienie.Dokument.Magazyn); iloscDostepnaWJednostcePozycji = pozycja.AsortymentAktualny.PodstawowaJednostkaMiaryAsortymentu.PrzeliczIloscNaJednostke(iloscDostepna, pozycja.JednostkaMiaryAs); } Metoda ta zwraca dostępną ilość asortymentu w podstawowej jednostce miary asortymentu dlatego jest konieczne ewentualne przeliczenie jej na jednostkę wybraną na pozycji. Dodam jeszcze, że z dokładnie tej samej metody korzysta właśnie wspomniana kolumna "Dostępne" w interfejsie Subiekta.
  8. Wojciech Szopiński's post in [SFERA] - dodanie magazynu was marked as the answer   
    Jednostka organizacyjna to inaczej mówiąc - oddział. Zgodnie z komunikatem magazyn musi być elementem co najmniej jednego oddziału. Typ JednostkaOrganizacyjna to klasa bazowa dla centrali, która zawsze jest jedna i jest tworzona podczas zakładania podmiotu oraz pozostałych oddziałów. Teraz w zależności od tego czy chcemy magazyn podłączyć do centrali można wykorzystać menedżer ICentrale, a jeśli do innego oddziału - menedżer IOddzialy:
    var magazyny = sfera.Magazyny(); var encjaMag = magazyny.Dane.Wszystkie().Where(m=> m.Symbol == dok.Warehouse).FirstOrDefault(); ICentrale centrala = sfera.Centrale(); IOddzialy oddzialy = sfera.Oddzialy(); if (encjaMag != null) /// Jeśli encja istnieje to ją zwraca i pomija dodawanie nowej { return encjaMag; } using (var magazyn = magazyny.Utworz()) { magazyn.Dane.Symbol = dok.Warehouse; magazyn.Dane.Nazwa = dok.Warehouse; // jeśli chcemy dodać go do centrali: nowy.Dane.JednostkiOrganizacyjne.Add(centrala.Dane.Wszystkie().FirstOrDefault()); // jeśli chcemy dodać go do innego oddziału: Oddzial szukany = oddzialy.Dane.Wszystkie().Where(o => o.Symbol == "SZUKANY").FirstOrDefault(); if (szukany != null) nowy.Dane.JednostkiOrganizacyjne.Add(szukany); if (magazyn.Zapisz()) { Console.WriteLine("Poprawnie zapisano centralę."); } else { magazyn.WypiszBledy(); } return magazyn.Dane; }  
  9. Wojciech Szopiński's post in [Sfera] Wysyłanie emaila powiązanego z FS a data wysłania was marked as the answer   
    W wersji 45 wprowadzono zmianę polegającą na specjalnym wyróżnianiu wiadomości pocztowych, stanowiących wysyłkę dokumentów. Cytat z listy zmian:
    Dodano do wiadomości pocztowej pole WysylkaDokumentu i tylko te wiadomości, dla których w tym polu jest wartość "True" są brane pod uwagę przy wyświetlaniu wartości w kolumnie "Data wysłania e-mail". Wystarczy w Pana kodzie ustawić odpowiednio to pole i powinno być ok:
    kopia.Wiadomosc.Dane.WysylkaDokumentu = true;  
  10. Wojciech Szopiński's post in Sfera - Błędne kwoty do zapłaty po zapisie dokumentu was marked as the answer   
    Czy sytuacja występuje w przypadku dodawania nowego dokumentu czy edycji już istniejącego? Ogólnie tak jak napisał Pan Radomił zawsze przed modyfikacjami na płatnościach trzeba wykonać Przelicz gdyż to zapewnia nam, że kwota do zapłaty będzie zgodna z uzupełnioną listą pozycji na dokumencie.
    Metoda, której Pan użył czyli WyliczKwotePlatnosciZKwotyDokumentu jest pomocniczą metodą służącą do przeliczenia kwoty płatności w walucie dokumentu na kwotę płatności w walucie płatności dla przypadków gdy waluta dokumentu jest inna niż waluta płatności. Proszę zwrócić uwagę na to, że ona zwraca wartość typu decimal - ona nie modyfikuje płatności w żaden sposób. Jeśli chce Pan po przeliczeniu dokumentu zmodyfikować odpowiednio płatności to wystarczy po prostu kwotę do zapłaty na dokumencie przepisać do pola KwotaDokumentu w odpowiedniej encji płatności. Odpowiednie przeliczenia po kursie jeśli jest taka potrzeba zostaną wykonane "wewnątrz" edytowanego dokumentu. Można również przed modyfikacją listy pozycji włączyć przeliczanie płatności wg ich procentów:
    IZamowienieOdKlienta zamowienie; //... zamowienie.Platnosci.TrybPrzeliczania |= TrybPrzeliczaniaPlatnosci.PrzeliczanieWgProcentu; Wtedy samo przeliczenie dokumentu powodujące aktualizację kwoty do zapłaty spowoduje, że płatności zostaną odpowiednio zaktualizowane wg dotychczasowych "procentów".
  11. Wojciech Szopiński's post in [Sfera] zmiana kolejności pozycji na dokumencie was marked as the answer   
    Pana kod zmienia LP na encji pobranej z bazy, a nie tej edytowanej przez obiekt biznesowy dokumentu (IZamowienieOdKlienta lub IDokumentSprzedazy). W tym momencie zapis obiektu nie robi nic bo nic nie zostało w nim zmienione. Pętla po pozycjach, na których chce Pan zmienić LP powinna wyglądać tak:
    foreach(var poz in zk.Dane.Pozycje) foreach (var poz in ds.Dane.Pozycje) Poza tym jeszcze mam jedną uwagę - nigdzie nie widzę zwalniania (Dispose) obiektów biznesowych. Warto obejmować je w klauzulę using(...) lub ręcznie Dispose'ować ponieważ bez tego mamy prostą drogę do nadmiernego zużycia pamięci.
  12. Wojciech Szopiński's post in [Sfera] Ustawienie proformy gotowej do realizacji was marked as the answer   
    Pola encji StanRealizacjiZamowienia są aktualizowane automatycznie przy zapisie zamówienia i nie powinny być modyfikowane ręcznie. Stan gotowości do realizacji dla zamówienia jest wyznaczany na podstawie stanów gotowości poszczególnych pozycji więc wystarczy odpowiednio ustawić pole GotowaDoRealizacji dla wszystkich pozycji zamówienia i je zapisać:
    using (var obiektZamowienia = _polaczenieNexo.Uchwyt .PodajObiektTypu<IZamowieniaOdKlientow>() .Znajdz(zamowienieNexo)) { foreach (PozycjaDokumentu pozycjaZamowienia in obiektZamowienia.Dane.Pozycje) pozycjaZamowienia.GotowaDoRealizacji = true; obiektZamowienia.Zapisz(); }  
  13. Wojciech Szopiński's post in [sfera zdarzeniowa] Pozycje Korekt i numery ich partii was marked as the answer   
    Specyfikacje pozycji będą wypełnione dla pozycji korekty zakupowej "na plus" ponieważ tworzy ona nowe partie towaru na magazynie. Dla korekty "na minus" towar jest wydawany z magazynu. Wtedy trzeba najpierw odszukać pozycje dokumentów magazynowych powiązane z pozycją korekty zakupu i na nich sięgnąć do encji typu Wydanie, potem do ich rozchodów, a następnie do partii, z których dane rozchody powstały. Proszę wypróbować taki kod:
    foreach (PozycjaKorekty x in korekta.Pozycje) { IEnumerable<string> numeryPartiiWydanych = x.ZnajdzPozycjeRealizowane(TypDokumentu.PrzyjecieZewnetrzne | TypDokumentu.KorektaPrzyjeciaZewnetrznego) .Where(p => p.Wydanie != null) .SelectMany(p => p.Wydanie.Rozchody.Select(r => r.Partia)) .Select(p => p.Numer) .ToArray(); // zapis danych w arkuszu }  
  14. Wojciech Szopiński's post in [Sfera] Zdarzeniowa, dostęp do realizowanych dokumentów, podczas tworzenia dokumentu was marked as the answer   
    Nie. W obiekcie typu IKontekstZdarzeniaPoZmianieWlasciwosciObiektu<T> w polu NazwaWlasciwosci jest przekazywana nazwa pola, która została zmodyfikowana i w obsłudze zdarzenia należy sprawdzić czy zostało zmienione pole, którego modyfikacja nas interesuje. Np. jeśli chcemy zmienić coś po zmianie sposobu dostawy na dokumencie to należałoby zrobić to np. tak:
    public override void PoZmianieWlasciwosciObiektu(IKontekstZdarzeniaPoZmianieWlasciwosciObiektu<IDokument> kontekst) { if (kontekst.NazwaWlasciwosci.Equals(nameof(Dokument.SposobDostawy))) { // zmieniono pole sposób dostawy - zróbmy coś z tym } } Można oczywiście "zahardkodować" nazwę właściwości w postaci stałego ciągu znaków "SposobDostawy", ale wyrażenie nameof() uodparnia kod na literówki.
    W przypadku dokumentów realizowanych będzie analogicznie:
    public override void PoZmianieWlasciwosciObiektu(IKontekstZdarzeniaPoZmianieWlasciwosciObiektu<IDokument> kontekst) { if (kontekst.NazwaWlasciwosci.Equals(nameof(Dokument.DokumentyRealizowane))) { // zmieniono kolekcję dokumentów realizowanych - trzeba zareagować } } W tym momencie nasz kod będzie reagował na zmianę kolekcji DokumentyRealizowane dla każdego typu dokumentu (ponieważ klient sfery zdarzeniowej jest określony dla ogólnego typu IDokument). Jeśli chcemy np. zareagować na zmianę tej kolekcji tylko dla dokumentów wydań zewnętrznych to trzeba skorzystać z pola Dane w wyżej wspomnianym obiekcie typu IKontekstZdarzeniaPoZmianieWlasciwosciObiektu<T>. W polu tym jest przekazywana encja, która została zmodyfikowana. Oczywiście nie musi to być dokument bo np. gdy zostanie zmienione pole Ilosc na pozycji dokumentu to wtedy zostanie tam przekazana modyfikowana encja pozycji typu PozycjaDokumentu. Wtedy mogłoby to wyglądać tak:
    public override void PoZmianieWlasciwosciObiektu(IKontekstZdarzeniaPoZmianieWlasciwosciObiektu<IDokument> kontekst) { if (kontekst.NazwaWlasciwosci.Equals(nameof(Dokument.DokumentyRealizowane)) && kontekst.Dane is DokumentWZ wz) { // zmieniono kolekcję dokumentów realizowanych wydania zewnętrznego - trzeba zareagować } } Dodatkowo jeszcze można sobie dodać warunki na rodzaj zmiany (przypisanie nowej wartości do pola, dodanie wartości do kolekcji, usunięcie wartości z kolekcji lub wyczyszczenie kolekcji) poprzez pole RodzajZmiany oraz sposób edycji obiektu (czy edycja została wykonana przez formatkę obiektu czy też w inny sposób np. operacją zbiorczą).
×
×
  • Dodaj nową pozycję...