Skocz do zawartości

Aktualizacja ceny cennikowej

Polecane posty

Mam problem z aktualizacją ceny w istniejącym asortymencie - przy próbie przypisania ceny, dostaję błąd:

Cytat

Modyfikacja pola CenaNetto encji PozycjaCennika nie powiodła się, ponieważ albo encja nie została przyłączona do obiektu kontrolującego modyfikację danych (biznesowego), albo ten, do którego jest przyłączona nie pozwala na zmianę tego konkretnego pola.

 

Poniżej fragment kodu, za pomocą którego próbuję dokonać tej modyfikacji:

IAsortymenty asortymenty = sfera.PodajObiektTypu<IAsortymenty>();
IJednostkiMiar jednostki = sfera.PodajObiektTypu<IJednostkiMiar>();
ICechyAsortymentu cechy = sfera.PodajObiektTypu<ICechyAsortymentu>();
IWalutyDaneDomyslne waluty = sfera.PodajObiektTypu<IWaluty>().DaneDomyslne;
                  
int aid; aid = results.id;
var asDoEdycji = asortymenty.Dane.Wszystkie().Where(a => a.Id == aid).FirstOrDefault();
                   
if(asDoEdycji == null) {}
else
  {                  
  using (IAsortyment towar = asortymenty.Znajdz(asDoEdycji))
    {
    // cena
    decimal price; string cur;
    price = results.price; cur = results.cur;
    if(price!=0)
      {
      towar.Dane.CenaEwidencyjna = 0.01m;
      // cennik
      foreach (PozycjaCennika poz in towar.Dane.PozycjeCennika)
        {
        //Console.WriteLine(poz.Cennik.PoziomCen.Nazwa+" <- "+price);
        if(cur=="PLN" && poz.Cennik.PoziomCen.Nazwa=="Odtworzeniowa PLN") poz.CenaNetto = price;
        if(cur=="EUR" && poz.Cennik.PoziomCen.Nazwa=="Odtworzeniowa EUR") poz.CenaNetto = price;
        }
      }
    }

Edytując ten asortyment z poziomu Subiekta, nie mam żadnych błędów, więc coś widać jest nie tak w moim kodzie, który przy dodawaniu działał prawidłowo.

Link to postu

Tak się dzieje, ponieważ pozycje cennika należą do cennika, a nie do asortymentu w sensie obiektów biznesowych w Sferze. Przy dodawaniu można wprawdzeie ustawić od razu ceny, ale to wyjątek. Natomiast zawsze działać będzie edycja pozycji cennika od strony cennika i tak to jest dokładnie zaimplementowane "z poziomu Subiekta". Z tym, że pozycje cennika są trochę specyficzne, dlatego proszę rzucić okiem na rozdział Model obiektowy - Pozycje uproszczone.

Link to postu

Yhym, no cóż zmyliło mnie trochę dodawanie oraz edycja z poziomu Subiekta. No ok, trop z helpa jest ok, trochę musiałem go zmienić, ponieważ ja akurat aktualizuję konkretną cenę w konkretnym produkcie. Mój wynikowy kod jest tak:

int aid; aid = results.id;
decimal price; string cur;
price = results.price; cur = results.cur;
                  
ICenniki cenniki = sfera.PodajObiektTypu<ICenniki>();
Cennik cennik = cenniki.Dane.Wszystkie().Where(c => c.Tytul == "Odtworzeniowa "+cur).FirstOrDefault();
IAsortymenty asortymenty = sfera.PodajObiektTypu<IAsortymenty>();
                  
var asDoEdycji = asortymenty.Dane.Wszystkie().Where(a => a.Id == aid).FirstOrDefault();
                  
if (cennik != null)
  {
  using (ICennik oCennik = cenniki.Znajdz(cennik))
    {
    var poz =	oCennik.Pozycje.ZnajdzPozycjeCennika(asDoEdycji).FirstOrDefault();
    var oPoz = poz.RozpocznijEdycje();
    oPoz.Dane.CenaNetto = price;
    if(!poz.ZakonczEdycje()) oPoz.WypiszBledy();
    if(!oCennik.Zapisz()) oCennik.WypiszBledy();	
    }
  }

Jakie sugestię, jak mógłbym się dobić do cennika konkretnej pozycji przy mniejszym obciążeniu, ponieważ obecna metoda jest piekielnie wolna i obciążająca serwer - dwa Xeony E5-2420 v2, chodzą na pełnej mocy i około 1,5 sekundy potrzeba na aktualizację jednego asortymentu.

Nieważne, okazało się, że koledzy z działu projektowego, po cichu włączyli Sobie rendering 3D i to oni mi zabrali moc z serwera. Sprawdzę na nie obciążonym serwerze jak to działa.

Edytowane przez Radomił Ząbik
Link to postu

No ok przy nie obciążonej maszynie, wypada jakieś 0,5 sekundy na wpis, ale sama Sfera nie przekracza 5%, więc pewnie ograniczenie rdzenia. Dyski są SSD, Samsung 950PRO, a RAMu mamy 64GB, więc też tu nie powinno się dławić.

 

Wpisów w bazie asortymentu mamy około 6 tyś. Cenniki mamy dwa (jeden PLN, drugi EUR). Oba są główne.

Link to postu

W sumie można by jeszcze ten kod uprościć rezygnując z edycji cennika, która tu, de facto, nie ma miejsca. Należy się więc posłużyć managerem pozycji cennika

IPozycjeCennika pozycje = sfera.PodajObiektTypu<IPozycjeCennika>();

dalej, sięgnąć od razu do interesującej nas pozycji

var pozycja = pozycje.Dane.Wszystkie().Where(p => p.Cennik.Id == cennik.Id && p.Asortyment.Id == idTowaru).FirstOrDefault();

i zaktualizować pozycję wykorzystując obiekt biznesowy pozycji, czyli:

using (IPozycjaCennika poz = pozycje.Znajdz(pozycja))
{
    poz.Dane.CenaBrutto = decimal.Round(nowaCena, cennik.Waluta.Precyzja, MidpointRounding.AwayFromZero);

    if (!poz.Zapisz())
        poz.WypiszBledy();
}

Może się uda w ten sposób oszczędzić trochę czasu.

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