ZZ - planowana data dostawy - PIVOT

Problemy i pomysły związane z innymi modułami czyli np. środki trwałe, import, zamówienia ...

Moderator: mikey

Skywalker+
Posty: 8
Rejestracja: 11 lip 2022, 13:34
Rola: Użytkownik CDN XL

ZZ - planowana data dostawy - PIVOT

Post autor: Skywalker+ »

Mam SQL generujący listę niezrealizowanych ZZ z kodem towaru, ilością i planowaną datą dostawy.

Kod: Zaznacz cały

SELECT       cdn.numerdokumentu(cdn.dokmaptypdokumentu(zan_gidtyp,zan_zamtyp,zan_rodzaj),0,0,zan_zamnumer,zan_zamrok,zan_zamseria,zan_zammiesiac) as [Dokument]
      ,[ZaE_TwrKod] as 'Kod_towaru'
      ,case when rez_ilosc IS NULL then 0 else rez_ilosc end as 'Ilość_do_realizacji'
      ,case when Z.Atr_Wartosc<>'' and Z.Atr_Wartosc<>'0' then convert(varchar(7),dateadd(d,convert(int,Z.Atr_Wartosc),'18001228'),121) else '' end  as 'Planowana_data_dostawy'
  FROM [xl_pst].[CDN].[ZamNag]
          left join [xl_pst].[CDN].[ZamElem]    on ZaE_GIDNumer = Zan_GIDNumer
          left join [xl_pst].[CDN].[ZaNOpisy]   on ZnO_ZamNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Rezerwacje] on Rez_TwrNumer = ZaE_TwrNumer and Rez_KntNumer = ZaN_KntNumer and Rez_ZrdNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Atrybuty] Z on Z.Atr_AtkId=39 and Z.Atr_ObiNumer = ZaN_GIDNumer
 WHERE ZaN_ZamTyp = '1152' AND rez_ilosc > 0
 ORDER
    BY Planowana_data_dostawy ASC --ZaN_GIDNumer ASC
Próbuję zrobić z tego pivot jak poniżej:

Kod: Zaznacz cały

DECLARE @miesiace NVARCHAR(MAX)
set @miesiace = 
( 
' 
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  0,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  1,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  2,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  3,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  4,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  5,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  6,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  7,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  8,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  9,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month, 10,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month, 11,GETDATE()), 120)+'] 
'
)
PRINT (@miesiace);
DECLARE @COL NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
DECLARE  @DataOd varchar(MAX) , @DataDo varchar(MAX) 
SELECT   @DataOd = CONVERT(VARCHAR(20),DATEADD(month,-2,GETDATE()), 120) 
       , @DataDo = CONVERT(VARCHAR(20),DATEADD(month,-0,GETDATE()), 120)
SET @SQL = 
'SELECT Kod_towaru,' +@miesiace+ '
FROM  
(
SELECT a.Data, a.Kod_towaru, SUM(a.Ilość_do_realizacji) AS Ilosc
FROM
(
SELECT
      [ZaE_TwrKod] as ''Kod_towaru''
      ,case when rez_ilosc IS NULL then 0 else rez_ilosc end as ''Ilość_do_realizacji''
             ,case when Z.Atr_Wartosc<>'' and Z.Atr_Wartosc<>''0'' then convert(varchar(7),dateadd(d,convert(int,Z.Atr_Wartosc),''18001228''),121) else '' end AS ''Data''
  FROM [xl_pst].[CDN].[ZamNag]
          left join [xl_pst].[CDN].[ZamElem]    on ZaE_GIDNumer = Zan_GIDNumer
          left join [xl_pst].[CDN].[ZaNOpisy]   on ZnO_ZamNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Rezerwacje] on Rez_TwrNumer = ZaE_TwrNumer and Rez_KntNumer = ZaN_KntNumer and Rez_ZrdNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Atrybuty] Z on Z.Atr_AtkId=39 and Z.Atr_ObiNumer = ZaN_GIDNumer
 WHERE ZaN_ZamTyp = ''1152'' AND rez_ilosc > 0 
)   AS a
                GROUP BY a.Data, a.Kod_towaru	
         )
AS SourceTable 
PIVOT  (SUM(Ilosc) FOR Data IN (' +@miesiace+ '
   )
) 
AS PivotTable'
--PRINT (@SQL)
EXECUTE (@SQL)
Niestety SQL wyrzuca błąd:

[2022-07], [2022-08],
[2022-09], [2022-10],
[2022-11], [2022-12],
[2023-01], [2023-02],
[2023-03], [2023-04],
[2023-05], [2023-06]

Kod: Zaznacz cały

Msg 102, Level 15, State 1, Line 17
Incorrect syntax near '0'.
Kompletnie nie umiem zdiagnozować błędu (dla sprzedaży taki PIVOT działa, tam inaczej pobierana jest data - z nagłówka, przy ZZ planowana data dostawy jest zmienną dodaną do CDN XL).

Ktoś, coś? Z góry dzięki za pomoc.

Awatar użytkownika
praiser
Posty: 685
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2023

Re: ZZ - planowana data dostawy - PIVOT

Post autor: praiser »

line 17,

powinno być SET zamiast SELECT

SELECT @DataOd = CONVERT(VARCHAR(20),DATEADD(month,-2,GETDATE()), 120)
--------------------------------
Pozdrawiam
WW

Skywalker+
Posty: 8
Rejestracja: 11 lip 2022, 13:34
Rola: Użytkownik CDN XL

Re: ZZ - planowana data dostawy - PIVOT

Post autor: Skywalker+ »

Dzięki! Wrzucam poprawny kod.

Kod: Zaznacz cały

DECLARE @miesiac CHAR(7);

DECLARE @miesiace NVARCHAR(MAX)
set @miesiace = 
( 
' 
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  0,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  1,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  2,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  3,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  4,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  5,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  6,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  7,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month,  8,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month,  9,GETDATE()), 120)+'],
 ['+ CONVERT(VARCHAR(7),DATEADD(month, 10,GETDATE()), 120)+'], ['+ CONVERT(VARCHAR(7),DATEADD(month, 11,GETDATE()), 120)+'] 
'
)
PRINT (@miesiace);
DECLARE @COL NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
DECLARE  @DataOd varchar(MAX) , @DataDo varchar(MAX) 
SELECT   @DataOd = CONVERT(VARCHAR(20),DATEADD(month,-2,GETDATE()), 120) 
       , @DataDo = CONVERT(VARCHAR(20),DATEADD(month,-0,GETDATE()), 120)
SET @SQL = 
'SELECT Kod_towaru,' +@miesiace+ '
FROM  
(
SELECT a.Data, a.Kod_towaru, SUM(a.Ilość_do_realizacji) AS Ilosc_do_realizacji
FROM
(
SELECT
      [ZaE_TwrKod] as ''Kod_towaru''
      ,case when rez_ilosc IS NULL then 0 else rez_ilosc end as ''Ilość_do_realizacji''
             ,case when Z.Atr_Wartosc<>'''' and Z.Atr_Wartosc<>0 then convert(varchar(7),dateadd(d,convert(int,Z.Atr_Wartosc),''18001228''),121) else '''' end AS ''Data''
  FROM [xl_pst].[CDN].[ZamNag]
          left join [xl_pst].[CDN].[ZamElem]    on ZaE_GIDNumer = Zan_GIDNumer
          left join [xl_pst].[CDN].[ZaNOpisy]   on ZnO_ZamNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Rezerwacje] on Rez_TwrNumer = ZaE_TwrNumer and Rez_KntNumer = ZaN_KntNumer and Rez_ZrdNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Atrybuty] Z on Z.Atr_AtkId=39 and Z.Atr_ObiNumer = ZaN_GIDNumer
 WHERE ZaN_ZamTyp = ''1152'' AND rez_ilosc > 0
)   AS a
                GROUP BY a.Data, a.Kod_towaru	
         )
AS SourceTable 
PIVOT  (SUM(Ilosc_do_realizacji) FOR Data IN (' +@miesiace+ '
   )
) 
AS PivotTable'
--PRINT (@SQL)
EXECUTE (@SQL)
Jest fajny, ale ... nie uwzględnia ZZ niepotwierdzonych i ZZ (towarów) w przyjęciu, co naraża logistyków na składanie podwójnych zamówień.

Poniżej ten sam kod, ale bez tabeli przestawnej:

Kod: Zaznacz cały

SELECT 
      [ZaE_TwrKod] as 'Kod_towaru'
      ,case when rez_ilosc IS NULL then 0 else rez_ilosc end as 'Ilość_do_realizacji'
      ,case when Z.Atr_Wartosc<>'' and Z.Atr_Wartosc<>'0' then convert(varchar(7),dateadd(d,convert(int,Z.Atr_Wartosc),'18001228'),121) else '' end  as 'Planowana_data_dostawy'
  FROM [xl_pst].[CDN].[ZamNag]
          left join [xl_pst].[CDN].[ZamElem]    on ZaE_GIDNumer = Zan_GIDNumer
          left join [xl_pst].[CDN].[ZaNOpisy]   on ZnO_ZamNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Rezerwacje] on Rez_TwrNumer = ZaE_TwrNumer and Rez_KntNumer = ZaN_KntNumer and Rez_ZrdNumer = ZaN_GIDNumer
          left join [xl_pst].[CDN].[Atrybuty] Z on Z.Atr_AtkId=39 and Z.Atr_ObiNumer = ZaN_GIDNumer
		  left join [xl_pst].[CDN].[TwrKarty]   on Twr_GIDNumer = ZaE_TwrNumer

 WHERE ZaN_ZamTyp = '1152' AND rez_ilosc > '0'
 ORDER
    BY Planowana_data_dostawy ASC
Czy ktoś może wie, jak dodać do tego zapytania niepotwierdzone ZZ oraz ZZ (towar) w przyjęciu (PZI - zanim magazyn potwierdzi dostawę i będzie widoczna na MG1)?

Z góry dzięki za pomoc.

Skywalker+
Posty: 8
Rejestracja: 11 lip 2022, 13:34
Rola: Użytkownik CDN XL

Re: ZZ - planowana data dostawy - PIVOT

Post autor: Skywalker+ »

Na niepotwierdzonych jak i na zrealizowanych ZZ rez_ilosc = '0', dlatego warunek rez_ilosc > '0' usuwa ZZ zrealizowane (tych nie chcemy) ale także niepotwierdzone - te chcemy.

Z kolei wystawienie PZI, jeśli dobrze rozumiem, automatycznie zmienia ZZ rez_ilosc na '0' :-(

Awatar użytkownika
praiser
Posty: 685
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2023

Re: ZZ - planowana data dostawy - PIVOT

Post autor: praiser »

status zamówienia jest w Zan_Stan
i przyjmuje wartości:

Stan dokumentu
Możliwe wartości: Stan_zrealizowane = 21 - maska_archiw + w_realizacji, Stan_odrzucone = 19 - maska_archiw + potwierdzone, Stan_anul_potwierdzone = 35 - maska_anulowane + potwierdzone, Stan_maska_archiw = 16, Stan_maska_anulowane = 32, Stan_w_realizacji = 5, Stan_zaakceptowane = 4, Stan_potwierdzone = 3, Stan_zamowienie = 2, Stan_oferta = 1, Stan_zapytanie = 0.

zan_stan=2 and zan_zamtyp=1152 to bedzie ZZ w buforze.

możesz dołączyć UNIONem takie ZZtki
--------------------------------
Pozdrawiam
WW

Skywalker+
Posty: 8
Rejestracja: 11 lip 2022, 13:34
Rola: Użytkownik CDN XL

Re: ZZ - planowana data dostawy - PIVOT

Post autor: Skywalker+ »

Dzięki.

A tak nie zadziała?

Kod: Zaznacz cały

WHERE ZaN_ZamTyp = '1152' AND rez_ilosc > '0' OR zan_stan=2 AND ZaN_ZamTyp = '1152'

Skywalker+
Posty: 8
Rejestracja: 11 lip 2022, 13:34
Rola: Użytkownik CDN XL

Re: ZZ - planowana data dostawy - PIVOT

Post autor: Skywalker+ »

Dzięki.

A tak nie zadziała?

Kod: Zaznacz cały

WHERE ZaN_ZamTyp = '1152' AND rez_ilosc > '0' OR zan_stan=2 AND ZaN_ZamTyp = '1152'

Skywalker+
Posty: 8
Rejestracja: 11 lip 2022, 13:34
Rola: Użytkownik CDN XL

Re: ZZ - planowana data dostawy - PIVOT

Post autor: Skywalker+ »

Jakiś pomysł na PZI? Jakie ilości są aktualnie w przyjęciu?

Skywalker+
Posty: 8
Rejestracja: 11 lip 2022, 13:34
Rola: Użytkownik CDN XL

Re: ZZ - planowana data dostawy - PIVOT

Post autor: Skywalker+ »

Warunke

Kod: Zaznacz cały

zan_stan=2 AND ZaN_ZamTyp = '1152'
dołącza ZZ w buforze, ale ilość do realizacji pokazuje 0.
:-(
Ktoś, coś jak to obejść?

ODPOWIEDZ