Forum Użytkownikow Subiekt GT

InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: siadou w Lipiec 24, 2018, 12:04:58

Tytuł: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: siadou w Lipiec 24, 2018, 12:04:58
Czy ma ktoś może kod wbudowanego zestawienie od Subiekta "Sprzedaż wg. asortymentu" aby nie pisać tego na nowo, bo muszę do niego dopisać kilka kolumn.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 15:19:08
Fabryczne jest chyba zaszyte w samym programie. Ja mam swój własny wariant ale nie obsługuje on np. faktur zbiorczych (bo takich nie wystawiamy), mam zrobione pewne uproszczenie w wyliczaniu kosztu zakupu towaru - biorę zawszę cenę zakupu po wszystkich zmianach i nie obsługuje korekt KKDR (bo takich jeszcze nie wystawiamy).
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 15:22:38
Fabryczne jest chyba zaszyte w samym programie.

Jakie to ma znacznie skoro każdy może podejrzeć wszystkie zapytania.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 15:26:19
OK ale Insert ma prawie wszystkie widoki, procki i funkcje poszyfrowane a profiler tego chyba nie omija?
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 15:33:36
Nie rozumiem pytania - co ma wspólnego podejrzenie definicji szyfrowanych obiektów z podglądaniem zapytań ? Jaki problem stanowią zaszyfrowane obiekty, może sobie odszyfrować lub dostać skrypty od dostawcy programu ?
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 15:46:20
Profiler z tego co wiem nie jest dostępny w edycji Express SQL-a więc chyba jednak nie każdy będzie mógł skorzystać. Że można odszyfrować to wiem, narzędzi do tego nie brakuje, nawet darmowych. Chyba nawet gotowe zapytanie na to gdzieś widziałem. Że skrypty można dostać też wiem bo jakieś nienajświeższe gdzieś mam. Ale nie spodziewałbym się jednak tego, żeby wielu osobom z forum chciało się zaglądać do profilera.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: siadou w Lipiec 24, 2018, 15:53:52
No ja dostępu nie mam do głębi bazy SQL widzę tylko to co mam w zakładce zestawienia a potrzebuję całego kodu zapytania by go zmodyfikować.
Bo brakuje mi z tym zestawieniu, suma dwóch magazynów, oraz symbolu u dostawcy.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 15:57:28
Jak znajdę chwilę to wydłubię. Będę musiał to trochę przerobić bo mam tam różne filtry odwołujące się do widoków własnej roboty i inne swoje duperele.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 16:02:30
Profiler z tego co wiem nie jest dostępny w edycji Express SQL-a więc chyba jednak nie każdy będzie mógł skorzystać.

Jest dokładnie tak jak napisałem i powtarzam to do znudzenia na forum od lat - Profiler Microsoftu jest od lat dołączany do wersji Express, są również dostępne darmowe narzędzia, mało tego, są dostępne już za darmo pełne wersje, wiec rozmiar bazy danych też nie jest problemem.

Ale nie spodziewałbym się jednak tego, żeby wielu osobom z forum chciało się zaglądać do profilera.

To już niestety Twój problem i tych innych osób, wiedza i doświadczenia nie bierze się znikąd, w nauce pomogę, ale nie będę pracował za kogoś... Nikt nie każe nikomu samodzielnie pisać zestawień, można przecież zamówić gotowe rozwiązanie.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 16:04:19
No ja dostępu nie mam do głębi bazy SQL...

Jak już pisałem - nie prawda, tak nie jest, masz dostęp do wszystkiego jeśli tylko będzie chciało Ci się zajrzeć.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 16:11:35
Jeśli nie ma loginu i hasła do bazy to się nie dostanie. Nie trzeba przecież znać tych rzeczy żeby móc pracować w Subiekcie.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: siadou w Lipiec 24, 2018, 16:16:25
Kolego ja nie jestem administratorem serwera i nie mam bezpośredniego dostępu do miejsca lokalizacji bazy SQL, mam dostęp normalnego użytkownika do samego programu. Jeśli da się to zrobić z poziomu mojego komputera i tego co na nim jest nie łącząc się z serwerem to proszę o podpowiedź z czego skorzystać, ewentualnie podesłać tutorial który to pokazuje. Nie chcę aby ktoś mi pisał zestawienie chcę tylko pomoc w zdobyciu kodu zestawienia już zawartego w Subiekcie.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: birds22 w Lipiec 24, 2018, 16:23:29
http://www.forumsubiekta.pl/dodatki-zestawienia/sprzedaz-wg-asortymentu-zapytanie-sql/msg47273/#msg47273
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 16:29:29
Zapomniałem już jak strasznie powolne są fabryczne zestawienia :) Ponad minuta na przeliczenie jednego miecha vs 5s :)
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: siadou w Lipiec 24, 2018, 16:33:02
Ale ktoś słabego matrixa napisał :)
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: birds22 w Lipiec 24, 2018, 16:38:45
Zapomniałem już jak strasznie powolne są fabryczne zestawienia :) Ponad minuta na przeliczenie jednego miecha vs 5s :)

Wszystko zależy co chcemy policzyć. Jeżeli nie chcemy dokładnego wyliczenia kosztu sprzedaży to zestawienie może być rzeczywiście bardzo odchudzone.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: candy w Lipiec 24, 2018, 16:39:01
Zapomniałem już jak strasznie powolne są fabryczne zestawienia :) Ponad minuta na przeliczenie jednego miecha vs 5s :)
Porównujesz fabryczne zestawienie, które pokazuje wszystkie warianty ze swoim, które nie uwzględnia m.in. faktur zbiorczych?
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: birds22 w Lipiec 24, 2018, 16:43:41
Ale ktoś słabego matrixa napisał :)

Słabego, bo.... ?
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 16:44:49
Jeśli nie ma loginu i hasła do bazy to się nie dostanie. Nie trzeba przecież znać tych rzeczy żeby móc pracować w Subiekcie.

Kolego ja nie jestem administratorem serwera i nie mam bezpośredniego dostępu do miejsca lokalizacji bazy SQL, mam dostęp normalnego użytkownika do samego programu. Jeśli da się to zrobić z poziomu mojego komputera i tego co na nim jest nie łącząc się z serwerem to proszę o podpowiedź z czego skorzystać, ewentualnie podesłać tutorial który to pokazuje. Nie chcę aby ktoś mi pisał zestawienie chcę tylko pomoc w zdobyciu kodu zestawienia już zawartego w Subiekcie.

Powtórzę raz jeszcze - nic nie poradzę na to, że komuś nie chce i usilnie szuka wymówek, zamiast skorzystać z banalnie prostego rozwiązania - każdy może zostać administratorem - można pobrać program ze strony Insertu, zainstalować, założyć podmiot demo i podejrzeć działanie programu...

Przypominam też, że zestawienia w programie są budowane inaczej niż zestawienia SQL, kod jest budowany dynamicznie w zależności od wybranych filtrów zestawienia...
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 17:05:11
Zapomniałem już jak strasznie powolne są fabryczne zestawienia :) Ponad minuta na przeliczenie jednego miecha vs 5s :)
Porównujesz fabryczne zestawienie, które pokazuje wszystkie warianty ze swoim, które nie uwzględnia m.in. faktur zbiorczych?

Tak to było porównanie mojego zestawienia do fabrycznego. A co nie wolno mi dokonać takiego porównania?


Zapomniałem już jak strasznie powolne są fabryczne zestawienia :) Ponad minuta na przeliczenie jednego miecha vs 5s :)


Wszystko zależy co chcemy policzyć. Jeżeli nie chcemy dokładnego wyliczenia kosztu sprzedaży to zestawienie może być rzeczywiście bardzo odchudzone.
Jak puszczę sprzedaż wg asortymentu i wezmę całą sprzedaż to moje zestawienie da dokładnie taki sam wynik (uwzględni korekty zakupu zmieniające ceny zakupu towarów). Fakt nie obejmuje ono wszystkich możliwych sytuacji handlowych a tylko wyłącznie te, które zachodzą u nas ale robi to dokładnie tak jak chcemy.


Ale ktoś słabego matrixa napisał :)
To głównie przez wykorzystanie funkcji fnZestSub_KosztSpr w zestawieniu. Takie funkcje często wymuszają wykonanie zapytania wiersz po wierszu a takie coś się zawsze wlecze.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: birds22 w Lipiec 24, 2018, 17:13:35
Fakt nie obejmuje ono wszystkich możliwych sytuacji handlowych a tylko wyłącznie te, które zachodzą u nas ale robi to dokładnie tak jak chcemy.

A prawie robi czasami wielką różnicę. Jak napiszesz zestawienie obejmujące wszystkie sytuacje, które obejmuje zestawienie fabryczne i będzie działało szybciej to wtedy się pochwal, bo tak to brzmi jak "mój rower jeździ szybciej, ale tylko wtedy jak ma z górki".
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 17:20:33
Ale ktoś słabego matrixa napisał :)
To głównie przez wykorzystanie funkcji fnZestSub_KosztSpr w zestawieniu. Takie funkcje często wymuszają wykonanie zapytania wiersz po wierszu a takie coś się zawsze wlecze.

To kompletnie nie tak... Funkcja nie wpływa na czas wykonania zapytania (nie jest wyliczana dla każdego wiersza) do momentu, kiedy nie znajduje się w kryteriach zapytania... Funkcje nie zawsze się wleką, tak się dzieje niestety ze wszystkimi funkcjami w Microsofcie, ale inne silniki SQL potrafią indeksować funkcje deterministyczne, na niedeterministyczne dobrego sposobu nie ma.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: candy w Lipiec 24, 2018, 18:23:08


Porównujesz fabryczne zestawienie, które pokazuje wszystkie warianty ze swoim, które nie uwzględnia m.in. faktur zbiorczych?

Tak to było porównanie mojego zestawienia do fabrycznego. A co nie wolno mi dokonać takiego porównania?
Ależ oczywiście że wolno.
Jeśli widzisz w tym sens...
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 18:59:46
To kompletnie nie tak... Funkcja nie wpływa na czas wykonania zapytania (nie jest wyliczana dla każdego wiersza) do momentu, kiedy nie znajduje się w kryteriach zapytania... Funkcje nie zawsze się wleką, tak się dzieje niestety ze wszystkimi funkcjami w Microsofcie, ale inne silniki SQL potrafią indeksować funkcje deterministyczne, na niedeterministyczne dobrego sposobu nie ma.

Funkcja fnZestSub_KosztSpr jest jak najbardziej funkcją skalarną wymuszająco osobne wyliczenia dla każdego wiersza, który zostanie zgarnięty przez warunki spełnione w zapytaniu. Według skryptów, które mam funkcja przyjmuje dokładnie dwie pojedyncze wartości: datę i identyfikator pozycji i zwraca pojedynczą wartość money. Jakby to napisane z użyciem funkcji typu TVF zwracająca tablicę to może mogłoby to pracować szybciej. Obejrzałem sobie plan tego  zapytania - tona hash matchy z unionami a w nich pełno nested loopów. Takie coś będzie się wlekło.


Jasne Oracle może w jakimś stopniu indeksować po funkcjach, Postgres ma indeksy typu trigram do super szybkiego wyszukiwania tekstowego a MySQL potrafi się położyć wydajnościowo na zwykłym joinie jak nie ma indeksu podczas gdy przy identycznym zapytaniu SQL Server będzie śmigał ale co to ma do rzeczy?
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 19:40:25
To kompletnie nie tak... Funkcja nie wpływa na czas wykonania zapytania (nie jest wyliczana dla każdego wiersza) do momentu, kiedy nie znajduje się w kryteriach zapytania... Funkcje nie zawsze się wleką, tak się dzieje niestety ze wszystkimi funkcjami w Microsofcie, ale inne silniki SQL potrafią indeksować funkcje deterministyczne, na niedeterministyczne dobrego sposobu nie ma.

Funkcja fnZestSub_KosztSpr jest jak najbardziej funkcją skalarną wymuszająco osobne wyliczenia dla każdego wiersza,

Ale każde obliczenie to wymusza, funkcja nie jest żądnym wyjątkiem.

..., który zostanie zgarnięty przez warunki spełnione w zapytaniu.

O tym wcześniej nie wspomniałeś.

Jasne Oracle może w jakimś stopniu indeksować po funkcjach, Postgres ma indeksy typu trigram do super szybkiego wyszukiwania tekstowego a MySQL potrafi się położyć wydajnościowo na zwykłym joinie jak nie ma indeksu podczas gdy przy identycznym zapytaniu SQL Server będzie śmigał ale co to ma do rzeczy?

No to, że tak ogólna wypowiedź nie była prawdziwa.
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 24, 2018, 20:21:28
To kompletnie nie tak... Funkcja nie wpływa na czas wykonania zapytania (nie jest wyliczana dla każdego wiersza) do momentu, kiedy nie znajduje się w kryteriach zapytania... Funkcje nie zawsze się wleką, tak się dzieje niestety ze wszystkimi funkcjami w Microsofcie, ale inne silniki SQL potrafią indeksować funkcje deterministyczne, na niedeterministyczne dobrego sposobu nie ma.

Funkcja fnZestSub_KosztSpr jest jak najbardziej funkcją skalarną wymuszająco osobne wyliczenia dla każdego wiersza,

Ale każde obliczenie to wymusza, funkcja nie jest żądnym wyjątkiem.
Nie, nie każde. Np. obliczenia SUM i AVG albo x+y  czy nawet jakieś sum(x*y+z), nawet z jakimś nieprzesadnie rozbudowanym case'm nie robią takich sieczek jak to zapytanie od Insertu. Jak się wrzuca funkcje, która wywołuje kolejną funkcję (fnZestSub_KosztSpr wywołuje fnSub_CenaSerii) to nie ma co oczekiwać cudów.


..., który zostanie zgarnięty przez warunki spełnione w zapytaniu.

O tym wcześniej nie wspomniałeś.
Bo to jest oczywiste dla każdego z jako-taką znajomością SQLa?
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: dkozlowski w Lipiec 24, 2018, 20:59:07
To kompletnie nie tak... Funkcja nie wpływa na czas wykonania zapytania (nie jest wyliczana dla każdego wiersza) do momentu, kiedy nie znajduje się w kryteriach zapytania... Funkcje nie zawsze się wleką, tak się dzieje niestety ze wszystkimi funkcjami w Microsofcie, ale inne silniki SQL potrafią indeksować funkcje deterministyczne, na niedeterministyczne dobrego sposobu nie ma.

Funkcja fnZestSub_KosztSpr jest jak najbardziej funkcją skalarną wymuszająco osobne wyliczenia dla każdego wiersza,

Ale każde obliczenie to wymusza, funkcja nie jest żądnym wyjątkiem.
Nie, nie każde. Np. obliczenia SUM i AVG albo x+y  czy nawet jakieś sum(x*y+z), nawet z jakimś nieprzesadnie rozbudowanym case'm nie robią takich sieczek jak to zapytanie od Insertu. Jak się wrzuca funkcje, która wywołuje kolejną funkcję (fnZestSub_KosztSpr wywołuje fnSub_CenaSerii) to nie ma co oczekiwać cudów.

Nie prawda, każde - jak niby SQL ma zwrócić wynik bez wykonania obliczenia ? :o Nie mieszaj problemów - była mowa o obliczeniach dla każdego wiersza, a nie ich wydajności, jeśli funkcja będzie prosta "x+y" to nie zauważysz różnic w czasie wykonania - problemem nie jest wykorzystanie funkcji tylko obliczenia, które wykonuje.

..., który zostanie zgarnięty przez warunki spełnione w zapytaniu.

O tym wcześniej nie wspomniałeś.

Bo to jest oczywiste dla każdego z jako-taką znajomością SQLa?

Z "jako-taką" - nie żartuj już więcej... Dla takiej osoby tak samo samo powinno być oczywiste jak odczytać treść zapytania z programu, który pracuje na SQL'owej bazie danych (nie ważne jakiej), a co pokazał ten wątek - nawet jak podałem rozwiązanie to nie zostało wykorzystane...
Tytuł: Odp: Zestawienie SQL Subiekt GT Sprzedaż wg. asortymentu
Wiadomość wysłana przez: yemet w Lipiec 27, 2018, 16:14:46
Po wymianie PW z OP-em takie cuś nam z tego wyszło:

SELECT
'Symbol'=tt.tw_Symbol
   ,'Nr. Kat'=tt.tw_DostSymbol
   ,'Nazwa' = CASE
      WHEN tt.tw_Nazwa = ''
         THEN '(Brak nazwy towaru)'
      ELSE CASE
            WHEN tt.tw_Nazwa IS NULL
               THEN '(Usługa jednorazowa)'
            ELSE tt.tw_Nazwa
            END
      END
   ,'Grupa'=slg.grt_Nazwa
   ,'Sprzedane_SUM'=SUM(z.ob_IloscMag * z.ob_Znak)

   ,'Brutto_Sum'=SUM(z.ob_WartBrutto * z.ob_Znak)
   ,'Netto_Sum'=SUM(z.ob_WartNetto * z.ob_Znak)
                ,'Dost_T'=SUM(ts1.st_Stan-ts1.st_StanRez)
   ,'Dost_D'=SUM(ts2.st_Stan-ts2.st_StanRez)
                ,'Sum_Dost'=SUM((ts1.st_Stan-ts1.st_StanRez)+(ts2.st_Stan-ts2.st_StanRez))
   ,'Koszt'=SUM(CASE
         WHEN (z.ob_TowRodzaj & 6) > 0
            THEN 0
         ELSE dbo.fnZestSub_KosztSpr({D:Data OD:SELECT convert(date,getdate())}, z.ob_Id) * z.ob_Znak
         END)
   ,'Zysk'=SUM((
         z.ob_WartNetto - CASE
            WHEN (z.ob_TowRodzaj & 6) > 0
               THEN 0
            ELSE dbo.fnZestSub_KosztSpr({D:Data OD:SELECT convert(date,getdate())}, z.ob_Id)
            END
         ) * z.ob_Znak)
   ,'Marża' = CONVERT(MONEY, CASE
         WHEN SUM(z.ob_WartNetto * z.ob_Znak) <> 0
            THEN (
                  SUM((
                        z.ob_WartNetto - CASE
                           WHEN (z.ob_TowRodzaj & 6) > 0
                              THEN 0.0000
                           ELSE dbo.fnZestSub_KosztSpr({D:Data OD:SELECT convert(date,getdate())}, z.ob_Id)
                           END
                        ) * z.ob_Znak) / SUM(z.ob_WartNetto * z.ob_Znak)
                  ) * 100
         ELSE 0.0000
         END)

FROM vwZstSprzWgKhnt z
LEFT JOIN tw__Towar  tt ON ob_TowId = tt.tw_Id AND ((z.dok_DataWyst >= {D:Data OD:SELECT convert(date,getdate())}) AND (z.dok_DataWyst <= {D:Data DO:SELECT convert(date,getdate())}))
LEFT JOIN sl_GrupaTw slg ON tt.tw_IdGrupa = slg.grt_Id
left join tw_Stan ts1 on tt.tw_Id=ts1.st_TowId and ts1.st_MagId={DB:select m1.mag_Id,m1.mag_Nazwa from sl_Magazyn m1 order by m1.mag_Nazwa:magazyn 1:1:TAM Sklep Tamka 37 }
left join tw_Stan ts2 on tt.tw_Id=ts2.st_TowId and ts2.st_MagId={DB:select m2.mag_Id,m2.mag_Nazwa from sl_Magazyn m2 order by m2.mag_Nazwa:magazyn 2:2:MDG Sklep Dzielna 5}
WHERE dok_Status <> 2


AND ((z.dok_DataWyst >= {D:Data OD:SELECT convert(date,getdate())}) AND (z.dok_DataWyst <= {D:Data DO:SELECT convert(date,getdate())}))
     
and ((z.dok_Podtyp & 0xffff) | ((z.dok_typ & 0xffff) * 65536)) in ({CHL_DB:select convert(int,0x020000),'Faktura sprzedaży' union all select convert(int,0x020001),'Faktura sprzedaży detaliczna'  union all select convert(int,0x020002),'Faktura sprzedaży zbiorcza'  union all select convert(int,0x020003),'Faktura zaliczkowa'  union all select convert(int,0x040000),'Rachunek sprzedaży'  union all select convert(int,0x060000),'Korekta faktury sprzedaży'   union all select convert(int,0x060001),'Korekta faktury sprzedaży do nieistniejącego'  union all select convert(int,0x0E0000),'Zwrot detaliczny'  union all select convert(int,0x0E0001),'Zwrot detaliczny do nieistniejącego'  union all select convert(int,0x150000),'Paragon'  union all select convert(int,0x150002),'Paragon imienny'  union all select convert(int,0x150003),'Paragon odebrany z kasy'  union all select convert(int,0x150001),'Dokument fiskalny'  union all select convert(int,0x020004),'FSzc Faktura sprzedaży zaliczkowa częściowa'  union all select convert(int,0x020005),'FSzk Faktura sprzedaży zaliczkowa końcowa'  union all select convert(int,0x060002),'KFSzc Korekta całkowita faktury zaliczkowej cząstkowej':typ dokumentu:131072,131074,131075,262144,393216,393217,917504,917505,1376256,1376258,1376259,1376257,131076,131077,393218:bez faktur detalicznych})
     
AND (z.dok_MagId IN  ({CHL_DB: select distinct dd.dok_MagId, slm.mag_Nazwa from dok__Dokument dd inner join sl_Magazyn slm on dd.dok_MagId=slm.mag_Id and dd.dok_Typ in (2,6,14,21) UNION ALL SELECT     -1, ' [dowolny magazyn]' order by slm.mag_Nazwa:magazyn:-1:dowolny})
or -1 IN ({CHL_DB: select distinct dd.dok_MagId, slm.mag_Nazwa from dok__Dokument dd inner join sl_Magazyn slm on dd.dok_MagId=slm.mag_Id and dd.dok_Typ in (2,6,14,21) UNION ALL SELECT     -1, ' [dowolny magazyn]' order by slm.mag_Nazwa:magazyn:-1:dowolny}))
   
     
AND z.ob_TowRodzaj & 15 > 0
 
and (z.dok_KatId IN ({CHL_DB: select distinct dd.dok_KatId, slk.kat_Nazwa from dok__Dokument dd inner join sl_Kategoria slk on dd.dok_KatId=slk.kat_Id and dd.dok_Typ in (2,6,14,21) UNION ALL SELECT     -1, ' [brak kategorii]'  UNION ALL SELECT     - 2, ' (wszystkie kategorie)' order by kat_Nazwa:kategoria dokumentu:-2:wszystkie kategorie})
or -2 in ({CHL_DB: select distinct dd.dok_KatId, slk.kat_Nazwa from dok__Dokument dd inner join sl_Kategoria slk on dd.dok_KatId=slk.kat_Id and dd.dok_Typ in (2,6,14,21) UNION ALL SELECT     -1, ' [brak kategorii]'  UNION ALL SELECT     - 2, ' (wszystkie kategorie)' order by kat_Nazwa:kategoria dokumentu:-2:wszystkie kategorie}))


and (z.dok_RodzajOperacjiVat IN ({CHL_DB: SELECT -1 AS operacja_id, '(wszystkie transakcje)' AS operacja_nazwa UNION ALL SELECT  0, 'S - sprzedaż krajowa' UNION ALL SELECT     1, 'EX - eskport poza kraje EU' UNION ALL SELECT     2, 'WDT - wewnętrzspólnotowa dostawa towarów'  UNION ALL SELECT     3, 'WTTD - transakcja trójstronna (dostawa)' UNION ALL SELECT     4, 'EXU - eksport usług' UNION ALL SELECT     6, 'OOS - odwrotne obciążenie (sprzedaż)' UNION ALL SELECT     12, 'SPTK - sprzedaż poza terytorium kraju' UNION ALL SELECT 21, 'OOU - odwrotne obciążenie świadczenie usług':rodzaj transakcji VAT:-1:wszystkie rodzaje})
or -1 in({CHL_DB: SELECT -1 AS operacja_id, '(wszystkie transakcje)' AS operacja_nazwa UNION ALL SELECT  0, 'S - sprzedaż krajowa' UNION ALL SELECT     1, 'EX - eskport poza kraje EU' UNION ALL SELECT     2, 'WDT - wewnętrzspólnotowa dostawa towarów'  UNION ALL SELECT     3, 'WTTD - transakcja trójstronna (dostawa)' UNION ALL SELECT     4, 'EXU - eksport usług' UNION ALL SELECT     6, 'OOS - odwrotne obciążenie (sprzedaż)' UNION ALL SELECT     12, 'SPTK - sprzedaż poza terytorium kraju' UNION ALL SELECT 21, 'OOU - odwrotne obciążenie świadczenie usług':rodzaj transakcji VAT:-1:wszystkie rodzaje}))

and (tt.tw_IdGrupa  IN ({CHL_DB:select distinct grupa_id=tt.tw_IdGrupa, grupa_nazwa=slg.grt_Nazwa from tw__Towar tt inner join sl_GrupaTw slg on tt.tw_IdGrupa=slg.grt_Id union all select -1, ' [wszystkie grupy]' order by grt_nazwa:z grupy:2:Zabawki})
 or -1 in ({CHL_DB:select distinct grupa_id=tt.tw_IdGrupa, grupa_nazwa=slg.grt_Nazwa from tw__Towar tt inner join sl_GrupaTw slg on tt.tw_IdGrupa=slg.grt_Id union all select -1, ' [wszystkie grupy]' order by grt_nazwa:z grupy:2:Zabawki}))


and (z.ob_TowRodzaj  IN ({CHL_DB: select -1 as rodzaj_id, '(dowolny)' as rodzaj_nazwa union all select 1, 'towar' union all select 8, 'komplet' union all select 2, 'usługa' union all select 4, 'opakowanie zwrotne':rodzaj elementu:-1:dowolny})
 or -1 in ({CHL_DB: select -1 as rodzaj_id, '(dowolny)' as rodzaj_nazwa union all select 1, 'towar' union all select 8, 'komplet' union all select 2, 'usługa' union all select 4, 'opakowanie zwrotne':rodzaj elementu:-1:dowolny}))

and z.ob_towid IN ({LM:TW:Towar:(select tw_id from tw__towar):wszystkie})
and isnull(z.dok_platnikid,-1) IN ({LM:KH:Klient:(select kh_id from kh__kontrahent union all select -1):wszyscy})   
   
and
(tw_Zablokowany IN  ({LI:Dowolny#-1#Aktywny#0#Nieaktywny#1#:Towary o statusie:-1:dowolny})  or -1 IN ({LI:Dowolny#-1#Aktywny#0#Nieaktywny#1#:Towary o statusie:-1:dowolny}))

GROUP BY tt.tw_DostSymbol
   ,tt.tw_Nazwa
   ,tt.tw_Symbol
   ,slg.grt_Nazwa