Skocz do zawartości

SFERA - Funkcja zwracajaca pole "cena z ostatniej dostawy"

Polecane posty

Nie ma takiego pola z wyliczoną wartością. Trzeba ją sobie wyliczyć. Np. tak:

IAsortymenty asoMgr = sfera.PodajObiektTypu<IAsortymenty>();
Asortyment aso = asoMgr.Dane.WyszukajPoSymbolu("TOWAR1");

var przyjecie = aso.Przyjecia
    .SelectMany(p => p.Partie)
    .SelectMany(pr => pr.Przychody
        .OrderByDescending(p => p.PrzychodPierwotny == null ? p.Data : p.PrzychodPierwotny.Data)
        .ThenByDescending(p => p.Id))
            .Select(p => p.Partia.Przyjecie).FirstOrDefault();
                
var kosztPrzyjecia = przyjecie.KorektyKosztow.Concat(new[] { przyjecie.KosztPierwotny })
            .OrderByDescending(kosztPrzyj => kosztPrzyj.Lp).FirstOrDefault();
var kosztDodatkowy = (przyjecie.KosztyDodatkowe.Sum(kosztDod => (decimal?)kosztDod.Kurs * kosztDod.Wartosc) ?? 0m) / przyjecie.Ilosc;
var cenaZOstatniejDostawy = (kosztPrzyjecia.Wartosc * kosztPrzyjecia.Kurs) / kosztPrzyjecia.Ilosc + kosztDodatkowy;

 

Link to postu

Dziekuje za gotowca! nie wiedzialem ze to az tak "zakopane" skoro w asortymencie informacje o roznych cenach (srednia, najnizsza, ostatnia dostawa, srednia wazona, itp) sa zwracane dosc szybko.

 

Wazne ze dziala.

 

Tylko jedna zmiana:

.Select(p => p.Partia.Przyjecie).FirstOrDefault();

na 

.Select(p => p.Partia.Przyjecie).LastOrDefault();

przypadek 1. to cena z najstarszej dostawy

przypadek 2. to cena z ostatniej dostawy

 

Raz jeszcze dziekuje za szybka i sprawna pomoc !

Link to postu
12 godzin temu, Tomcio Paluch napisał:

Dziekuje za gotowca! nie wiedzialem ze to az tak "zakopane" skoro w asortymencie informacje o roznych cenach (srednia, najnizsza, ostatnia dostawa, srednia wazona, itp) sa zwracane dosc szybko.

 

Są to wartości dynamiczne. Gdyby były gdzieś przechowywane to trzeba by było stale je aktualizować.

 

Cytat

 

Wazne ze dziala.

 

Tylko jedna zmiana:


.Select(p => p.Partia.Przyjecie).FirstOrDefault();

na 


.Select(p => p.Partia.Przyjecie).LastOrDefault();

przypadek 1. to cena z najstarszej dostawy

przypadek 2. to cena z ostatniej dostawy

 

Na pewno FirstOrDefault(). Bład jest tylko w sortowaniu - pomyłka przy przepisywaniu :/. Nie są sortowane wszystkie przychody, tylko z danej partii, a reszta leci jak baza danych zwróci (dlatego udało się z LastOrDefault(), ale to nie zawsze dobrze zadziała). Powinno być więc:

var przyjecie = aso.Przyjecia
    .SelectMany(p => p.Partie)
    .SelectMany(pr => pr.Przychody) //<- dodany nawias - wszystkie przychody zebrane do posortowania
        .OrderByDescending(p => p.PrzychodPierwotny == null ? p.Data : p.PrzychodPierwotny.Data)
        .ThenByDescending(p => p.Partia.Przyjecie.Id) // <- usunięty nawias
            .Select(p => p.Partia.Przyjecie).FirstOrDefault();
                
var kosztPrzyjecia = przyjecie.KorektyKosztow.Concat(new[] { przyjecie.KosztPierwotny })
            .OrderByDescending(kosztPrzyj => kosztPrzyj.Lp).FirstOrDefault();
var kosztDodatkowy = (przyjecie.KosztyDodatkowe.Sum(kosztDod => (decimal?)kosztDod.Kurs * kosztDod.Wartosc) ?? 0m) / przyjecie.Ilosc;
var cenaZOstatniejDostawy = (kosztPrzyjecia.Wartosc * kosztPrzyjecia.Kurs) / kosztPrzyjecia.Ilosc + kosztDodatkowy;

 

Edytowane przez Jarek K.
Link to postu
  • 7 lat później...
×
×
  • Dodaj nową pozycję...