Autor Wątek: Własny raport LINQ pomoc  (Przeczytany 2936 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline puziek

  • Nowy użytkownik
  • *
  • Wiadomości: 10
  • Reputacja +0/-0
  • Wersja programu: Subiekt GT, Subiekt NEXO
Własny raport LINQ pomoc
« dnia: 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"?

Offline fosuk

  • Nowy użytkownik
  • *
  • Wiadomości: 33
  • Reputacja +7/-0
  • Wersja programu: nexo
Odp: Własny raport LINQ pomoc
« Odpowiedź #1 dnia: 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.

Offline puziek

  • Nowy użytkownik
  • *
  • Wiadomości: 10
  • Reputacja +0/-0
  • Wersja programu: Subiekt GT, Subiekt NEXO
Odp: Własny raport LINQ pomoc
« Odpowiedź #2 dnia: 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?
« Ostatnia zmiana: Czerwiec 30, 2016, 09:46:59 wysłana przez puziek »

Offline fosuk

  • Nowy użytkownik
  • *
  • Wiadomości: 33
  • Reputacja +7/-0
  • Wersja programu: nexo
Odp: Własny raport LINQ pomoc
« Odpowiedź #3 dnia: 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.

Offline puziek

  • Nowy użytkownik
  • *
  • Wiadomości: 10
  • Reputacja +0/-0
  • Wersja programu: Subiekt GT, Subiekt NEXO
Odp: Własny raport LINQ pomoc
« Odpowiedź #4 dnia: 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/

Offline fosuk

  • Nowy użytkownik
  • *
  • Wiadomości: 33
  • Reputacja +7/-0
  • Wersja programu: nexo
Odp: Własny raport LINQ pomoc
« Odpowiedź #5 dnia: 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

Forum Użytkownikow Subiekt GT

Odp: Własny raport LINQ pomoc
« Odpowiedź #5 dnia: Lipiec 01, 2016, 13:25:53 »