stany magazynowe

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

Moderator: mikey

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

Re: stany magazynowe

Post autor: elmiq »

Zauważ, że przy takim join-ie, jeżeli dany towar "posiada" w tabeli zasoby, więcej niż jeden rekord (m), to jest on dla każdych n elementów z Traelem zwracany m razy - stąd błędy. W miarę możliwości nie używaj pól takich jak twr_nazwa do grupowania, bo nie jest to pole unikalne w tabeli i przez to możesz otrzymywać błędne obliczenia. Zamiast tego w klauzuli GROUP BY używaj np twr_gidnumer, ewentualnie twr_kod. Niepotrzebnie też robisz grupowanie po twz_ilmag - w ten sposób dodatkowo rozbijasz wiersze ze względu na ilość i jeszcze robisz sumowanie tej ilości. Czyli mając 2 rekordy po 10 sztuk i jeden rekord z ilością 15 sztuk, zapytanie zwróci ci 2 pozycje - jedną na 20, a drugą na 15 sztuk. Grupowanie zrób w ten sposób:

Kod: Zaznacz cały

GROUP BY
  TGD2.TGD_Kod, 
  TRE.TRE_TwrNumer,
  ZAS.TwZ_MagNumer
Jeżeli chcesz wyciągać pole które jest tekstowe, a nie grupujesz po nim, użyj po prostu funkcji max(), np select max(twr_nazwa) ...


Tak wiem, że mógłbym to napisać i dać Ci gotowca, ale skoro zaczynasz z tym pracować to dużo lepiej będzie jak zrobisz to sam, a ktoś ewentualnie to poprawi. I satysfakcja też większa :)


EDIT: W kodzie naniosłem poprawkę dla Tre_Twrnumer - gdzieś się tam GID zakradł :)
Mateusz Świerkosz

http://elmiq.blogspot.com/
Mr.Dree
Posty: 66
Rejestracja: 31 paź 2008, 10:42
Rola: Administrator CDN XL
Wersja: 8.0 HR1

Re: stany magazynowe

Post autor: Mr.Dree »

Ok poprawiłem grupowanie wg twojej rady dzięki za pomoc niestety ale z powodu braku dokumentacji ciężko mi zrobić bardziej skomplikowane raporty.
Faktem jest iż dopiero poznaje XL i całą jego strukturę i SQL-a więc dzięki za wyrozumiałość.
Odnośnie Joina niestety nie udało mi się tego poprawić ale będę walczył dalej.
Paweł
Admin
Mr.Dree
Posty: 66
Rejestracja: 31 paź 2008, 10:42
Rola: Administrator CDN XL
Wersja: 8.0 HR1

Re: stany magazynowe

Post autor: Mr.Dree »

Nio muszę przyznać że satysfakcją jest ogromna.
Udało mi się uzyskać to co chciałem.
Ale jeszcze popracuję na tym wykresem.
Dziękuję użytkownikowi "elmiq" za pomoc.

Poniżej kod może się komuś przyda.

Kod: Zaznacz cały

 @PAR ?@S20|kod_grupy|Początek kodu grupy:% @? PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT MAG_GIDNumer, MAG_Kod FROM CDN.Magazyny)|Mags|&Magazyn:REG= 1 @? PAR@
@PAR ?@EOL PAR@
@PAR ?@D17|Data_Od|Data &od:{DateClwFirstDay('m')} @? PAR@
@PAR ?@D17|Data_Do|Data &do:{Today()} @? PAR@
@PAR ?@EOL PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE'  order by 2)|Mag1|&Magazyn 1:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag2|&Magazyn 2:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag3|&Magazyn 3:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag4|&Magazyn 4:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag5|&Magazyn 5:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag6|&Magazyn 6:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag7|&Magazyn 7:REG= @? PAR@
SELECT
1 AS id,
W.KodG AS [Kod grupy],
W.Kod AS [Kod towaru],
sum(CASE WHEN W.Magazyn = ??Mag1 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 1],
sum(CASE WHEN W.Magazyn = ??Mag2 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 2],
sum(CASE WHEN W.Magazyn = ??Mag3 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 3],
sum(CASE WHEN W.Magazyn = ??Mag4 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 4],
sum(CASE WHEN W.Magazyn = ??Mag5 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 5],
sum(CASE WHEN W.Magazyn = ??Mag6 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 6],
sum(CASE WHEN W.Magazyn = ??Mag7 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 7],
W.Iloscs AS [Ilość Sprzedana]
FROM
(
SELECT 
  TGD2.TGD_Kod AS KodG,  
  TWR.Twr_Kod AS Kod, 
  SUM(ZAS.TwZ_IlSpr) AS Ilosc, 
  ZAS.TwZ_MagNumer AS Magazyn,
  IloscS=(select SUM(Tre_Ilosc) from cdn.traelem INNER JOIN
  CDN.TraNag ON Trn_GIDNumer=Tre_GIDNumer AND Trn_GIDTyp=TrE_GIDTyp and tre_twrkod=TWR.Twr_Kod
and TRN_DATA3 >=??Data_Od AND 
  TRN_DATA3 <=??Data_Do
where TRN_MagZNumer=??Mags)
FROM         
  CDN.TwrZasoby AS ZAS LEFT OUTER JOIN
  CDN.TwrKarty AS TWR ON ZAS.TwZ_TwrNumer = TWR.Twr_GIDNumer INNER JOIN
  CDN.TwrGrupyDom AS TGD1 ON Twr_GIDNumer = TGD1.TGD_GIDNumer INNER JOIN
  CDN.TwrGrupyDom AS TGD2 ON (TGD1.TGD_GrONumer = TGD2.TGD_GIDNumer)
WHERE
  TGD1.TGD_GIDTyp = 16  AND
  TGD2.TGD_GIDTyp = -16 AND
  TGD2.TGD_Kod LIKE ??kod_grupy  + '%' AND
  TWR.Twr_Typ = 1 AND   
  ZAS.TwZ_MagNumer IN (??Mag1, ??Mag2, ??Mag3, ??Mag4, ??Mag5, ??Mag6, ??Mag7)
GROUP BY
  TGD2.TGD_Kod, 
  TWR.Twr_Kod, 
  ZAS.TwZ_MagNumer
HAVING
  SUM(ZAS.TwZ_IlSpr) <> 0
) AS W
GROUP BY
W.KodG, W.Kod, W.Iloscs
ORDER BY 
W.KodG, W.Kod
Paweł
Admin
elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: stany magazynowe

Post autor: elmiq »

Tutaj masz swój kod, tylko przerobiony tak żeby się pozbyć jednego grupowania przez co będzie szybciej - zwraca dokładnie to samo.

Kod: Zaznacz cały

@PAR ?@S20|kod_grupy|Początek kodu grupy:% @? PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT MAG_GIDNumer, MAG_Kod FROM CDN.Magazyny)|Mags|&Magazyn:REG= 1 @? PAR@
@PAR ?@EOL PAR@
@PAR ?@D17|Data_Od|Data &od:{DateClwFirstDay('m')} @? PAR@
@PAR ?@D17|Data_Do|Data &do:{Today()} @? PAR@
@PAR ?@EOL PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE'  order by 2)|Mag1|&Magazyn 1:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag2|&Magazyn 2:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag3|&Magazyn 3:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag4|&Magazyn 4:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag5|&Magazyn 5:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag6|&Magazyn 6:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND  CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag7|&Magazyn 7:REG= @? PAR@


SELECT
ID=1,
  TGD2.TGD_Kod AS [Kod GRUPY], 
  TWR.Twr_Kod AS [Kod towaru],
  sum(CASE WHEN TwZ_MagNumer = ??Mag1 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 1],
  sum(CASE WHEN TwZ_MagNumer = ??Mag2 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 2],
  sum(CASE WHEN TwZ_MagNumer = ??Mag3 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 3],
  sum(CASE WHEN TwZ_MagNumer = ??Mag4 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 4],
  sum(CASE WHEN TwZ_MagNumer = ??Mag5 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 5],
  sum(CASE WHEN TwZ_MagNumer = ??Mag6 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 6],
  sum(CASE WHEN TwZ_MagNumer = ??Mag7 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 7],
  (select SUM(Tre_Ilosc) from cdn.traelem INNER JOIN
  CDN.TraNag ON Trn_GIDNumer=Tre_GIDNumer AND Trn_GIDTyp=TrE_GIDTyp and tre_twrkod=TWR.Twr_Kod
and TRN_DATA3 >=??Data_Od AND
  TRN_DATA3 <=??Data_Do
where TRN_MagZNumer=??Mags) as [Ilosc sprzedana]
FROM         
  CDN.TwrZasoby AS ZAS LEFT OUTER JOIN
  CDN.TwrKarty AS TWR ON ZAS.TwZ_TwrNumer = TWR.Twr_GIDNumer INNER JOIN
  CDN.TwrGrupyDom AS TGD1 ON Twr_GIDNumer = TGD1.TGD_GIDNumer INNER JOIN
  CDN.TwrGrupyDom AS TGD2 ON (TGD1.TGD_GrONumer = TGD2.TGD_GIDNumer)
WHERE
  TGD1.TGD_GIDTyp = 16  AND
  TGD2.TGD_GIDTyp = -16 AND
  TGD2.TGD_Kod LIKE ??kod_grupy  + '%' AND
  TWR.Twr_Typ = 1 AND   
  ZAS.TwZ_MagNumer IN (??Mag1, ??Mag2, ??Mag3, ??Mag4, ??Mag5, ??Mag6, ??Mag7)
GROUP BY
  TGD2.TGD_Kod,
  TWR.Twr_Kod,
  ZAS.TwZ_MagNumer
HAVING
  SUM(ZAS.TwZ_IlSpr) <> 0
ORDER BY
TGD2.TGD_Kod , TWR.Twr_Kod
I na zadanie domowe, masz zrobić tak, żeby twoja kolumna ilość sprzedana była ilością sprzedaną, a nie wydaną, kupioną, rozchodowaną i przyjęta :P
Mateusz Świerkosz

http://elmiq.blogspot.com/
Mr.Dree
Posty: 66
Rejestracja: 31 paź 2008, 10:42
Rola: Administrator CDN XL
Wersja: 8.0 HR1

Re: stany magazynowe

Post autor: Mr.Dree »

Witam,
Czy wystarczy tylko taki warunek. Czy powinienem dodać coś jeszcze.

Kod: Zaznacz cały

 
WHERE
Trn_GIDTyp IN (2033,  2041, 2034, 2042, 2001, 2009) AND
Trn_SpiTyp <>0 AND
Trn_SpiNumer <>0 AND
Dzięki za pomoc.
Paweł
Admin
ODPOWIEDZ