Forum Użytkownikow Subiekt GT
NEXO => Subiekt NEXO => Wątek zaczęty przez: puziek w Czerwiec 28, 2016, 12:40:14
-
Hej, mam utworzony raport:
source
.Where(a => (a.Dokument.KategoriaDokumentuId == pa || a.Dokument.KategoriaDokumentuId == fs) && (a.Dokument.Magazyn.Symbol == magazyn.Symbol ) && ((a.Dokument.DataWprowadzenia >= DataOd)&&(a.Dokument.DataWprowadzenia <= DataDo)))
.Select((PozycjaDokumentu pozycjaDokumentu) => new Wynik
{
Id = pozycjaDokumentu.Id,
Nazwa = pozycjaDokumentu.AsortymentAktualny.Nazwa,
ilosc = pozycjaDokumentu.Ilosc,
CenaPozycji = pozycjaDokumentu.Wartosc.BruttoPrzedRabatem,
SymbolTowaru = pozycjaDokumentu.AsortymentAktualny.Symbol,
});
Chciałbym wynik grupować po polu "SymbolTowaru", tak żeby w polach "ilosc" i "CenaPozycji" były sumy dla danego symbolu.
Jak powinno wyglądać użycie GroupBy i SUM()?
Jeszcze mam pytanie czy będzie łatwiej jak głównym elementem zamiast "PozycjaDokumentu" będzie "DokumentDS"?
-
Ad.1.
source
.Select((PozycjaDokumentu pozycjaDokumentu) => new Wynik
{
Id = pozycjaDokumentu.Id,
Nazwa = pozycjaDokumentu.AsortymentAktualny.Nazwa,
ilosc = pozycjaDokumentu.Ilosc,
CenaPozycji = pozycjaDokumentu.Wartosc.BruttoPrzedRabatem,
SymbolTowaru = pozycjaDokumentu.AsortymentAktualny.Symbol,
})
.GroupBy(p => p.SymbolTowaru)
.Select(group => new Wynik
{
Id = group.Select(i => i.Id).FirstOrDefault(),
Nazwa = group.Select(i => i.Nazwa).FirstOrDefault(),
ilosc = group.Sum(i => i.ilosc),
CenaPozycji = group.Sum(i => i.CenaPozycji),
SymbolTowaru = group.Key,
})
Ad.2. Moim zdaniem lepiej użyć pozycji dokumentu, bo:
a) jest prościej
b) przy zachowaniu idów pozycji zachowuje się funkcje pokazywania/poprawiania towarów w wynikach raportu.
-
Dziękuję, tylko mam jeszcze pytanie.
Czy to normalne, że ten kod wykonuje się tak długo aż subiekt pokazuje brak odpowiedzi a dopiero później pokazuje wynik?
dodałem .Where(a => (a.Dokument.KategoriaDokumentuId == pa || a.Dokument.KategoriaDokumentuId == fs) && (a.Dokument.Magazyn.Symbol == magazyn.Symbol ) && ((a.Dokument.DataWprowadzenia >= DataOd)&&(a.Dokument.DataWprowadzenia <= DataDo)))
żeby operować tylko na paragonach i fakturach + wybrany magazyn i data, żeby sprawdzić jak wygląda sprawa dla mniejszej ilości pozycji ale dalej ten sam problem
I jeszcze w jaki sposób mogę podzielić jeszcze wynik w zależności od waluty?
-
Z grupowaniem dodatkowo wg waluty:
source
.Select((PozycjaDokumentu pozycjaDokumentu) => new
{
Id = pozycjaDokumentu.Id,
Nazwa = pozycjaDokumentu.AsortymentAktualny.Nazwa,
ilosc = pozycjaDokumentu.Ilosc,
CenaPozycji = pozycjaDokumentu.Wartosc.BruttoPrzedRabatem,
SymbolTowaru = pozycjaDokumentu.AsortymentAktualny.Symbol,
Waluta = pozycjaDokumentu.Dokument.Waluta.Symbol,
})
.GroupBy(p => new { s = p.SymbolTowaru, w = p.Waluta })
.Select(group => new Wynik
{
Id = group.Select(i => i.Id).FirstOrDefault(),
Nazwa = group.Select(i => i.Nazwa).FirstOrDefault(),
ilosc = group.Sum(i => i.ilosc),
CenaPozycji = group.Sum(i => i.CenaPozycji),
SymbolTowaru = group.Key.s,
Waluta = group.Key.w,
})
Nie wiem skąd się biorą parametry pa, fs, więc nie uwzglęniłem where'a.
Po uruchomieniu raportu można wyłączyć kolumnę Waluta i włączyć grupowanie po walucie - to zostanie zapamiętane i będzie ładnie podzielone wg waluty.
Co do szybkości działania to nie widzę powodu, żeby działało aż tak powoli, bo u mnie działa szybko ;)
Może to kwestia ilości danych.
-
PA i FS mają wartość id typu dokumentu, 3 dla paragonu i 1 faktury, albo odwrotnie ;p chodziło o to że nie mogłem nigdzie w opcjach parametru listowego bazodanowego znaleźć wyboru dokumentów jakie mają się wyświetlać w raporcie więc poszedłem trochę na około ;p
A jak wyglądałaby składnia if'a w linq o ile jest coś takiego? Bo chciałbym mnożyć sumę cen pozycji w zależności od wybranego magazynu/
-
Można używać operatora (a ? b : c), np.
Przelicznik = pozycjaDokumentu.Dokument.Magazyn.Symbol == "MAG" ? 2m : 1m
albo w bardziej skomplikowanym przypadku:
Przelicznik = pozycjaDokumentu.Dokument.Magazyn.Symbol == "MAG" ? 2m :
pozycjaDokumentu.Dokument.Magazyn.Symbol == "MAP" ? 3m :
pozycjaDokumentu.Dokument.Magazyn.Symbol == "OUT" ? 4m : 1m