PW -> FS

Problemy i pomysły związane z funkcjonowaniem modułu Sprzedaż

Moderator: mikey

aleksanderanderson
Posty: 7
Rejestracja: 21 paź 2019, 11:17
Rola: Użytkownik CDN XL
Wersja: 8.0

PW -> FS

Post autor: aleksanderanderson »

Witam,

Próbuję połączyć dokumenty PW z FS. Znalazłem na forum coś takiego ale dla WZ : viewtopic.php?f=17&t=6345

Czy ktoś z Was przygotowywał takie zapytanie, które wskazuje, jakie dokumenty PW składają się na daną fakturę sprzedaży? Chciałbym wiedzieć, z których magazynów towar jest sprzedawany.

W BI widzę coś takiego jak poniżej:

Rok Data Kod Rodzaj.Dokument Dostawa.Dokument Zakładający Wartosc Ilosc
2019 01.10.2019 222222 FS-2/2019 PW-4444/2019/INDEKS2 100 50
2019 01.10.2019 111111 FS-1/2019 PW-1111/2019/INDEKS1 200 100
2019 01.10.2019 111111 FS-1/2019 PW-2222/2019/INDEKS1 150 75

hundzik
Posty: 301
Rejestracja: 11 mar 2008, 19:08
Rola: Administrator CDN XL
Wersja: 9.6.1
Lokalizacja: lubelszczyzna.

Re: PW -> FS

Post autor: hundzik »

Nie wiem za bardzo co ma dokument przyjęca do magazynu (chyba, że to specyfika twojej firmy).
Ale wiążesz dokument handlowy przez tranag i ew do tranag (jeśli masz spinacze), potem do traelem, traselem i w traselem masz wskazanie to cdn.dostawy a tam masz już proste wskazanie do transakcji która stworzyła dostawę.

Coin
Posty: 396
Rejestracja: 19 maja 2008, 17:17
Rola: Konsultant CDN XL
Lokalizacja: kujawsko-pomorskie

Re: PW -> FS

Post autor: Coin »

Można np. w ten sposób

SELECT CDN.NazwaObiektu(CDN.TraNag.TrN_GIDTyp, CDN.TraNag.TrN_GIDNumer, 0, 2) AS [Dokumet], CDN.Magazyny.MAG_Kod, CDN.TwrKarty.Twr_Kod,
CDN.TraSElem.TrS_KosztKsiegowy, CDN.TraSElem.TrS_Ilosc, cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
FROM CDN.TraSElem INNER JOIN
CDN.TraNag ON CDN.TraSElem.TrS_GIDNumer = CDN.TraNag.TrN_GIDNumer INNER JOIN
CDN.TraElem ON CDN.TraElem.TrE_GIDNumer = CDN.TraSElem.TrS_GIDNumer AND CDN.TraElem.TrE_GIDLp = CDN.TraSElem.TrS_GIDLp INNER JOIN
CDN.TwrKarty ON CDN.TraElem.TrE_TwrNumer = CDN.TwrKarty.Twr_GIDNumer INNER JOIN
CDN.Magazyny ON CDN.TraSElem.TrS_MagNumer = CDN.Magazyny.MAG_GIDNumer JOIN
cdn.dostawy on
Dst_GIDNumer=TrS_DstNumer

where (TrN_GIDTyp=giddokumentusprawdzanego AND TrN_GIDNumer=gidnumerdokumentusprawdzanego)
ORDER BY CDN.TraSElem.TrS_TrnTStamp, CDN.TraNag.TrN_GIDNumer

Zapytanie pokaże to co masz w zakładce dostawy np. na dokumencie FS
Pozdrawiam
Marcin Groszewski - ALTERPRO Sp. z o.o.
m.groszewski@alterpro.pl

aleksanderanderson
Posty: 7
Rejestracja: 21 paź 2019, 11:17
Rola: Użytkownik CDN XL
Wersja: 8.0

Re: PW -> FS

Post autor: aleksanderanderson »

Po PW wiem, z której lokalizacji towar został sprzedany i tak mogę rozliczać sprzedaż. Stad potrzeba powołania mnóstwa elementów.


Udało się korzystając z różnych źródeł zrobić coś takiego co zwraca prawie wszystkie dane, których potrzebuję oprócz:
Operatora dokumentu ZS
Ilość i Wartość się niestety nie liczą dobrze
Nie mogę również rozgryźć jak dodać ceny detal, ceny hurt ale związane z PW (czyli różne poziomy cen nie na dany moment tylko z momentu przyjęcia towaru do magazynu).
Z kolei wartość na 7 pokazuje mi Total faktury a nie wartość poszczególnych towarów na fakturze.
Wklejałem różne zapytania i łączyłem ze sobą wiec z góry przepraszam za bałagan w zapytaniu:

DECLARE @DataOd varchar(10) , @DataDo varchar(10)
SELECT @DataOd = '2019-09-01', @DataDo = '2019-09-05'

select DISTINCT id=1
,case b.TrN_Stan
when 1 then 'Bufor'
when 2 then 'Bufor'
when 3 then 'Dokument zamknięty, nierozliczony'
when 4 then 'Dokument w trakcie rozliczania'
when 5 then 'Dokument zamknięty, rozliczony'
end 'Stan'
,LEFT(CAST(CDN.TSToDate(a.TrN_Data3,0) as DATE),4) 'Rok'
,CAST(CDN.TSToDate(a.TrN_Data3,0) as DATE) 'Data'
,Twr_Kod 'Produkt kod'
,Twr_Nazwa
,Grupa_Główna = 'Grupa Główna'
,left(cdn.TwrGrupaPelnaNazwa(tgd_gronumer),CharIndex('/',cdn.TwrGrupaPelnaNazwa(tgd_gronumer),1)-1) 'Grupa.Poziom1'
,cdn.TwrGrupaPelnaNazwa(tgd_gronumer) 'Grupa.Poziom2'
,MAG_Kod 'Magazyn.Kod'
,KG.Knt_Akronim 'Kontrahent Główny - Akronim'
,KG.Knt_Nazwa1 'Kontrahent Główny - Pełna Nazwa'
,KG.Knt_Nip 'Kontrahent Główny - NIP'
,KG.Knt_Kraj 'Kontrahent Główny - Kraj'
,KG.Knt_Miasto 'Kontrahent Główny - Miasto'
--,KG.Knt_
,KD.Knt_Akronim 'Kontrahent Docelowy - Akronim'
,KD.Knt_Nip 'Kontrahent Docelowy - NIP'
,KD.Knt_Kraj 'Kontrahent Docelowy - Kraj'
,KD.Knt_Miasto 'Kontrahent Docelowy - Miasto'
,b.TrN_OpiNumer 'Kontrahent Opiekun'
,zan_openumerm 'Kontrahent_Operator'
,b.TrN_DokumentObcy 'Faktura'
,CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + CAST(a.TrN_TrNRok AS VARCHAR) + '/' + a.TrN_TrNSeria AS 'Dokument zakladajacy'
,Twr_Jm 'Jednostka miary'
,TrE_JmZ 'Produkt j.m'
,Twr_Waga * TrE_Ilosc 'Ilosc'
,TrE_Ilosc 'Ilosc j.pom'
,TrE_Ilosc 'Ilosc'
,TrE_KsiegowaNetto 'Wartosc'
,TrE_KsiegowaNetto - TrE_KosztKsiegowy 'Marza_I'
,TrE_KosztKsiegowy 'TKW'
,TrE_RzeczywistaNetto 'Test'
,TrE_KsiegowaNetto/TrE_Ilosc 'Średnia cena'
, isnull(PDT_KontoCredit,'') 'Konto księgowe - MA'

,case
when LEN(PDT_KontoCredit) > 1 then isnull(PDT_Kwota,0)
when PDT_KontoCredit is null then ''
end as 'Wartość - MA'

,TP.TrP_FormaNazwa 'Dokument/Forma'
,TP.TrP_Kwota 'Należność z płatności'
,DATEADD(day,TP.TrP_SpodziewanyTermin,CONVERT(DATETIME,'1800-12-28',120)) 'Data należności'

FROM CDN.TwrKarty
JOIN CDN.TraElem ON Twr_GIDNumer = TrE_TwrNumer
JOIN CDN.TraNag as a ON a.TrN_GIDTyp in (1489,1617) AND a.TrN_GIDNumer=TrE_GIDNumer
JOIN CDN.TraSelem ON a.TrN_GIDTyp=TrS_GIDTyp AND a.TrN_GIDNumer=TrS_GIDNumer
JOIN CDN.Dostawy ON Dst_GIDNumer=TrS_DstNumer
JOIN CDN.Atrybuty ON AtR_ObiNumer = Twr_GIDNumer AND AtR_ObiTyp = Twr_GIDTyp
JOIN CDN.AtrybutyKlasy ON AtR_AtkId = AtK_Id
JOIN CDN.TraSelem as c ON Dst_GIDNumer=c.TrS_DstNumer
JOIN CDN.TraNag as b ON b.TrN_GIDTyp in (2033,2041,2045,2037) AND b.TrN_GIDNumer=c.TrS_GIDNumer AND Dst_TwrNumer = Twr_GIDNumer
left join cdn.twrGrupyDom on tgd_gidtyp=twr_gidtyp and tgd_gidnumer=twr_gidnumer
left join cdn.KntKarty KG on KG.Knt_GIDnumer = b.TrN_KntNumer and KG.Knt_GIDTyp = b.TrN_KntTyp
left join cdn.KntKarty KD on KD.Knt_GIDnumer = b.TrN_KnDNumer and KD.Knt_GIDTyp = b.TrN_KnDTyp
left join CDN.Magazyny on CDN.TraSElem.TrS_MagNumer = MAG_GIDNumer
left join cdn.TraPlat TP on a.TrN_GIDTyp=TP.TrP_GIDTyp AND a.TrN_GIDNumer=TP.TrP_GIDNumer left join cdn.TrNOpisy as o on a.TrN_GIDNumer = TnO_TrnNumer and a.TrN_GIDLp = TnO_TrnLp
left join cdn.Predekrety on b.TrN_GIDTyp=PDT_GIDTyp AND b.TrN_GIDNumer=PDT_GIDNumer and PDT_GIDTyp IN (1489,1497,2001,2009,1520,1528,1521,1529,2033,2041,2034,2042,2035,2043,2039,2047,1616,1617,1936,1937,2008,2010)
left join CDN.ZamNag ON b.TrN_GIDNumer = CDN.ZamNag.ZaN_GIDNumer
left join cdn.twrceny c1 on twr_gidnumer = c1.twc_twrnumer and c1.twc_twrlp = 1
left join cdn.twrceny c2 on twr_gidnumer = c2.twc_twrnumer and c2.twc_twrlp = 2
left join cdn.twrceny c3 on twr_gidnumer = c3.twc_twrnumer and c3.twc_twrlp = 3

WHERE a.TrN_Data3 BETWEEN DATEDIFF(d,'1800-12-28',CAST(@DataOd AS DATE)) AND DATEDIFF(d,'1800-12-28',CAST(@DataDo AS DATE)) AND Left(PDT_KontoCredit,1) = 7
ORDER BY b.TrN_DokumentObcy, CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + CAST(a.TrN_TrNRok AS VARCHAR) + '/' + a.TrN_TrNSeria,Twr_Nazwa

aleksanderanderson
Posty: 7
Rejestracja: 21 paź 2019, 11:17
Rola: Użytkownik CDN XL
Wersja: 8.0

Re: PW -> FS

Post autor: aleksanderanderson »

Coin,

Przede wszystkim bardzo dziękuję za odpowiedź i za pomoc. Twoje zapytanie jest świetne. O wiele bardziej eleganckie i ewidentnie nie robione "na pałę" jak moje. Jeżeli byłbyś w stanie jeszcze z czymś pomóc...

Chciałbym zapytać Cię jeszcze (oraz ewentualnie innych zorientowanych użytkowników):
1) Z Trs idzie koszt księgowy czyli koszt wytworzenia i jest zgodne dla każdego produktu - idzie z PW. Tak samo jak ilość. Czy jest możliwość by tak samo widzieć wartość netto/brutto sprzedaży dla każdej pozycji bym widział dla każdej FS i dla każdego PW oraz towaru jaka była wartość sprzedaży?
Analogicznie próbuję jeszcze dołączyć inne poziomy cen związane z PW: CENA 1 / CENA 2 / CENA 3 / CENA 4 / CENA 5.
2) Chciałbym mieć również połączenie z kontem 7 na które dana sprzedaż wpada. Dodałem sobie fragment kodu z zapytania, które wrzuciłem

, isnull(PDT_KontoCredit,'') 'Konto księgowe - MA'

,case
when LEN(PDT_KontoCredit) > 1 then isnull(PDT_Kwota,0)
when PDT_KontoCredit is null then ''
end as 'Wartość - MA'

i widzę konto oraz wartość ale całej faktury a nie poszczególnych jej towarów/elementów. Czy można to w jakiś sposób powiązać?

3)Dodałem sobie jeszcze kontrahenta do poszczególnych faktur oraz kod opiekuna (analizuję sprzedaż po KAM-ach). Konieczne jest jednak bym znał również dane osoby, która byłą operatorem dokumentu czyli de facto przygotowała ZS pod tę fakturę (czyli ZS->WZ->PW->FS). Może być kod, personalia już sobie jakoś zmapuję.

Finalnie mam na razie coś takiego:

DECLARE @DataOd varchar(10) , @DataDo varchar(10)
SELECT @DataOd = '2019-09-01', @DataDo = '2019-09-05'

SELECT CDN.NazwaObiektu(CDN.TraNag.TrN_GIDTyp, CDN.TraNag.TrN_GIDNumer, 0, 2) AS [Dokumet], CDN.Magazyny.MAG_Kod, CDN.TwrKarty.Twr_Kod,
CDN.TraSElem.TrS_KosztKsiegowy, CDN.TraSElem.TrS_Ilosc, CDN.TraNag.TrN_WartoscWal, TrE_RzeczywistaNetto , cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
,Twr_Nazwa
,Grupa_Główna = 'Grupa Główna'
,left(cdn.TwrGrupaPelnaNazwa(tgd_gronumer),CharIndex('/',cdn.TwrGrupaPelnaNazwa(tgd_gronumer),1)-1) 'Grupa.Poziom1'
,cdn.TwrGrupaPelnaNazwa(tgd_gronumer) 'Grupa.Poziom2'
,KG.Knt_Akronim 'Kontrahent Główny - Akronim'
,KG.Knt_Nazwa1 'Kontrahent Główny - Pełna Nazwa'
,KG.Knt_Nip 'Kontrahent Główny - NIP'
,KG.Knt_Kraj 'Kontrahent Główny - Kraj'
,KG.Knt_Miasto 'Kontrahent Główny - Miasto'
,KD.Knt_Akronim 'Kontrahent Docelowy - Akronim'
,KD.Knt_Nip 'Kontrahent Docelowy - NIP'
,KD.Knt_Kraj 'Kontrahent Docelowy - Kraj'
,KD.Knt_Miasto 'Kontrahent Docelowy - Miasto'
,TrN_OpiNumer 'Kontrahent Opiekun'
, isnull(PDT_KontoCredit,'') 'Konto księgowe - MA'

,case
when LEN(PDT_KontoCredit) > 1 then isnull(PDT_Kwota,0)
when PDT_KontoCredit is null then ''
end as 'Wartość - MA'

FROM CDN.TraSElem INNER JOIN
CDN.TraNag ON CDN.TraSElem.TrS_GIDNumer = CDN.TraNag.TrN_GIDNumer INNER JOIN
CDN.TraElem ON CDN.TraElem.TrE_GIDNumer = CDN.TraSElem.TrS_GIDNumer AND CDN.TraElem.TrE_GIDLp = CDN.TraSElem.TrS_GIDLp INNER JOIN
CDN.TwrKarty ON CDN.TraElem.TrE_TwrNumer = CDN.TwrKarty.Twr_GIDNumer INNER JOIN
CDN.Magazyny ON CDN.TraSElem.TrS_MagNumer = CDN.Magazyny.MAG_GIDNumer JOIN cdn.dostawy on Dst_GIDNumer=TrS_DstNumer

left join cdn.twrGrupyDom on tgd_gidtyp=twr_gidtyp and tgd_gidnumer=twr_gidnumer
left join cdn.KntKarty KG on KG.Knt_GIDnumer = TrN_KntNumer and KG.Knt_GIDTyp = TrN_KntTyp
left join cdn.KntKarty KD on KD.Knt_GIDnumer = TrN_KnDNumer and KD.Knt_GIDTyp = TrN_KnDTyp
left join cdn.TraPlat TP on TrN_GIDTyp=TP.TrP_GIDTyp AND TrN_GIDNumer=TP.TrP_GIDNumer left join cdn.TrNOpisy as o on TrN_GIDNumer = TnO_TrnNumer and TrN_GIDLp = TnO_TrnLp
--left join cdn.Predekrety on a.TrN_GIDTyp=PDT_GIDTyp AND a.TrN_GIDNumer=PDT_GIDNumer and PDT_GIDTyp IN (1489,1497,2001,2009,1520,1528,1521,1529,2033,2041,2034,2042,2035,2043,2039,2047,1616,1617,1936,1937,2008,2010)
left join cdn.Predekrety on TrN_GIDTyp=PDT_GIDTyp AND TrN_GIDNumer=PDT_GIDNumer and PDT_GIDTyp IN (1489,1497,2001,2009,1520,1528,1521,1529,2033,2041,2034,2042,2035,2043,2039,2047,1616,1617,1936,1937,2008,2010)

where TrN_Data3 BETWEEN DATEDIFF(d,'1800-12-28',CAST(@DataOd AS DATE)) AND DATEDIFF(d,'1800-12-28',CAST(@DataDo AS DATE)) and TrN_GIDTyp in (2033,2041,2045,2037) AND Left(PDT_KontoCredit,1) = 7 --- AND TrN_GIDNumer=gidnumerdokumentusprawdzanego
ORDER BY CDN.TraSElem.TrS_TrnTStamp, CDN.TraNag.TrN_GIDNumer
Coin pisze:
05 lis 2019, 09:03
Można np. w ten sposób

SELECT CDN.NazwaObiektu(CDN.TraNag.TrN_GIDTyp, CDN.TraNag.TrN_GIDNumer, 0, 2) AS [Dokumet], CDN.Magazyny.MAG_Kod, CDN.TwrKarty.Twr_Kod,
CDN.TraSElem.TrS_KosztKsiegowy, CDN.TraSElem.TrS_Ilosc, cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
FROM CDN.TraSElem INNER JOIN
CDN.TraNag ON CDN.TraSElem.TrS_GIDNumer = CDN.TraNag.TrN_GIDNumer INNER JOIN
CDN.TraElem ON CDN.TraElem.TrE_GIDNumer = CDN.TraSElem.TrS_GIDNumer AND CDN.TraElem.TrE_GIDLp = CDN.TraSElem.TrS_GIDLp INNER JOIN
CDN.TwrKarty ON CDN.TraElem.TrE_TwrNumer = CDN.TwrKarty.Twr_GIDNumer INNER JOIN
CDN.Magazyny ON CDN.TraSElem.TrS_MagNumer = CDN.Magazyny.MAG_GIDNumer JOIN
cdn.dostawy on
Dst_GIDNumer=TrS_DstNumer

where (TrN_GIDTyp=giddokumentusprawdzanego AND TrN_GIDNumer=gidnumerdokumentusprawdzanego)
ORDER BY CDN.TraSElem.TrS_TrnTStamp, CDN.TraNag.TrN_GIDNumer

Zapytanie pokaże to co masz w zakładce dostawy np. na dokumencie FS

aleksanderanderson
Posty: 7
Rejestracja: 21 paź 2019, 11:17
Rola: Użytkownik CDN XL
Wersja: 8.0

Re: PW -> FS

Post autor: aleksanderanderson »

Witam ponownie,

Udało mi się powiązać PW z Tablicą TwrCeny, gdzie są pozostałe poziomy cen, które mnie interesują.

mam jednak kolejny problem. Pobierane ceny są najnowszymi. Jeżeli zmienia się cennik to i ceny są aktualizowane a chciałbym mieć powiązane z PW ceny aktualne dla daty wystawienia PW. Czy jest taka możliwość?

Nadal mam niestety problem z punktem 3 o którym pisałem:

3)Dodałem sobie jeszcze kontrahenta do poszczególnych faktur oraz kod opiekuna (analizuję sprzedaż po KAM-ach). Konieczne jest jednak bym znał również dane osoby, która byłą operatorem dokumentu czyli de facto przygotowała ZS pod tę fakturę (czyli ZS->WZ->PW->FS). Może być kod, personalia już sobie jakoś zmapuję.

Moje aktualne zapytanie:

DECLARE @DataOd varchar(10) , @DataDo varchar(10)
SELECT @DataOd = '2019-09-01', @DataDo = '2019-09-05'

SELECT CDN.NazwaObiektu(CDN.TraNag.TrN_GIDTyp, CDN.TraNag.TrN_GIDNumer, 0, 2) AS [Dokumet]
, CDN.Magazyny.MAG_Kod
, CDN.TwrKarty.Twr_Kod
, CDN.TraSElem.TrS_KosztKsiegowy
, CDN.TraSElem.TrS_Ilosc
, TrE_Cena
, TrE_CenaPoRabacie
, fabryczna.twc_wartosc fabryczna
, detaliczna.twc_wartosc detaliczna
, hurtowa.twc_wartosc hurtowa
, sieciowa.twc_wartosc sieciowa
, TraElem.TrE_KosztRzeczywisty
, TraElem.TrE_RzeczywistaNetto
, cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
, Twr_Nazwa
, Grupa_Główna = 'Grupa Główna'
, left(cdn.TwrGrupaPelnaNazwa(tgd_gronumer),CharIndex('/',cdn.TwrGrupaPelnaNazwa(tgd_gronumer),1)-1) 'Grupa.Poziom1'
, cdn.TwrGrupaPelnaNazwa(tgd_gronumer) 'Grupa.Poziom2'
, KG.Knt_Akronim 'Kontrahent Główny - Akronim'
, KG.Knt_Nazwa1 'Kontrahent Główny - Pełna Nazwa'
, KG.Knt_Nip 'Kontrahent Główny - NIP'
, KG.Knt_Kraj 'Kontrahent Główny - Kraj'
, KG.Knt_Miasto 'Kontrahent Główny - Miasto'
, KD.Knt_Akronim 'Kontrahent Docelowy - Akronim'
, KD.Knt_Nip 'Kontrahent Docelowy - NIP'
, KD.Knt_Kraj 'Kontrahent Docelowy - Kraj'
, KD.Knt_Miasto 'Kontrahent Docelowy - Miasto'
,TrN_OpiNumer 'Kontrahent Opiekun'
, zan_openumerm 'Kontrahent_Operator'

FROM CDN.TraSElem INNER JOIN
CDN.TraNag ON CDN.TraSElem.TrS_GIDNumer = CDN.TraNag.TrN_GIDNumer INNER JOIN
CDN.TraElem ON CDN.TraElem.TrE_GIDNumer = CDN.TraSElem.TrS_GIDNumer AND CDN.TraElem.TrE_GIDLp = CDN.TraSElem.TrS_GIDLp INNER JOIN
CDN.TwrKarty ON CDN.TraElem.TrE_TwrNumer = CDN.TwrKarty.Twr_GIDNumer INNER JOIN
CDN.Magazyny ON CDN.TraSElem.TrS_MagNumer = CDN.Magazyny.MAG_GIDNumer JOIN CDN.Dostawy on Dst_GIDNumer=TrS_DstNumer

left join cdn.twrceny fabryczna on twr_gidnumer = fabryczna.twc_twrnumer and fabryczna.twc_twrlp = 1
left join cdn.twrceny detaliczna on twr_gidnumer = detaliczna.twc_twrnumer and detaliczna.twc_twrlp = 2
left join cdn.twrceny hurtowa on twr_gidnumer = hurtowa.twc_twrnumer and hurtowa.twc_twrlp = 3
left join cdn.twrceny sieciowa on twr_gidnumer = sieciowa.twc_twrnumer and sieciowa.twc_twrlp = 5

left join cdn.twrGrupyDom on tgd_gidtyp=twr_gidtyp and tgd_gidnumer=twr_gidnumer
left join cdn.KntKarty KG on KG.Knt_GIDnumer = TrN_KntNumer and KG.Knt_GIDTyp = TrN_KntTyp
left join cdn.KntKarty KD on KD.Knt_GIDnumer = TrN_KnDNumer and KD.Knt_GIDTyp = TrN_KnDTyp
left join cdn.TraPlat TP on TrN_GIDTyp=TP.TrP_GIDTyp AND TrN_GIDNumer=TP.TrP_GIDNumer left join cdn.TrNOpisy as o on TrN_GIDNumer = TnO_TrnNumer and TrN_GIDLp = TnO_TrnLp
--left join cdn.Predekrety on CDN.TraElem.TrE_GIDTyp=PDT_GIDTyp AND CDN.TraElem.TrE_GIDNumer=PDT_GIDNumer and PDT_GIDTyp IN (1489,1497,2001,2009,1520,1528,1521,1529,2033,2041,2034,2042,2035,2043,2039,2047,1616,1617,1936,1937,2008,2010)
left join CDN.ZamNag ON Dst_GIDNumer = CDN.ZamNag.ZaN_GIDNumer

where TrN_Data3 BETWEEN DATEDIFF(d,'1800-12-28',CAST(@DataOd AS DATE)) AND DATEDIFF(d,'1800-12-28',CAST(@DataDo AS DATE)) and TrN_GIDTyp in (2033,2041,2045,2037) --- AND Left(PDT_KontoCredit,1) = 7 --- AND TrN_GIDNumer=gidnumerdokumentusprawdzanego
ORDER BY CDN.TraSElem.TrS_TrnTStamp, CDN.TraNag.TrN_GIDNumer

aleksanderanderson
Posty: 7
Rejestracja: 21 paź 2019, 11:17
Rola: Użytkownik CDN XL
Wersja: 8.0

Re: PW -> FS

Post autor: aleksanderanderson »

Witam ponownie,

Udało mi się zrobić kolejny kro do przodu w kwestii zapytania.

Połączyłem zapytanie z Tabelą TwrCenyHistOdDo aby pobrać cenę historyczną towaru zgodnie z datą PW (data PW na podstawie: dateadd(second,dst_dsttstamp,'19900101') ).

Dodałem sobie warunek, który ma zwracać cenę z tabeli TwrCenyHistOdDo dla daty mniejszej lub równej dacie PW. Niestety, brakuje mi drugiego warunku czyli daty większej. Ponieważ nie mam dolnej granicy otrzymuję wszystkie ceny dla danego produktu z datą mniejszą lub równą dacie PW.

Pokombinowałem z funkcją First_Value ale nie do końca działa. Co prawda teraz faktycznie otrzymuję ceny z datą spełniającą ten warunek ale mam kilkaset tysięcy razy powtorzone.

Wydaje mi się, że dobrze kombinuję tzn. stosując warunek na datę ceny <= data PW oraz Maksimum z tego (w sensie z daty by była zwrócona pierwsza data spełniająca ten warunek) ale coś mi nie działa.

Być może ktoś jest w stanie podpowiedzieć co zmienić w zapytaniu:

DECLARE @DataOd varchar(10) , @DataDo varchar(10)
SELECT @DataOd = '2019-11-01', @DataDo = '2019-11-02'

SELECT CDN.NazwaObiektu(CDN.TraNag.TrN_GIDTyp, CDN.TraNag.TrN_GIDNumer, 0, 2) AS [Dokumet]
, dateadd(second,dst_dsttstamp,'19900101') 'Data wystawienia PW'
, CDN.TSToDate(CDN.TraNag.TrN_Data3, 0) 'Data sprzedazy'
, CDN.Magazyny.MAG_Kod
, CDN.TwrKarty.Twr_Kod
, CDN.TraSElem.TrS_KosztKsiegowy
, CDN.TraSElem.TrS_Ilosc
, TrE_Cena
, TrE_CenaPoRabacie
, dateadd(second,TKW.DO,'19900101')
, dateadd(second,CMS.DO, '19900101')
, dateadd(second,CKW.DO, '19900101')
, FIRST_VALUE (TKW.Wartosc) OVER (ORDER BY TKW.DO DESC) 'TKW'
, FIRST_VALUE (CMS.Wartosc) OVER (ORDER BY CMS.DO DESC) 'CMS'
, FIRST_VALUE (CKW.Wartosc) OVER (ORDER BY CKW.DO DESC) 'CKW'
, TraElem.TrE_KosztRzeczywisty
, TraElem.TrE_RzeczywistaNetto
, cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
, Twr_Nazwa
, Grupa_Główna = 'Grupa Główna'
, left(cdn.TwrGrupaPelnaNazwa(tgd_gronumer),CharIndex('/',cdn.TwrGrupaPelnaNazwa(tgd_gronumer),1)-1) 'Grupa.Poziom1'
, cdn.TwrGrupaPelnaNazwa(tgd_gronumer) 'Grupa.Poziom2'
, KG.Knt_Akronim 'Kontrahent Główny - Akronim'
, KG.Knt_Nazwa1 'Kontrahent Główny - Pełna Nazwa'
, KG.Knt_Nip 'Kontrahent Główny - NIP'
, KG.Knt_Kraj 'Kontrahent Główny - Kraj'
, KG.Knt_Miasto 'Kontrahent Główny - Miasto'
, KD.Knt_Akronim 'Kontrahent Docelowy - Akronim'
, KD.Knt_Nip 'Kontrahent Docelowy - NIP'
, KD.Knt_Kraj 'Kontrahent Docelowy - Kraj'
, KD.Knt_Miasto 'Kontrahent Docelowy - Miasto'
, TrN_OpiNumer 'Kontrahent Opiekun'
, zan_openumerm 'Kontrahent_Operator'

FROM CDN.TraSElem INNER JOIN
CDN.TraNag ON CDN.TraSElem.TrS_GIDNumer = CDN.TraNag.TrN_GIDNumer INNER JOIN
CDN.TraElem ON CDN.TraElem.TrE_GIDNumer = CDN.TraSElem.TrS_GIDNumer AND CDN.TraElem.TrE_GIDLp = CDN.TraSElem.TrS_GIDLp INNER JOIN
CDN.TwrKarty ON CDN.TraElem.TrE_TwrNumer = CDN.TwrKarty.Twr_GIDNumer INNER JOIN
CDN.Magazyny ON CDN.TraSElem.TrS_MagNumer = CDN.Magazyny.MAG_GIDNumer JOIN CDN.Dostawy on Dst_GIDNumer=TrS_DstNumer

inner join CDN.TwrCenyHistOdDo TKW on twr_gidnumer = TKW.TwrNumer and TKW.TwrLp = 1 and TKW.DO <= Dst_DstTStamp
inner join CDN.TwrCenyHistOdDo CMS on twr_gidnumer = CMS.TwrNumer and CMS.TwrLp = 2
inner join CDN.TwrCenyHistOdDo CKW on twr_gidnumer = CKW.TwrNumer and CKW.TwrLp = 3

left join cdn.twrGrupyDom on tgd_gidtyp=twr_gidtyp and tgd_gidnumer=twr_gidnumer
left join cdn.KntKarty KG on KG.Knt_GIDnumer = TrN_KntNumer and KG.Knt_GIDTyp = TrN_KntTyp
left join cdn.KntKarty KD on KD.Knt_GIDnumer = TrN_KnDNumer and KD.Knt_GIDTyp = TrN_KnDTyp
left join cdn.TraPlat TP on TrN_GIDTyp=TP.TrP_GIDTyp AND TrN_GIDNumer=TP.TrP_GIDNumer left join cdn.TrNOpisy as o on TrN_GIDNumer = TnO_TrnNumer and TrN_GIDLp = TnO_TrnLp
left join CDN.ZamNag ON Dst_GIDNumer = CDN.ZamNag.ZaN_GIDNumer

where TrN_Data3 BETWEEN DATEDIFF(d,'1800-12-28',CAST(@DataOd AS DATE)) AND DATEDIFF(d,'1800-12-28',CAST(@DataDo AS DATE)) and TrN_GIDTyp in (2033,2041,2045,2037)

ORDER BY CDN.TraSElem.TrS_TrnTStamp, CDN.TraNag.TrN_GIDNumer

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

Re: PW -> FS

Post autor: elmiq »

W sytuacji gdy wyciągasz jedną wartość z tabeli o wielu rekordach dla danego identyfikatora(czyli cenę z TwrCenyHistOdDo dla danego towaru), sugeruję użyć podzapytania - po pierwsze wydajniej, po drugie łatwiej, po trzecie nie musisz się martwić o powielanie rekordów poprzez wiązanie bez odpowiednich warunków. Funkcja analityczna First_Value której używasz, nie ma tutaj większego sensu, choćby dlatego, że wydajnościowo i tak będzie tragicznie dla takiej ilości rekordów - sam pomysł nie był zły. Spróbuj wyjść jeszcze raz od tego co podpowiedział Ci kolega Coin - w swoim zapytaniu masz takie kwiatki jak

Kod: Zaznacz cały

cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
, które tak naprawdę niewiele mają wspólnego z rzeczywistym dokumentem dostawy.

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

aleksanderanderson
Posty: 7
Rejestracja: 21 paź 2019, 11:17
Rola: Użytkownik CDN XL
Wersja: 8.0

Re: PW -> FS

Post autor: aleksanderanderson »

Cześć,

Przede wszystkim dziękuję za odpowiedź.

Akurat ta część

Kod: Zaznacz cały

cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
działa i na próbnym zrzucie dobrze mapuje PW do dokumentów sprzedażowych więc nie bardzo rozumiem co jest nie tak. Tak jest zresztą napisane w kodzie podanym przez użytkownika Coin.
elmiq pisze:
13 lis 2019, 22:07
W sytuacji gdy wyciągasz jedną wartość z tabeli o wielu rekordach dla danego identyfikatora(czyli cenę z TwrCenyHistOdDo dla danego towaru), sugeruję użyć podzapytania - po pierwsze wydajniej, po drugie łatwiej, po trzecie nie musisz się martwić o powielanie rekordów poprzez wiązanie bez odpowiednich warunków. Funkcja analityczna First_Value której używasz, nie ma tutaj większego sensu, choćby dlatego, że wydajnościowo i tak będzie tragicznie dla takiej ilości rekordów - sam pomysł nie był zły. Spróbuj wyjść jeszcze raz od tego co podpowiedział Ci kolega Coin - w swoim zapytaniu masz takie kwiatki jak

Kod: Zaznacz cały

cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
, które tak naprawdę niewiele mają wspólnego z rzeczywistym dokumentem dostawy.

Pozdrawiam,
Mateusz
Jeżeli chodzi o Twoją odpowiedź to byłbym wdzięczny za dalszą pomoc. Jestem początkującym użytkownikiem, który chciałbym zastąpić średniej wydajności BI na zapytania SQL i jest to moje pierwsze podejście do tematu. Nie mam niestety wsparcia wewnątrz ani jakiejkolwiek dokumentacji i posiłkuję się wyłącznie tym, co uda mi się znaleźć w internecie.
Czy mógłbym prosić Cię o pomoc w przygotowaniu tego podzapytania?

Z mojej strony mogę dodać, że wpadł mi do głowy pewien pomysł jak to powiązać ale nie bardzo wiem jak go zrealizować i jaka byłaby jego wydajność (chyba nie za dobra :)).
Mój pomysł jest taki:

Cennik jest aktualizowany np. co tydzień. Przykładowo aktualizacja miała miejsce 4 listopada oraz 11 listopada.
Mam więc ceny historyczne:


Data---------------------------------------------------------Cena-------------CenaLP --------------------TwrNumer
04.11.2019 10:30:00:000---------------------------------10------------------1---------------------------123456
04.11.2019 10:30:00:000--------------------------------- 20------------------2---------------------------123456
04.11.2019 10:30:00:000--------------------------------- 30------------------3---------------------------123456
11.11.2019 12:15:21:000--------------------------------- 40------------------1---------------------------123456
11.11.2019 12:15:21:000--------------------------------- 50------------------2---------------------------123456
11.11.2019 12:15:21:000--------------------------------- 60------------------3----------------------------123456

Do Tabeli TwrCenyHistOdDo dokładam kolumnę, w której będę miał daty od 2017 r. w układzie: 01.01.2017 00:00:01:000
więc będę miał co do sekundy kalendarz od 2017 roku. Połączenie to spowoduje, że tam gdzie mam cenę historyczną będzie wartość ponieważ Data z ceny będzie równa dacie z kalendarza. Dla tych dni, gdzie nie było nowego cennika będę miał NULL.

Data--------------------------------------Cena-----------------CenaLP--------------TwrNumer------------ Data Kalendarz
04.11.2019 10:30:00:000--------------10----------------------1-------------------123456----------------04.11.2019 10:30:00:000
04.11.2019 10:30:00:000--------------20----------------------2-------------------123456----------------04.11.2019 10:30:00:000
04.11.2019 10:30:00:000--------------30----------------------3-------------------123456----------------04.11.2019 10:30:00:000
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------04.11.2019 10:30:01:000
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------04.11.2019 10:30:01:000
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------04.11.2019 10:30:01:000
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------04.11.2019 10:30:02:000
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------04.11.2019 10:30:02:000
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------04.11.2019 10:30:02:000
...
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------11.11.2019 12:15:19:000
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------11.11.2019 12:15:19:000
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------11.11.2019 12:15:19:000
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------11.11.2019 12:15:20:000
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------11.11.2019 12:15:20:000
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------11.11.2019 12:15:20:000
11.11.2019 12:15:21:000--------------40----------------------1-------------------123456----------------11.11.2019 12:15:21:000
11.11.2019 12:15:21:000--------------50----------------------2-------------------123456----------------11.11.2019 12:15:21:000
11.11.2019 12:15:21:000--------------60----------------------3-------------------123456----------------11.11.2019 12:15:21:000

Następnie dokładam kolumnę z funkcją (analogicznie do Excel): jeżeli jest wartość to weź wartość, w pozostałym przypadku weź wartość z komórki powyżej. Eliminuję w ten sposób NULL i mam układ:


Data--------------------------------------Cena-----------------CenaLP--------------TwrNumer------------ Data Kalendarz--------------------------Cennik
04.11.2019 10:30:00:000--------------10----------------------1-------------------123456----------------04.11.2019 10:30:00:000---------------10
04.11.2019 10:30:00:000--------------20----------------------2-------------------123456----------------04.11.2019 10:30:00:000---------------20
04.11.2019 10:30:00:000--------------30----------------------3-------------------123456----------------04.11.2019 10:30:00:000---------------30
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------04.11.2019 10:30:01:000---------------10
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------04.11.2019 10:30:01:000---------------20
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------04.11.2019 10:30:01:000---------------30
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------04.11.2019 10:30:02:000---------------10
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------04.11.2019 10:30:02:000---------------20
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------04.11.2019 10:30:02:000---------------30
...
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------11.11.2019 12:15:19:000---------------10
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------11.11.2019 12:15:19:000---------------20
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------11.11.2019 12:15:19:000---------------30
NULL--------------------------------------NULL-------------------1--------------------NULL-----------------11.11.2019 12:15:20:000---------------10
NULL--------------------------------------NULL-------------------2--------------------NULL-----------------11.11.2019 12:15:20:000---------------20
NULL--------------------------------------NULL-------------------3--------------------NULL-----------------11.11.2019 12:15:20:000---------------30
11.11.2019 12:15:21:000--------------40----------------------1-------------------123456----------------11.11.2019 12:15:21:000---------------40
11.11.2019 12:15:21:000--------------50----------------------2-------------------123456----------------11.11.2019 12:15:21:000---------------50
11.11.2019 12:15:21:000--------------60----------------------3-------------------123456----------------11.11.2019 12:15:21:000---------------60

Mając cenę dla każdej sekundy w okresie mogę już zrobić połączenie wprost w głównym zapytaniu do opisanej powyżej tabeli i wyciągać te ceny, których daty są równe dacie PW.

Taki mi pomysł przyszedł ale nie wiem jak go zrealizować. Niestety więcej pomysłów brak więc będę bardzo zobowiązany za wszelką pomoc w napisaniu tego selecta.
Jeżeli jest jakiś inny sposób, to proszę Cię Mateusz o pomoc. Bardziej szczegółową jeżeli można. Tak jak wspomniałem, bez zaplecza merytrycznego i wsparcia błądzę jak dziecko we mgle.

Pozdrawiam i z góry dziękuję.

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

Re: PW -> FS

Post autor: elmiq »

aleksanderanderson pisze:
15 lis 2019, 12:07
Cześć,

Przede wszystkim dziękuję za odpowiedź.

Akurat ta część

Kod: Zaznacz cały

cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
działa i na próbnym zrzucie dobrze mapuje PW do dokumentów sprzedażowych więc nie bardzo rozumiem co jest nie tak. Tak jest zresztą napisane w kodzie podanym przez użytkownika Coin.
elmiq pisze:
13 lis 2019, 22:07
W sytuacji gdy wyciągasz jedną wartość z tabeli o wielu rekordach dla danego identyfikatora(czyli cenę z TwrCenyHistOdDo dla danego towaru), sugeruję użyć podzapytania - po pierwsze wydajniej, po drugie łatwiej, po trzecie nie musisz się martwić o powielanie rekordów poprzez wiązanie bez odpowiednich warunków. Funkcja analityczna First_Value której używasz, nie ma tutaj większego sensu, choćby dlatego, że wydajnościowo i tak będzie tragicznie dla takiej ilości rekordów - sam pomysł nie był zły. Spróbuj wyjść jeszcze raz od tego co podpowiedział Ci kolega Coin - w swoim zapytaniu masz takie kwiatki jak

Kod: Zaznacz cały

cdn.nazwaobiektu(dst_gidtyp, dst_gidnumer,0,2) as [Dokumnet dostawy]
, które tak naprawdę niewiele mają wspólnego z rzeczywistym dokumentem dostawy.

Pozdrawiam,
Mateusz
Jeżeli chodzi o Twoją odpowiedź to byłbym wdzięczny za dalszą pomoc. Jestem początkującym użytkownikiem, który chciałbym zastąpić średniej wydajności BI na zapytania SQL i jest to moje pierwsze podejście do tematu. Nie mam niestety wsparcia wewnątrz ani jakiejkolwiek dokumentacji i posiłkuję się wyłącznie tym, co uda mi się znaleźć w internecie.
Czy mógłbym prosić Cię o pomoc w przygotowaniu tego podzapytania?

Z mojej strony mogę dodać, że wpadł mi do głowy pewien pomysł jak to powiązać ale nie bardzo wiem jak go zrealizować i jaka byłaby jego wydajność (chyba nie za dobra :)).

...

Pozdrawiam i z góry dziękuję.
Nawet nie wiedziałem, że Comarch ma w funkcji CDN.NazwaObiektu warunek na typ 160, czyli dostawę, co nie zmienia faktu, że pisał to chyba jakiś student łobuz, który zrobił tam wiązanie do Tranag po samym GIDNumer (zapominając o typie), nie wiedząc, że dostawa może być założona również tak przez PM jak i FAI, co czyni ten kod błędnym. Ale może zostawmy ten temat, bo to już trochę inna bajka.

To co proponujesz, o ile zdołasz to napisać, wydajnościowo będzie powalać w kierunku odwrotnym do pożądanego :)
Poprzez podzapytanie rozumiem sytuację w której masz to co podał Ci Coin i dodajesz sobie kolumnę z ceną historyczną, np. tak (zmieniając to co sam napisałeś):

Kod: Zaznacz cały

ISNULL((SELECT TOP 1 TKW.Wartosc FROM CDN.TwrCenyHistOdDo TKW WHERE twr_gidnumer = TKW.TwrNumer and TKW.TwrLp = 1 and TKW.DO <= Dst_DstTStamp ORDER BY TKW.DO DESC),0)
Coś takiego wyciągnie Ci pierwszą wartość dla rekordu z tej tabeli, dla której data jest najbardziej zbliżona do timestamp dostawy. O ile oczywiście dobrze napisałem zapytanie, bo nie wiem co to jest za tabelka CDN.TwrCenyHistOdDo. Po braku przedrostków zakładam, że to jakiś twór partnera stworzony przy wdrożeniu :)

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

ODPOWIEDZ