Forum Użytkownikow Subiekt GT

NEXO => Subiekt NEXO => Wątek zaczęty przez: puziek w Czerwiec 28, 2016, 12:40:14

Tytuł: Własny raport LINQ pomoc
Wiadomość wysłana 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"?
Tytuł: Odp: Własny raport LINQ pomoc
Wiadomość wysłana przez: fosuk w Czerwiec 28, 2016, 13:12:46
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.
Tytuł: Odp: Własny raport LINQ pomoc
Wiadomość wysłana przez: puziek w Czerwiec 30, 2016, 08:48:10
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?
Tytuł: Odp: Własny raport LINQ pomoc
Wiadomość wysłana przez: fosuk w Lipiec 01, 2016, 12:08:05
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.
Tytuł: Odp: Własny raport LINQ pomoc
Wiadomość wysłana przez: puziek w Lipiec 01, 2016, 12:56:32
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/
Tytuł: Odp: Własny raport LINQ pomoc
Wiadomość wysłana przez: fosuk w Lipiec 01, 2016, 13:25:53
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