Forum Użytkownikow Subiekt GT
InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: peter1031 w Sierpień 08, 2019, 19:06:42
-
Witam wszystkich! Próbuję napisać zestawienie pokazujące sprzedaż wg asortymentu na podstawie zadanej daty zakończenia sprzedaży. Niestety nie liczy jak należy i rozjeżdża się z tym co jest zapisane na kontach w rewizorze. Ma może ktoś pomysł co może tu nie grać. Na razie skupiam się tylko na netto. Oto kod
SELECT
dok__Dokument.dok_DataZakonczenia AS [data sprz],
dok__Dokument.dok_DataWyst AS [data wyst],
dok__Dokument.dok_NrPelny AS [nr],
tw__Towar.tw_Nazwa AS [nazwa],
tw__Towar.tw_Symbol AS [symbol],
sl_GrupaTw.grt_Nazwa AS [grupa],
dok_Pozycja.ob_Ilosc AS [ilość],
dok_Pozycja.ob_Jm AS [j.m.],
dok_Pozycja.ob_WartBrutto AS [brutto],
dok_Pozycja.ob_WartNetto * dok_Pozycja.ob_Znak AS [netto],
dok_Pozycja.ob_WartMag AS [koszt],
(dok_Pozycja.ob_WartNetto-dok_Pozycja.ob_WartMag) AS [zysk netto],
CASE dok_Pozycja.ob_WartMag
WHEN 0 THEN 100
ELSE ((dok_Pozycja.ob_WartNetto/dok_Pozycja.ob_WartMag-1)*100)
END AS [marża %]
FROM dok__Dokument, dok_Pozycja, tw__Towar, sl_GrupaTw
WHERE
(dok__Dokument.dok_Typ=2 OR dok__Dokument.dok_Typ=6) AND
(dok__Dokument.dok_DataZakonczenia BETWEEN {DR: Data}) AND
dok_MagId IN ({CHL_DB: SELECT mag_Id, mag_Nazwa FROM sl_Magazyn:Magazyn:0:(nie podano wartości)}) AND
(dok__Dokument.dok_KatId IN ({CHL_DB: SELECT kat_Id, kat_Nazwa FROM sl_Kategoria:Kategoria:0:(nie podano wartości)})) AND
dok_Pozycja.ob_DokHanId=dok__Dokument.dok_Id AND
tw__Towar.tw_Id=dok_Pozycja.ob_TowId AND
sl_GrupaTw.grt_Id=tw__Towar.tw_IdGrupa
-
Raczej odpuść sobie pisanie od zera bo zajmie Ci to kupę czasu. Nie żeby nie dało się tego zrobić - da się napisać takie zapytanie całkiem od zera ale to droga przez mękę.
Odpal Profilera, przechwyć sobie fabryczne zestawienie sprzedaży wg asortymentu i zmodyfikuj zapytanie, które Ci wypluje Profiler.
sl_GrupaTw.grt_Id=tw__Towar.tw_IdGrupa
Staraj się unikać takiej notacji - łatwo zrobić potężnego babola pt. iloczyn kartezjański jak zapomnisz napisać warunek dla którejś z tabel. Plus na dłuższą metę jest to mniej czytelne - litania do wszystkich świętych w WHERE się z tego robi. Pisz JOINy a konkretnie LEFT OUTER JOINy w takich przypadkach: towar czy dokument może nie mieć żadnej grupy czy kategorii przypisanej i już na starcie będziesz miał złe wyniki bo ci odfiltruje takie rekordy. Filtry trzeba napisać tak żeby mogły obsłużyć NULLe wynikające z left joina. I korzystaj z aliasów.
dok_Pozycja.ob_WartMag AS [koszt],
(dok_Pozycja.ob_WartNetto-dok_Pozycja.ob_WartMag) AS [zysk netto],
CASE dok_Pozycja.ob_WartMag
WHEN 0 THEN 100
ELSE ((dok_Pozycja.ob_WartNetto/dok_Pozycja.ob_WartMag-1)*100)
END AS [marża %]
Zysku ani marży w ten sposób nie policzysz dobrze. No chyba, że nie masz żadnych korekt cen zakupu ale nie dam za to głowy. Do policzenia tego jak należy potrzebne są jeszcze tabele dok_magruch i dok_magwart.
A tak na koniec - czemu ma służyć to zapytanie?
-
Księgowa sobie zażyczyła takie zestawienie. Przechwycałem zapytanie profilerem. Fabryczne bierze większość informacji z widoku w którym nie widnieje data zakończenia sprzedaży a coś mi nie wychodzi żeby ją dodać bez edycji widoku i muszę jeszcze dodać filtrowanie kategoriami.
-
Księgowa sobie zażyczyła takie zestawienie. Przechwycałem zapytanie profilerem. Fabryczne bierze większość informacji z widoku w którym nie widnieje data zakończenia sprzedaży a coś mi nie wychodzi żeby ją dodać bez edycji widoku i muszę jeszcze dodać filtrowanie kategoriami.
Na tym co przechwyciłeś zrób jeszcze jednego joina na dok__dokument z aliasem i już masz dostęp do tej daty. Nie jest to może najpiękniejsze rozwiązanie ale będzie działać.
-
Tak zrobiłem i jest dobrze. Jeszcze muszę trochę zmodyfikować kod i najwyżej w razie problemów zwrócę się po pomoc. Dzięki