Raport zasobów

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

Jaras
Posty: 250
Rejestracja: 29 paź 2010, 13:08
Rola: Użytkownik CDN XL
Wersja: 9.6

Raport zasobów

Post autor: Jaras »

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.

Awatar użytkownika
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

Post autor: STAY_PJE »

Procedurą zawierającą kursor ja bum zrobił.

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: Raport zasobów

Post autor: elmiq »

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
Mateusz Świerkosz

http://elmiq.blogspot.com/

Canonier450
Posty: 3
Rejestracja: 21 paź 2015, 09:44
Rola: Konsultant CDN XL

Re: Raport zasobów

Post autor: Canonier450 »

najszybciej zadziała zapytanie rekursywne CTE.
Rozwiązanie z kursorem będzie bardzo wolne - można takie zastosować przy małej ilości danych.

Jaras
Posty: 250
Rejestracja: 29 paź 2010, 13:08
Rola: Użytkownik CDN XL
Wersja: 9.6

Re: Raport zasobów

Post autor: Jaras »

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

Gcis
Posty: 18
Rejestracja: 07 mar 2013, 13:51
Rola: Administrator CDN XL
Wersja: 2016

Re: Raport zasobów

Post autor: Gcis »

Witam

Myślę że moduł Zamówień /ogólne/ niezrealizowane pozycje zamówień

tam jest odpowiedź na twoje pytanie

Grzegorz

Jaras
Posty: 250
Rejestracja: 29 paź 2010, 13:08
Rola: Użytkownik CDN XL
Wersja: 9.6

Re: Raport zasobów

Post autor: Jaras »

Grzegorzu nie o to chodzi.

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;
Czy jest możliwe aby kursor resetował się dla każdego towaru?

Jaras
Posty: 250
Rejestracja: 29 paź 2010, 13:08
Rola: Użytkownik CDN XL
Wersja: 9.6

Re: Raport zasobów

Post autor: Jaras »

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.
Jaras pisze:Grzegorzu nie o to chodzi.

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;
Czy jest możliwe aby kursor resetował się dla każdego towaru?

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: Raport zasobów

Post autor: elmiq »

Hej,

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
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
Mateusz Świerkosz

http://elmiq.blogspot.com/

Jaras
Posty: 250
Rejestracja: 29 paź 2010, 13:08
Rola: Użytkownik CDN XL
Wersja: 9.6

Re: Raport zasobów

Post autor: Jaras »

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.

ODPOWIEDZ