Skocz do zawartości

Zmiana ceny w SDK

Polecane posty

Witam. 

W jednym z cenników w asortymencie chciałem zmienić kwotę netto/brutto.

Próbowałem w następujący sposób:

Cennik cennik = cenniki.Dane.Wszystkie().Where(c => c.Tytul == "Internetowa").FirstOrDefault();
ICennik cennikBO = cenniki.Znajdz(cennik);

var pozycje = cennikBO.ZnajdzPozycjeCennika(o.Dane);
                var poz = pozycje.FirstOrDefault();
                var oPoz = poz.RozpocznijEdycje();
                Console.WriteLine(oPoz.Dane.CenaNetto);
                oPoz.Dane.CenaNetto = 22.22m;
                oPoz.Zapisz();
                poz.ZakonczEdycje();

 

Console log pokazuje normalnie starą cenę, więc na pewno znalazłem dobry obiekt. Niestety cena po przypisaniu niżej nie ulega zmianie. Sprawdzając bool zapisuj i konczenia edycji też jest true, więc wydaje mi się, że powinno się zapisywać. 

 

Link to postu

Mój kod, dodający pozycje do cennika, trochę może bardziej rozbudowany, ale może też pomoże :)

// pobranie danych podstawowych
ICenniki menadzerCennikow = sfera.PodajObiektTypu<ICenniki>();
IWalutyDaneDomyslne walutyDD = sfera.PodajObiektTypu<IWaluty>().DaneDomyslne;
IUzytkownicy uzytkownicy = sfera.PodajObiektTypu<IUzytkownicy>();
IAsortymenty asortyment = sfera.PodajObiektTypu<IAsortymenty>();
    
// pobranie aktualnego kursu walut
ILinieKursowWalut linieKursow = sfera.PodajObiektTypu<ILinieKursowWalut>();
var linia = linieKursow.Dane.Wszystkie().Where(l => l.Nazwa == "NBP - kursy średnie").FirstOrDefault();
var waluta = walutyDD.PLN; 
if(results.currency=="PLN") waluta = walutyDD.PLN;
if(results.currency=="EUR") waluta = walutyDD.EUR;
if(results.currency=="USD") waluta = walutyDD.USD;
                
int id; id = results.id;
var cennikDoEdycji = menadzerCennikow.Dane.Wszystkie().Where(c => c.Id == id).First(); // wybieramy cennik po Id              
using (ICennik cennik = menadzerCennikow.Znajdz(cennikDoEdycji)) // edytujemy cennik
  {
  Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - dodawanie pozycji do cennika: "+cennik.Dane.Tytul);
  // dodawanie pozycji
  foreach(var posadd in results.pos)
    {
    int aid; decimal aprice; decimal sprice;
    aid = posadd.id; aprice = posadd.price; sprice = posadd.sellprice;
    // obliczenie ceny względem waluty cennika i ceny dodawanej
    if(cennik.Dane.Waluta.Symbol!=waluta.Symbol) {
      var kurs = linieKursow.Dane.PobierzKursNaDzien(linia,waluta,cennik.Dane.Waluta,DateTime.Now);
      aprice = Math.Round(aprice * kurs.Kurs,4);
      sprice = Math.Round(sprice * kurs.Kurs,4);
      }
    else {
      aprice = Math.Round(aprice,4);
      sprice = Math.Round(sprice,4);                      
      }  
    // dopisanie pozycji do cennika
    Asortyment a = asortyment.Dane.Wszystkie().Where(t => t.Id == aid).First(); // pobieram asortyment
    Console.WriteLine("Dopisanie pozycji: "+a.Nazwa);  
    var pos = cennik.Pozycje.Dodaj(a); // dodaje asortyment
    pos.RozpocznijEdycje(); // zaczynam go edytować
    pos.CenaBazowa = aprice; // ustalam jego cenę
    pos.CenaNetto = sprice; // ustalenie ceny sprzedaży
    pos.ZakonczEdycje(); // kończę edycję                  	
    }
  // zmiana paremtrów cennika
  string sign; sign = results.sign;
  var wprowadzil = uzytkownicy.Dane.Wszystkie().Where(p => p.Sygnatura == sign).FirstOrDefault();
  cennik.UstawStatus(wprowadzil,StatusCennika.Zatwierdzony);
  // zapisanie cennika
  if(cennik.Zapisz())  { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - zapisano cennik: "+cennik.Dane.Tytul);  response = "{ \"title\":\""+cennik.Dane.Tytul+"\", \"id\":\""+cennik.Dane.Id+"\" }"; }
  else { Globals.errors = ""; cennik.WypiszBledy(); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - błąd podczas aktualizowania cennika: "+Globals.errors); response = "{ \"error\":\""+Globals.errors+"\" }"; }
  }

 

  • Lubię to 1
Link to postu
1 godzinę temu, Paweł Kubacki napisał:

Na pierwszy rzut oka wydaje mi się, że do pełni szczęścia brakuje jeszcze zapisu cennika (cennikBO).

Faktycznie, brakowało zapisu. 
Dodałem zapis bezpośrednio pod tym, ale trwa baaardzo długo z powodu dużej ilości asortymentu w cenniku. Problem powiększa fakt, że chcę zmieniać ceny określonym produktom, więc ten zapis był w pętli. Postanowiłem więc wystawić zapis cennika poza pętle, ale efekt był zaskakujący:
image.png.c3f14b457d0d6756da86cf3616996d4b.png

Edit: 
Nie ma możliwości zmiany ceny od strony asortymentu? Robiąc to fizycznie w subiekcie podczas edycji pojedynczego asortymentu zapisuje się to natychmiast, jednak wchodząc w cenniki i edytując w nim również jedną cenę tego asortymentu zapis trwa kilka minut.

Edytowane przez Krzysztof Styś
Dodatkowe pytanie
Link to postu

Zauważyłem w Pana kodzie zbędne wywołanie operacji

oPoz.Zapisz();

Nie ma potrzeby wywoływania metody Zapisz na pozycji cennika, bo i tak pozycja ta zostanie zapisana dopiero przy zapisie cennika. Mówię to tak na marginesie, bo nie zauważyłem żadnych negatywnych skutków użycia tej metody w tym miejscu.

Sprawdziłem Pana skrypt i bez względu na to czy metoda Zapisz na pozycji cennika jest wywoływana, czy nie skrypt i tak wykonuje się poprawnie. Nie zauważyłem też żadnych błędów przy zapisie cennika zarówno wewnątrz pętli jak i poza nią. Jednak odradzam wywoływanie zapisu wewnątrz pętli, nie ma powodu by tak robić.

Skrypt ten zastosowany na cenniku z ponad 15 000 pozycji i aktualizacją 20 z nich wykonuje się u mnie 8 sekund. Jest to sumaryczny czas potrzebny na wczytanie takiego cennika, edycję 20 pozycji i zapis.

Przypuszczam więc, że problem jest ukryty gdzieś indziej. Nie pokazał Pan całego kodu swojego rozwiązania, tylko jego wycinek. Może gdybym widział całość udałoby mi się znaleźć wadliwą konstrukcję w tym kodzie.

Link to postu

Okazało się, że jak sobie program przez noc "odpoczął" problem z wewnętrznym błędem SQL ustąpił.
Przypuszczam jedynie, że może faktycznie mogło być to też powiązane z niepotrzebnym zapisem IPozycjaCennika, o której powiedział Pan wyżej. 
Zapis całego cennika po zmianie ponad 50 asortymentów to jakieś 30s.
Tak czy siak, dziękuję za odpowiedzi w temacie.

 

Nie chciałem otwierać drugiego wątku, więc postanowiłem w tym poruszyć jeszcze drugą kwestię.

Chciałem skorzystać z programu eLinker. Podczas synchronizacji zamówień do subiekta wystąpił błąd z tego właśnie programu "Nie można zapisać danych. Numer nie został zapisany".

Skontaktowałem się więc z twórcami oprogramowania i okazało się, że ten problem okazał się ich zaskoczyć.
Postanowiłem jeszcze dla pewności przetestować go na bazie testowej Nexo i na niej zadziałał normalnie.
Ostatecznie postanowiłem przetestować samemu zapis zamówienia przez własne rozwiązane. Podczas zapisu dostałem ten sam błąd, mimo, że zrobiłem to na przykładowym skrypcie podanym w opisie sfery.
Śmiało więc można założyć, że problem leży bezpośrednio w tej konkretnej bazie. Pytanie więc, jak ten problem rozwiązać.

52920360_410786196323764_3767662268305637376_n.png?_nc_cat=107&_nc_ht=scontent-waw1-1.xx&oh=93c0a64b5d7d5ff5b84d6e7c305fb689&oe=5D1D1F12

Link to postu

W takim razie problem muszę wstrzymać. Testując chwilę temu ten przykład u mnie również on zadziałał mimo, że uruchomiłem go w ten sam sposób.
Jak wspominałem, ten problem dotyczył synchronizacji zamówień przez eLinkera, gdzie pokazywał się ten błąd, potem w SDK. Z drugą kwestią jest już w porządku, natomiast z eLinkerem nadal nie, więc to z twórcami tego programu się skontaktuję. 

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