Forum Użytkownikow Subiekt GT
InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: sztywniak w Grudzień 23, 2010, 21:04:46
-
zaczynamy
Subiekt GT przechowuje dane w bazie MS SQL Server. Dane w tej bazie są uporządkowane w pewną strukture.
dane o towarach przechowywane są w tabeli tw__towar
dane o nagłówkach dokumentów w tabeli dok__dokument
dane o pozycjach dokumentów w tabeli dok_pozycja
dane o rozrachunkach w tabeli nz__finanse
jest tam dużo więcej tabel ale o tym w kolejnych lekcjach.
Każda z tabel np tw__towar składa się z pól w których znajdują się konkretne dane i tak :
tw_id - identyfikator wewnętrzny towaru
tw_symbol - symbol towaru
tw_nazwa - nazwa towaru
tw_opis - opis towaru
tw_PKWIU - PKWIU
Zacznijmy więc od towarów. Jeżeli chcemy wyciągnąć jakieś dane z bazy używamy polecenia SELECT.
Jego uproszczona składnia to :
SELECT pola_ktore_chcemy_wyciagnac FROM nazwa_tabeli WHERE warunki_jakie_maja_spelnić_wyswietlone_dane
Przykład 1 :
SELECT tw_symbol, tw_nazwa FROM tw__towar
To polecenie wyciągnie informacje o symbolu i nazwie wszystkich towarów z bazy.
Przykład 2 :
SELECT tw_symbol, tw_nazwa FROM tw__towar WHERE tw_nazwa LIKE 'p%'
To polecenie wyciągnie informacje o symbolu i nazwie towarów których nazwa zaczyna się na litere P.
Jeśli chcemy zobaczyć wszystkie pola jakiejś tabeli możemy użyć znaku * (gwiazdka)
Przykład 3:
SELECT * FROM tw__towar
To polecenie wyciągnie informacje o wszystkich danych w tabeli. W taki sposób możemy podejrzeć jakie w tabeli są pola.
Polecam obejrzeć sobie te pola i poćwiczyć wyciąganie różnych pól.
CDN ...
-
A ja mam pytanie: czy wynik takiego zestawienia możne zapisać się w pliku .txt
-
Możesz sam zapisać poprzez kopiuj->wklej lub operacje na liście-->drukuj listę i tam wskazujesz że chcesz do pliku
-
Ale mi chodzi o to czy można to zautomatyzować tak, aby powstawał plik z wynikiem tego zestawienia
-
Zainteresuj się narzędziem osql (masz je w instalacji SQL serwera). Możesz napisać treść zapytania w pliku tekstowym i kazać "wyrzucić" wynik do pliku tekstowego
-
Czy któryś z kolegów posiada opis bazy danych Insert mam taka z wersji 1.16 ale jest juz troche nie aktualna ?
-
Insert pisał na swojej stronie, że schemat można dostać u autoryzowanych partnerów ale jak rozmawiałem z jednym twierdzi, że nic takiego nie mają... więc może być ciężko...
-
mam taka z wersji 1.16
tez znalazłem w sieci tylko v1.05 czyli całkowity staroć a chętnie bym skorzystał z nowej.
-
napisz do nich maila i pewnie dostaniesz
i proszę jest
Pzdr BN
-
Nie mogę tego dodać do zestawień:
pojawia się komunikat:
błąd w pliku - Linia 0, pozycja 0 i poniżej - proszę podać plik z XML...... i dla XLS to samo.....
-
Tego nie dodajesz do zestawień. Otwierasz po prostu plik XML
-
Plik XML jest tekstowy i wygląda jak zapytanie sql-owe. Być może tak ma być.
Ja raczej myślałem o pliku z ładnym opisem, bo taki znalazłem w sieci, z pełną charakterystyką poszczególnych tabel i pól.
-
Otwórz lik xml w Internet Explorer to będziesz miał ładne tabelki
-
a czy ktos posiada i moglby udostepnic specyfikacje do view i funkcji bazy subiekta?
ew czy mozna to jakos wyciagnac z bazy?
to niezwykle pomocne w zestawieniach bedzie
-
niestety jest to niezgodne z prawem
-
Niezgodne publikowanie czy posiadanie?;-)
Bo autoryzowani serwisanci maja do tego sekretu dostep?
A w necie strzepy sa raz ktos podaje jedno raz inne... A do zestawien w sam raz by sie przydalo:-)
-
nie, autoryzowani serwisanci nie mają dostępu do źródeł procedur ...
publikowana jest jedynie dokumentacja tabel
-
Dla podobnych do mnie podaję ciekawą stronę:
http://www.sql-kursy.pl/sql-kurs-podstawy.html (http://www.sql-kursy.pl/sql-kurs-podstawy.html)
Subiekt GT przechowuje dane w bazie MS SQL Server. Dane w tej bazie są uporządkowane w pewną strukture.
dane o towarach przechowywane są w tabeli tw__towar
dane o nagłówkach dokumentów w tabeli dok__dokument
dane o pozycjach dokumentów w tabeli dok_pozycja
dane o rozrachunkach w tabeli nz__finanse
jest tam dużo więcej tabel ale o tym w kolejnych lekcjach.
Można prosić o kolejną lekcję ?
Pozdrawiam.
-
muszę się zmotywować do napisania kolejnych lekcji, skutecznie utrudnia mi to praca zawodowa ;-)
-
Witam,
co w sytuacji kiedy chciałbym wyciągnąć dane o wartości VAT dla każdego produktu ?
w której tabeli są trzymane te dane?
jak do tej pory trafiłem na tabele dok_Vat ale nie nie jestem pewien czy to poprawna tabela..
-
dok_vat to podsumowanie VAT z dokumentów
Pozycje na dokumentach są w tabeli dok_pozycja (dane dotyczące wartości Vat dla tych pozycji też tam są)
-
wyciągam z bazy po kolei:
SELECT tw_Symbol, tw_Nazwa, st_Stan, tc_CenaBrutto1, tw_PKWiU, tw_PodstKodKresk
FROM tw__Towar
INNER JOIN tw_Stan ON tw__Towar.tw_Id = tw_Stan.st_TowId
INNER JOIN tw_Cena ON tw__Towar.tw_Id = tw_Cena.tc_IdTowar
WHERE tw_Stan.st_MagId = 1"
teraz jeżeli chce wyciągnąć % VAT dla danego towaru to wyciągam
ob_VatProc gdzie tw__Towar.tw_Id = dok_Pozycja.ob_TowId ?
a jesli tak to dlaczego w ob_TowId znajduje się kilka takich samych wartości ??
-
Musisz dokładniej określać co chcesz uzyskać. Najpierw napisałeś, że chcesz "wyciągnąć dane o wartości VAT dla każdego produktu". Wartość kojarzy mi się raczej z kwotą więc pomyślałem, że jak kwota vat to pewnie z pozycji dokumentów.
Teraz jednak widzę, że piszesz o stawce procentowej - to zupełnie inna sprawa.
W tw__towar masz tw_idvatsp czyli identyfikator stawki vat przy sprzedaży a w sl_stawkavat masz słownik stawek vat
-
fakt, moja nieuwaga chodziło mi o Stawkę %,
Próbuje wyciągnąć dane w postaci
Symbol | Nazwa | stan | cena | PKWiU | EAN | VAT%
SELECT tw_Symbol, tw_Nazwa, st_Stan, tc_CenaBrutto1, tw_PKWiU, tw_PodstKodKresk, vat_Stawka
FROM tw__Towar
INNER JOIN tw_Stan ON tw__Towar.tw_Id = tw_Stan.st_TowId
INNER JOIN tw_Cena ON tw__Towar.tw_Id = tw_Cena.tc_IdTowar
INNER JOIN sl_StawkaVat ON tw__Towar.tw_IdVatSp = sl_StawkaVAT.vat_Id
WHERE tw_Stan.st_MagId = 1"
chyba powinno być ok.
Dzięki ;)
-
Czy może ktoś wrzucić najświeższą dokumentację bazy danych subiekta 1.28
bo 1.29 nie musi być :)
-
Jakby ktoś wrzucił od razu 1.29 też byłoby miło :)
-
Trzeba napisać do Insertu.
Na forum jest specyfikacja chyba do 1.25 ale świeższą też możecie się podzielić :)
-
http://biniew.pl/1_29.zip
-
fragment mojego warunku to:
…..WHERE (nzf_Data = '2013-01-01') AND (nzf_Nota……….
Jak zamiast daty 2013-01-01 wstawić funkcję pobierającą pierwszy dzień aktualnego miesiąca ?
-
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
-
Dziękuje pięknie za ostatnią pomoc.
Proszę jeszcze o podpowiedz jak uzyskać funkcje określającą datę - 3 lata wstecz.
-
Dzień dobry,
Poprosiłbym jeszcze o listę dozwolonych zmiennych (tzn. czasem w Waszych zapytaniach można np. wybrać okres, którego dotyczy zestawienie), np. {DR: Z okresu::}
Pozdrawiam
:-Przemo.
zaczynamy [...ciach...]
-
Wszystko masz opisane w pomocy do programu: F1->Zestawienia własne SQL.
-
A wie ktoś może jak przywołać wartość detaliczną dokumentu (dokładnie faktury zakupowej)?
-
Chodzi ci o wartość towarów z tej FZ, wyrażoną w aktualnych cenach sprzedaży?
Nie ma takiej wartości w bazie. Musisz sobie wyliczyć.
Przy FZ (zwykłej) to nie takie trudne, ale przy FZ zbiorczej może być sporo zabawy.
Pamiętaj tylko, że ta wartość może się w każdej chwili zmienić, wystarczy zmienić cenę sprzedaży w kartotece towaru.
-
Witam
Mam takie zestawienie SQL ktore dziala ale nie do konca tzn. wystawietla mi liste sprzedanych towarow z okreslonego przeze mnie zakresu wskazuje ja prawidlowo ale w pozycji ilość i wartosc sa bledy i nie prawdziwe informacje "co zrobilem nie tak ?? "
druga sprawa to jak zrobic na tym etapie sumowanie tych samych pozycj jak to sie ma w wzorcu wydruku. Bardzo prosze o pomoc.....
wygenrowne zestawienie sql
Prosze KLIKNAC na obrazku prawym przyciskiem POKAZ OBRAZ bo sie moze nie miescic w okienku
(http://www.elektrofull.pl/allegro/subiekt_sql.jpg)
kod sql ponizej
SELECT
dok_NrPelny [Nr dokumentu],
dok_DataWyst [ Data wystawienia],
adr_Nazwa [Kontrahent],
[Nazwa towaru] = CASE
WHEN tw_Nazwa = ''
THEN '(Brak nazwy towaru)'
ELSE CASE
WHEN tw_Nazwa IS NULL
THEN ob_opis
ELSE tw_Nazwa
END
END,
tw_Symbol [Symbol towaru],
tw_Opis [Opis],
ob_Ilosc [Ilość],
ob_WartNetto[Wartość netto],
tw_pkwiu [PKWiU],
tw_IdKrajuPochodzenia [Kod kraju],
tw_KodTowaru [Kod CN]
FROM dok__Dokument
LEFT JOIN kh__Kontrahent ON dok__Dokument.dok_PlatnikId=kh__Kontrahent.kh_Id
LEFT JOIN adr__Ewid ON kh_Id=adr_IdObiektu AND adr_TypAdresu=1
LEFT JOIN dok_Pozycja ON dok__Dokument.dok_Id=dok_Pozycja.ob_DokHanId
LEFT JOIN tw__Towar ON dok_Pozycja.ob_TowId=tw__Towar.tw_Id
LEFT JOIN sl_GrupaTw ON tw__Towar.tw_IdGrupa = sl_GrupaTw.grt_Id
WHERE
dok_DataWyst BETWEEN {DR:Data dokumentu z okresu:}
AND
(dok__Dokument.dok_PlatnikId = 25499)
AND ob_Ilosc<=1
ORDER BY dok_DataWyst, dok_NrPelny
-
Wystawiasz faktury zbiorcze?
Jeśli tak to to w ogóle nie zadziała.
Ten SELECT wyświetli poprawnie w zasadzie tylko dane z faktur "zwykłych".
Na korektach, zbiorczych i zaliczkowych pokaże głupoty.
-
Dziekuje za zainteresowanie
Dokładnie wystawiam faktury zbiorcze :( i musze takie wystawiac z Wztek z calego tygodnia....
Jak to zrobic by dzialalo czyms zastapic ?
druga sprawa jak grupować ?
Prosze o wskazówki - moge oczywiscie sie odwdzieczyc jakos finansowo jesli inaczej sie juz nie da :)
-
Oj, musiałbym Ci napisać nowe zestawienie.
Trzeba uwzględnić że pozycja faktury zbiorczej zawiera różnicę w cenie i ilości w stosunku do WZ dla pozycji wynikające z wcześniej wystawionych WZ, a cenę i iość dla pozycji dopisanych. Bardzo to zakręcone i zestawienia wychodzą niebanalne.
-
Bardzo proszę jesli by bylo mozna jakos sie dogadac, bo nie chce oczywiscie nic za darmo, a nie zdobede na tyle szybko tej wiedzy. A bede niestety z tego korzystal co miesiac. Moglibysmy sie dogadac jakos ? :)
-
OK, ale to już na PW.
-
Witam ALL
A jakie zadać zapytanie, aby wyświetlić(wyłowić) tylko towary, które są na stanie??
-
select tt.tw_Nazwa from tw__Towar tt where exists (select 1 from tw_Stan st where st.st_Stan>0 and st.st_TowId=tt.tw_id)
-
Witam
Dziękuję....
A jak dodać do powyższego zapytania, żeby pobierał dane tylko z jednego wskazanego magazynu i sortował wynik alfabetycznie?
-
Sortowanie po nazwie działa.. ale jak z tym magazynem zrobić?
select tt.tw_Nazwa as "Nazwa Towaru", st.st_Stan as "Stan"
from tw__Towar tt
left join tw_Stan st on st.st_TowId=tt.tw_id
where st.st_Stan>0
Order by tt.tw_Nazwa asc
-
Trzeba dopisać joina do tabeli słownika magazynów i doczepić kontrolkę filtru na magazyny.
EDIT: Sam filtr na magazyny wystarczy jak nie potrzebujesz wyświetlać nazwy magazynu.
-
jak napisać polecenie SQL żeby mi wyfiltrowało z listy towarów/produktów: cechę towaru oraz kod CN produktu?
musi być: symbol kartotekowy, nazwa produktu, cecha, kod CN
-
a ktora cecha? bo grupa jest jedna i to proste a cech moze byc bardzo wiele
-
Witam
Szukam pomocy w przygotowaniu zestawienia, które będzie dla wybranego towaru pokazywało raport obrotów z następującymi kolumnami:
Lp., Data dokumentu, Nr dokumentu, Nazwa pełna Kontrahenta, Miasto Kontrahenta, Przychód (ilościowo), Rozchód (ilościowo)
Podobne zestawienie można wyciągnąć z Informatora towaru, ale niestety nie można wybrać wszystkich powyższych kolumn (np. nazwa kontrahenta tylko skrócona zamiast pełnej, nie można wybrać kolumny miasto), a ponadto potrzebuję, aby przy nazwie towaru na wydruku znalazła się informacja Symbol towaru u dostawcy oraz Uwagi z zakładki Opis w kartotece towaru (na wydruku pola te musiałyby się nazywać kolejno "Termin ważności" i "Seria"). Fajnie, gdyby na wydruku pojawiła się również informacja o wybranym okresie dla którego jest wygenerowane zestawienia.
Czy ktoś pomoże? :)
-
A zdradzisz jak sobie wyobrażasz tę pomoc?
Bo tak na podstawie pytania to nie bardzo wiem czego oczekujesz.
Że ktoś je napisze czy że ktoś podpowie, w których tabelach masz szukać?
-
W sensie, że ktoś napisze takie zestawienie odpłatnie :)
-
teraz to zes pomógł:-)
-
Witam, dla większości to pewnie proste, ale ja w SQL nie siedzę. Potrzebuje wygenerować zestawienie: nr id kontrahenta, symbol, pełna nazwa tego kontrahenta, nr konta wirtualnego, dowolny parametr własny kontrahenta. Może ktoś pomoże?
-
Wlasnie ucze sie SQLa, to moje pierwsze kroki.
Przygotowalem sobie zestawienie, ktore prezentuje mi jaka jest masa towarów znajdujących sie na ZK wystawionych w danym oknie czasowym pogrupowane wg Kontrahentow, Czyli wiersz 1: Kontrahent1 | X kg, wiersz 2: Kontrahent2 | Y kg, wiersz 3: Kontrahent3 | Z kg.
Tresc zapytania SQL na dole.
Chcialbym zrobic drugie zestawienie, ktore zaprezentuje to samo, ale z WZ, zamiast ZK, wiec w nowym zapytaniu zmienilem tylko dok_Typ=16 na dok_Typ=11. Zapytanie przechodzi test "Testuj zapytanie", ale w przeciwienstwie to identycznego zapytania na podstawie dok_Typ=16 daje puste zestawienie.
Gdzie robie blad?
PS Poleci ktos jakies sciagawki z opisem co faktycznie znajduje sie w danej kolumnie w glownych tabelach? Np. czym jest dok_Podtyp=0 czym 1 a czym 2??
SELECT
kh__Kontrahent.kh_Symbol AS Kontrahent
, SUM(tw__Towar.tw_Masa*dok_Pozycja.ob_Ilosc) AS Masa
FROM dok_Pozycja
INNER JOIN tw__Towar ON dok_Pozycja.ob_TowId = tw__Towar.tw_Id
INNER JOIN dok__Dokument ON dok_Pozycja.ob_DokHanId = dok__Dokument.dok_Id
INNER JOIN kh__Kontrahent ON kh__Kontrahent.kh_Id = dok__Dokument.dok_PlatnikId
WHERE (
(dok__Dokument.dok_DataWyst BETWEEN {D: Wprowadzone w okresie od:} AND {D: do})
AND (dok__Dokument.dok_Typ=16)
)
GROUP BY kh__Kontrahent.kh_Symbol
ORDER BY Kontrahent ASC
;
-
Chcialbym zrobic drugie zestawienie, ktore zaprezentuje to samo, ale z WZ, zamiast ZK, wiec w nowym zapytaniu zmienilem tylko dok_Typ=16 na dok_Typ=11. Zapytanie przechodzi test "Testuj zapytanie", ale w przeciwienstwie to identycznego zapytania na podstawie dok_Typ=16 daje puste zestawienie.
Gdzie robie blad?
Złączenie z dokumentami magazynowymi jest realizowane poprzez kolumnę "ob_DokMagId", a nie "ob_DokHanId".
PS Poleci ktos jakies sciagawki z opisem co faktycznie znajduje sie w danej kolumnie w glownych tabelach? Np. czym jest dok_Podtyp=0 czym 1 a czym 2??
Powtarzamy to do znudzenia na forum, nie rozumiem dlaczego nie skorzystałeś z tej zgromadzonej przez lata wiedzy ? Opis struktury bazy danych znajduje się w równie niedocenianej i mijanej pomocy do programu.
Polecam też współpracę z wybranym dostawcą programu/serwisantem, osoby w odróżnieniu od dokumentacji odpowiadają na zadane pytania.
ps.
Przypominam też, że podstawą do tworzenia rozwiązań dodatkowych jest znajomość działania programu, a w programie można określać ilość również w dodatkowych jednostkach miary, ale waga towaru jest zapisywana w jednostce podstawowej - wartości przeliczasz według jednostki wybranej na dokumencie, a nie podstawowej jednostki:
ob_Ilosc Ilosc towaru w wybranej jednostce na pozycji
ob_IloscMag Ilość towaru w jednostce podstawowej towaru
-
Podkresle jeszcze raz, tak jak w poprzednim poscie: to moje pierwsze kroki w SQLu. Litosci ;)
Popelnilem pewny zapytanie SQL, ktorego tresc jest zmanipulowanym przeze mnie wynikiem SQL Profilera dla zapytania, ktore baza dostaje kiedy uruchamiam zestawienie "Sprzedaz wedlug kontrahentow". Nie analizowalem CASE'ow i JOINow, tylko sklecilem cos takiego, zeby zamiast marzy otrzymac "narzut" czyli zysk/koszt. Usunalem tez niepotrzebne mi kolumny, dodalem troche Transact SQLa zeby moc wybierac zakres czasu i filtrowac po sl_GrupaKh.grk_Id.
Oto tresc zapytania:
SELECT
adr_Nazwa AS 'Nazwa'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END) AS 'Netto'
, SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END) AS 'Koszt'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) as 'Zysk'
, Narzut = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
GROUP BY adr_Nazwa
Daje mi to co chce podejrzec.
Popelnilem tez drugie - bardzo podobne - zapytanie. Roznice sa wytluszczone:
SELECT
adr_Nazwa AS 'Nazwa'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END) AS 'Netto'
, SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END) AS 'Koszt'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) as 'Zysk'
, Narzut2 = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
AND tw__Towar.tw_IdGrupa NOT IN (9, 28)
GROUP BY adr_Nazwa
Oba zapytania oddzielnie daja mi uzyteczne odpowiedzi. Mimo to, chcialbym niejako dodac kolumne "Narzut2" z drugiego zapytania - z uwzglednieniem tego dodatkowego argumentu w klauzuli WHERE - do mojego pierwszego zapytania tak, zeby w odpowiedzi na to pierwsze zapytanie w Subiekcie obok kolumny Narzut pojawila sie kolumna Narzut2 z wartosciami z drugiego zapytania.
Jak to polaczyc?
Subquery w klauzuli SELECT? Probowalem takiego:
SELECT
adr_Nazwa AS 'Nazwa'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END) AS 'Netto'
, SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END) AS 'Koszt'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) as 'Zysk'
, Narzut = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
, Narzut2 =
(
SELECT
Narzut2 = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
AND tw__Towar.tw_IdGrupa NOT IN (9, 28)
)
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
GROUP BY adr_Nazwa
Niestety w kazdym wierszu kolumny Narzut2 podaje mi te sama wartosc.
Subquery w innej klauzuli, np FROM?
-
Udało się przy pomocy kolegi spoza tego forum. W razie gdyby kogos to interesowalo, tresc zapytania ponizej:
SELECT
adr_Nazwa AS 'Nazwa'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END) AS 'Netto'
, SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END) AS 'Koszt'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) as 'Zysk'
, Narzut = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
, Narzut2 = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 OR tw__Towar.tw_IdGrupa IN (9, 28) THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 OR tw__Towar.tw_IdGrupa IN (9, 28) THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 OR tw__Towar.tw_IdGrupa IN (9, 28) THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) / SUM(CASE WHEN (ob_TowRodzaj&22)>0 OR tw__Towar.tw_IdGrupa IN (9, 28) THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
GROUP BY adr_Nazwa
-
dbo.fnZestSub_KosztSpr({D: od:}
Przy funkcjach sprawdzających koszt powinno być użyte {D: do} jeśli koszt ma być liczony zgodnie z fabrycznym zestawieniem.
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
Przedstawiciel jako grupa kontrahentów? Można i tak ale bardziej naturalnym wyborem byłby opiekun kontrahenta.