Autor Wątek: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie  (Przeczytany 6795 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline tomaszf

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 523
  • Reputacja +12/-0
  • Wersja programu: Subiekt GT 1.66
Witam

Próbuje napisać zestawienie które zaproponuje ile towaru z danej grupy towarowej zamówić, a wyliczy to na podstawie średniej dziennej sprzedaży (na FV) w podanym okresie pomnożonym przez podana wartość.
W SQL Server Management Studio napisałem coś takiego:
SELECT
ob_TowId AS 'ID TOWARU',
tw_nazwa AS 'NAZWA TOWARU',
SUM(ob_Ilosc)/DATEDIFF(day, '2012-10-29 00:00:00.000','2012-10-31 00:00:00.000') AS 'ŚREDNIA DZIENNA SPRZEDAŻ',
SUM(ob_Ilosc)/DATEDIFF(day, '2012-10-29 00:00:00.000','2012-10-31 00:00:00.000')*7 AS 'PROPONOWANE ZAMÓWIENIE'
FROM dok_Pozycja
JOIN dok__dokument ON ob_dokhanid=dok_id
JOIN tw__towar On ob_towid=tw_Id
WHERE
tw_IdGrupa=3
AND
ob_dokhanid IN (select dok_id from dok__Dokument where  dok_DataMag BETWEEN '2012-10-29 00:00:00.000' and '2012-10-31 00:00:00.000')
AND
dok_typ=2
GROUP BY tw_Nazwa,ob_towid
ORDER BY tw_nazwa

Tutaj jest ok, poprawnie liczy średnią dzienną sprzedaż dla towarów z grupy od ID=3 w okresie od 2012-10-29 do 2012-10-31 i mnoży to przez 7.

Problem pojawił się przy przenoszeniu tego do Subiekta i próbie stworzenia kontrolek.
Doszedłem to tego momentu :
SELECT
ob_TowId AS 'ID TOWARU',
tw_nazwa AS 'NAZWA TOWARU',
sum(ob_Ilosc)/DATEDIFF(day, '2012-10-29 00:00:00.000','2012-10-31 00:00:00.000') AS 'ŚREDNIA DZIENNA SPRZEDAŻ',
sum(ob_Ilosc)/DATEDIFF(day, '2012-10-29 00:00:00.000','2012-10-31 00:00:00.000')*7 AS 'PROPONOWANE ZAMÓWIENIE'
FROM dok_Pozycja
JOIN dok__dokument ON ob_dokhanid=dok_id
JOIN tw__towar On ob_towid=tw_Id
WHERE
tw_IdGrupa={DB: SELECT GRT_ID,GRT_NAZWA AS GRUPA FROM sl_GrupaTw ORDER BY GRUPA:Grupa Towarowa}
AND
ob_dokhanid IN (select dok_id from dok__Dokument where  dok_DataMag BETWEEN {DR:Okres:GETDATE():GETDATE()})
AND
DOK_TYP=2
GROUP BY tw_nazwa,ob_towid
ORDER BY tw_nazwa

Nie wiem co wstawić zamiast DATEDIFF(day, '2012-10-29 00:00:00.000','2012-10-31 00:00:00.000') AS 'ŚREDNIA DZIENNA SPRZEDAŻ',  aby policzyło średnią sprzedaż z okresu podanego w kontrolce {DR:Okres:GETDATE():GETDATE()}.

Możecie mi coś podpowiedzieć jak to zrobić ?
Pozdrawiam.

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17064
  • Reputacja +798/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #1 dnia: Grudzień 17, 2012, 09:58:14 »
Użyj dwóch kontrolek z datą.

{DR:Okres:GETDATE():GETDATE()}.

SQL nie jest obsługiwany w kontrolkach.
Daniel, Białystok.

Offline tomaszf

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 523
  • Reputacja +12/-0
  • Wersja programu: Subiekt GT 1.66
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #2 dnia: Grudzień 17, 2012, 10:14:34 »
Gdy próbuje użyć:
SUM(ob_Ilosc)/DATEDIFF(day, {DR:Średnia z:2010-01-01:2010-08-09}) AS 'ŚREDNIA DZIENNA SPRZEDAŻ', zwraca mi bład: Incorrect syntax nearr the keyword 'AND'

Kontrolka {DR:Okres:GETDATE():GETDATE()}. przy wykonaniu zestawienia pokazuje mi "bieżący dzień"...

Offline Tworkin

  • Aktywny użytkownik
  • ***
  • Wiadomości: 200
  • Reputacja +43/-0
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #3 dnia: Grudzień 17, 2012, 10:44:31 »
kontrolka {DR:} zwraca coś takiego
BETWEEN 'DATA_OD' AND 'DATA_DO'  (
gdzie za DATA_OD i DATA_DO są oczywiście wstawiane odpowiednie daty),
to co chcesz uzyskać da się zrobić używając dwa razy {D:} zamiast {DR:}
czyli
DATEDIFF(day,{D:Data od},{D:Data do})

Offline tomaszf

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 523
  • Reputacja +12/-0
  • Wersja programu: Subiekt GT 1.66
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #4 dnia: Grudzień 17, 2012, 12:43:02 »
Źle zrozumiałem słowa dkozlowskiego... Chodziło o to o czym napisał Tworkin..

Zestawienie działa ale pojawia się problem, ponieważ użytkownik trzy razy musi wybrać ten sam okres.
Z tego co czytam w pomocy nie ma mowy o możliwości użycia zmiennych.
Czy jest więc jakiś sposób na przeniesienie raz wybranych wartości ?
« Ostatnia zmiana: Grudzień 17, 2012, 12:51:54 wysłana przez tomaszf »

Offline birds22

  • Ekspert
  • *****
  • Wiadomości: 9211
  • Reputacja +1304/-21
  • Wersja programu: Najnowsza
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #5 dnia: Grudzień 17, 2012, 13:19:59 »
Kontrolki muszą być identyczne (z tego co pamiętam to nawet spacje w tytule mają znaczenie). Najlepiej odpowiadające sobie kontrolki przekopiować za pomocą CTRL+C CTRL+V
Sławek, Zduńska Wola

Offline tomaszf

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 523
  • Reputacja +12/-0
  • Wersja programu: Subiekt GT 1.66
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #6 dnia: Grudzień 17, 2012, 13:45:36 »
Dziękuję birds22 - o to chodziło.

Podaje działające zestawienie (może akurat komuś się przyda):

SELECT
tw_symbol AS 'SYMBOL TOWARU',
tw_nazwa AS 'NAZWA TOWARU',
sum(ob_Ilosc)/((DATEDIFF(day,{D:Średnia sprzedaż z okresu od:GETDATE()} , {D:do:GETDATE()}))+1) AS 'ŚREDNIA DZIENNA SPRZEDAŻ',
round((sum(ob_Ilosc)/((DATEDIFF(day,{D:Średnia sprzedaż z okresu od:GETDATE()} , {D:do:GETDATE()}))+1)*{I: Zapas na (ilość dni) :7}),0) AS 'PROPONOWANE ZAMÓWIENIE'
FROM dok_Pozycja
JOIN dok__dokument ON ob_dokhanid=dok_id
JOIN tw__towar On ob_towid=tw_Id
WHERE
tw_IdGrupa={DB: SELECT GRT_ID,GRT_NAZWA AS GRUPA FROM sl_GrupaTw ORDER BY GRUPA:Grupa Towarowa}
AND
ob_dokhanid IN (select dok_id from dok__Dokument where  dok_DataMag BETWEEN {D:Średnia sprzedaż z okresu od:GETDATE()} AND {D:do:GETDATE()})
AND
DOK_TYP=2
GROUP BY tw_nazwa,tw_symbol
ORDER BY tw_nazwa

Ps. Jest możliwość wstawienia tekstu za polem wyboru w kontrolce?
np: w zestawieniu jest {I: Zapas na (ilość dni) :7} i to wyświetla się jako : Zapas na (ilość dni) : 7 wartość oczywiście możemy zmienić.
A ładniej by wyglądało coś takiego: Zapas na 7 dni.
« Ostatnia zmiana: Grudzień 17, 2012, 14:44:22 wysłana przez tomaszf »

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17064
  • Reputacja +798/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #7 dnia: Grudzień 17, 2012, 19:42:43 »
Kontrolka {DR:Okres:GETDATE():GETDATE()}. przy wykonaniu zestawienia pokazuje mi "bieżący dzień"...

Popraw bo to nie jest poprawne, jak zostawisz {DR:Okres} to też otrzymasz domyślną wartość, czyli "bieżący dzień".

Źle zrozumiałem słowa dkozlowskiego...

Ale już wiesz że jest data (D) i zakres dat (DR) :)

Ps. Jest możliwość wstawienia tekstu za polem wyboru w kontrolce?
np: w zestawieniu jest {I: Zapas na (ilość dni) :7} i to wyświetla się jako : Zapas na (ilość dni) : 7 wartość oczywiście możemy zmienić.
A ładniej by wyglądało coś takiego: Zapas na 7 dni.

Nie ma.
Daniel, Białystok.

Offline birds22

  • Ekspert
  • *****
  • Wiadomości: 9211
  • Reputacja +1304/-21
  • Wersja programu: Najnowsza
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #8 dnia: Grudzień 17, 2012, 20:09:00 »
Podaje działające zestawienie (może akurat komuś się przyda):
Może tylko dodam małą uwagę (żeby ktoś się nie sparzył), że jeżeli ktoś używa faktur zbiorczych z WZ to wyniki będą nieprawidłowe.
Sławek, Zduńska Wola

Offline tomaszf

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 523
  • Reputacja +12/-0
  • Wersja programu: Subiekt GT 1.66
Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #9 dnia: Październik 27, 2015, 09:58:51 »
Po latach znów potrzebne mi to zestawienie, jednak tym razem z uwzględnieniem faktur zbiorczych.

Czy po takiej modyfikacji:
SELECT
tw_symbol AS 'SYMBOL TOWARU',
tw_nazwa AS 'NAZWA TOWARU',
sum(ob_IloscMag)/((DATEDIFF(day,{D:Œrednia sprzeda¿ z okresu od:GETDATE()} , {D:do:GETDATE()}))+1) AS 'ŒREDNIA DZIENNA SPRZEDA¯',
round((sum(ob_IloscMag)/((DATEDIFF(day,{D:Œrednia sprzeda¿ z okresu od:GETDATE()} , {D:do:GETDATE()}))+1)*{I: Zapas na (iloœæ dni) :7}),0) AS 'PROPONOWANE ZAMÓWIENIE'
FROM vwdokumenty
JOIN tw__towar On ob_towid=tw_Id
WHERE
tw_IdGrupa={DB: SELECT GRT_ID,GRT_NAZWA AS GRUPA FROM sl_GrupaTw ORDER BY GRUPA:Grupa Towarowa}
AND
dok_datawyst BETWEEN {D:Œrednia sprzeda¿ z okresu od:GETDATE()} AND {D:do:GETDATE()}
AND
DOK_TYP=2
GROUP BY tw_nazwa,tw_symbol
ORDER BY tw_nazwa

zestawienie zadziała poprawnie, obejmując wszystkie faktury sprzedaży?

Forum Użytkownikow Subiekt GT

Odp: Zestawienie : zamówienie na podstawie średniej sprzedaży dziennej w okresie
« Odpowiedź #9 dnia: Październik 27, 2015, 09:58:51 »