Raport zasobów
Moderator: mikey
Raport zasobów
Witam, chcę napisać raport, który pokazałby mi na ile zamówień wystarczy mi towaru na magazynie, lecz szczegółowo z podziałem na konkretne dokumenty i towary.
Czyli jeśli mam towar na 3 zamówieniach w ilości po 3 szt., a na magazynie 5 szt. to raport chronologicznie odejmie ilość od stanu na zamówieniu, które ma wcześniejszą datę wystawienia i pokaże mi ile na danym zamówieniu możne być zrealizowanych sztuk, a gdzie są braki.
Czy to chronologiczne pomniejszanie powianiem zrobić kursorem czy funkcją?
Ewentualnie proszę o jakieś podpowiedzi.
Z góry dzięki.
Czyli jeśli mam towar na 3 zamówieniach w ilości po 3 szt., a na magazynie 5 szt. to raport chronologicznie odejmie ilość od stanu na zamówieniu, które ma wcześniejszą datę wystawienia i pokaże mi ile na danym zamówieniu możne być zrealizowanych sztuk, a gdzie są braki.
Czy to chronologiczne pomniejszanie powianiem zrobić kursorem czy funkcją?
Ewentualnie proszę o jakieś podpowiedzi.
Z góry dzięki.
- STAY_PJE
- Posty: 651
- Rejestracja: 24 wrz 2009, 12:08
- Rola: Konsultant CDN XL
- Lokalizacja: Warszawa i od Helu do Wawelu
- Kontakt:
Re: Raport zasobów
Procedurą zawierającą kursor ja bum zrobił.
Re: Raport zasobów
Jeżeli masz SQL 2012 bądź wyższy to możesz odwoływać się do poprzedniej wartości poprzez LAG i w łatwy sposób to obliczać, a jeśli nie to np. przechowywać dane w tabeli tymczasowej po to aby odpowiednio to przeliczyć funkcją sumującą z wykorzystaniem podzapytania i dopiero wyświetlać wyniki.
Pozdrawiam,
Mateusz
Pozdrawiam,
Mateusz
-
Canonier450
- Posty: 3
- Rejestracja: 21 paź 2015, 09:44
- Rola: Konsultant CDN XL
Re: Raport zasobów
najszybciej zadziała zapytanie rekursywne CTE.
Rozwiązanie z kursorem będzie bardzo wolne - można takie zastosować przy małej ilości danych.
Rozwiązanie z kursorem będzie bardzo wolne - można takie zastosować przy małej ilości danych.
Re: Raport zasobów
Dzięki za podpowiedzi.
Mateuszu, mam sql 2012 i ta funkcja lag fajnie działa, ale pewnie jest potrzebny jednoczesny update tabeli, którego nie wiem jak zrobić.
Przygotowałem sobie w tabeli #test zbór danych na którym wszystko będzie liczone i mam takie dane dla towaru.
DataDok TwrID TwrKod Ilosc_na_zam StanMag Pozostaje
2015-03-01 491 3052 2 3 1
2015-03-01 491 3052 1 0 0
2015-03-02 491 3052 2 0 0
2015-03-02 491 3052 1 0 0
2015-03-02 491 3052 1 0 0
2015-03-02 491 3052 1 0 0
2015-03-01 582 5858 5 10 5
2015-03-03 582 5858 3 0 0
Mateuszu, mam sql 2012 i ta funkcja lag fajnie działa, ale pewnie jest potrzebny jednoczesny update tabeli, którego nie wiem jak zrobić.
Przygotowałem sobie w tabeli #test zbór danych na którym wszystko będzie liczone i mam takie dane dla towaru.
DataDok TwrID TwrKod Ilosc_na_zam StanMag Pozostaje
2015-03-01 491 3052 2 3 1
2015-03-01 491 3052 1 0 0
2015-03-02 491 3052 2 0 0
2015-03-02 491 3052 1 0 0
2015-03-02 491 3052 1 0 0
2015-03-02 491 3052 1 0 0
2015-03-01 582 5858 5 10 5
2015-03-03 582 5858 3 0 0
Re: Raport zasobów
Witam
Myślę że moduł Zamówień /ogólne/ niezrealizowane pozycje zamówień
tam jest odpowiedź na twoje pytanie
Grzegorz
Myślę że moduł Zamówień /ogólne/ niezrealizowane pozycje zamówień
tam jest odpowiedź na twoje pytanie
Grzegorz
Re: Raport zasobów
Grzegorzu nie o to chodzi.
Mam coś takiego:
Czy jest możliwe aby kursor resetował się dla każdego towaru?
Mam coś takiego:
Kod: Zaznacz cały
declare @licz int; declare @wynik int; declare @rown int
declare @rowtwr int; declare @twrid int; declare @ilosc int;
declare @stanmag int;
declare kursor cursor
for select rown, rowtwr, twrid, Ilosc, StanMag, Wynik from #test
open kursor;
fetch next from kursor into @rown, @rowtwr, @twrid, @Ilosc, @StanMag, @Wynik;
WHILE @@FETCH_STATUS = 0
begin
set @licz = (@StanMag - @Ilosc)
update #test set Wynik = @licz where @rown = rown and @twrid = TwrID
update #test set StanMag = @licz where @twrid = TwrID and ROWTwr = @rowtwr+1
fetch next from kursor into @rown, @rowtwr, @twrid, @Ilosc, @StanMag, @Wynik
end
close kursor;
deallocate kursor;Re: Raport zasobów
Witam, poradziłem sobie z tym. Utworzyłem tabelę która zawiera tylko id towarów i na niej działa kursor, w który wpisałem poniższy kursor.
Dzięki za sugestie.
Dzięki za sugestie.
Jaras pisze:Grzegorzu nie o to chodzi.
Mam coś takiego:Czy jest możliwe aby kursor resetował się dla każdego towaru?Kod: Zaznacz cały
declare @licz int; declare @wynik int; declare @rown int declare @rowtwr int; declare @twrid int; declare @ilosc int; declare @stanmag int; declare kursor cursor for select rown, rowtwr, twrid, Ilosc, StanMag, Wynik from #test open kursor; fetch next from kursor into @rown, @rowtwr, @twrid, @Ilosc, @StanMag, @Wynik; WHILE @@FETCH_STATUS = 0 begin set @licz = (@StanMag - @Ilosc) update #test set Wynik = @licz where @rown = rown and @twrid = TwrID update #test set StanMag = @licz where @twrid = TwrID and ROWTwr = @rowtwr+1 fetch next from kursor into @rown, @rowtwr, @twrid, @Ilosc, @StanMag, @Wynik end close kursor; deallocate kursor;
Re: Raport zasobów
Hej,
Przepraszam, że tak długo, ale sporo zajęć mam na głowie. Skoro masz SQL2012 to możesz to zrobić tak:
Pamiętaj tylko żeby zmodyfikować sobie odpowiednio sekcję WHERE, o ile chcesz to jakoś filtrować, bądź masz inne założenia co do statusów zamówień. Weź też pod uwagę, iż ja wziąłem pod uwagę wszystkie zasoby oraz nie uwzględniam tego czy dany zasób jest już przypisany do jakiejś rezerwacji. Coś takiego powinno być sporo szybsze niż rozwiązanie z kursorem, chociaż i tak ten kursor w tym przypadku wcale nie jest zły - powinien być szybszy niż rekursywny CTE, bądź podzapytanie.
Pozdrawiam,
Mateusz
Przepraszam, że tak długo, ale sporo zajęć mam na głowie. Skoro masz SQL2012 to możesz to zrobić tak:
Kod: Zaznacz cały
SELECT Twr,ZaN_GIDNumer,
--IloscZasob,IloscZamowienie,Suma,
CASE WHEN IloscZasob > Suma THEN IloscZamowienie ELSE
CASE WHEN IloscZasob + IloscZamowienie - Suma > 0 THEN IloscZasob + IloscZamowienie - Suma ELSE 0 END END AS WykorzystanoZS,
CASE WHEN Suma >= IloscZasob THEN IloscZasob ELSE Suma END AS Wykorzystano,
CASE WHEN Suma >= IloscZasob THEN 0 ELSE IloscZasob - Suma END AS PozostajeZasob
FROM
(
SELECT Zae_TwrNumer AS Twr,ZaN_DataRealizacji, Zae_GIDNumer, Zae_GIDlp,
ZaN_GIDNumer,
Zae_Ilosc AS IloscZamowienie,
Twz_IlSpr AS IloscZasob,
SUM(Zae_Ilosc) OVER (PARTITION BY Zae_TwrNumer ORDER BY Zae_TwrNumer,Zan_DataRealizacji, Zae_GIDNumer, Zae_GIDlp ASC ROWS UNBOUNDED PRECEDING) AS Suma
FROM CDN.ZamElem
INNER JOIN CDN.ZamNag ON ZaE_GIDnumer = ZaN_GIDNumer
INNER JOIN (SELECT SUM(Twz_IlSpr) AS Twz_IlSpr, Twz_TwrNumer FROM CDN.TwrZasoby GROUP BY Twz_TwrNumer) Zasoby ON Zasoby.TwZ_TwrNumer = ZaE_TwrNumer
WHERE
ZaN_ZamTyp = 1280
AND ZaN_Rodzaj = 4
AND ZaN_Stan <= 3
--AND ZaE_TwrNumer IN ( 1115,2583,1752)
) AS Wew
ORDER BY Twr, ZaN_DataRealizacji, Zae_GIDNumer, Zae_GIDlp ASC
Pozdrawiam,
Mateusz
Re: Raport zasobów
Dzięki Mateusz, nic się nie stało 
Zrobiłem już kursorem. Dzięki za pomysł z nowymi funkcjami - właśnie na nimi siedzę i czytam.
PS Miałeś reaktywować swojego bloga.
Zrobiłem już kursorem. Dzięki za pomysł z nowymi funkcjami - właśnie na nimi siedzę i czytam.
PS Miałeś reaktywować swojego bloga.