Wyświetlanie dokumentów, których stan magazynowy pozycji jest większy od zera

0

Witam.
Borykam się z pewnym problemem wyciągnięcia dokumentów możliwych do zrealizowania. Chodzi o oprogramowanie Comarch Optima, ale to jakiegoś wielkiego znaczenia nie ma.

Są 3 tabele
TraNag - lista dokumentów

TrN_TrNID TrN_NumerPelny
123 FA/1234/03/2019

TraElem - lista pozycji na dokumentach

TrE_TrEID TrE_TrNId TrE_TwrId TrE_TwrKod TrE_Ilosc
12342 123 4 Towar1 12

TwrIlosci - lista ilości towarów

TwI_TwIId TwI_TwrId TwI_Data TwI_Ilosc
25 4 2019-03-21 123
26 4 2019-03-22 156

Stany magazynowe towarów są brane na podstawie daty. Czyli jakbym chciał wystawiać dokument z dniem 2019-03-21 to stan jest 123, ale dla dokumentów z dnia 2019-03-22 stan już będzie o 33 szt. większy.
Potrzebuje wyciągnąć dokumenty, których stany na magazynie są >= od ilości na dokumencie.

Zapytanie, które ja mam miesza mi gdzieś te stany i pokazuje dokumenty, które nie mają towarów na stanie.

select
TrN_TrNID,  
TrN_NumerPelny
from CDN.TraNag 
left join CDN.TraElem on TrN_TrNID = TrE_TrNId
where TrN_TypDokumentu = 308 
and TrN_Bufor = 1 
and (select top 1 TwI_Ilosc from CDN.TwrIlosci where convert(date, TwI_Data) <= convert(date, getdate()) and TwI_TwrId = TrE_TwrId) >= TrE_Ilosc 
group by TrN_TrNID, TrN_NumerPelny, TrN_DataDok
order by TrN_DataDok desc

Oczywiście baza jest na SQL Server 2017 Express. System to Windows 10.

1

Zrób sobie zapytanie które weźmie i pokaże stany na jakiś dzień:

select
    TwI_TwrId
    ,Twi_Ilosc
from
    (select 
	   TwI_TwrId
	   ,TwI_Data od
	   ,dateadd(d,-1,lead(TwI_Data,1) over (partition by TwI_TwrId order by TwI_Data)) do
	   ,Twi_Ilosc
    from 
	   CDN.twrilosci) dt
    where 
	   getdate() between od and do
	   or (od < getdate() and do is null)

i wykorzystaj w zapytaniu:

with oddo as (
select
    TwI_TwrId
    ,Twi_Ilosc
from
    (select 
	   TwI_TwrId
	   ,TwI_Data od
	   ,dateadd(d,-1,lead(TwI_Data,1) over (partition by TwI_TwrId order by TwI_Data)) do
	   ,Twi_Ilosc
    from 
	   CDN.twrilosci) dt
    where 
	   getdate() between od and do
	   or (od < getdate() and do is null)
)


select
    TrN_TrNID,  
    TrN_NumerPelny
from 
    CDN.TraNag 
    left join CDN.TraElem on TrN_TrNID = TrE_TrNId
    inner join oddo on oddo.TwI_TwrId = CDN.TraElem.TrE_TwrId
where 
    TrN_TypDokumentu = 308 
    and rN_Bufor = 1 
    and Twi_Ilosc >= TrE_Ilosc 
group by 
    TrN_TrNID
    ,TrN_NumerPelny
    ,TrN_DataDok
order by 
    TrN_DataDok desc

1 użytkowników online, w tym zalogowanych: 0, gości: 1