RKZ faktury

Problemy i pomysły związane z funkcjonowaniem modułu Sprzedaż

Moderator: mikey

Kyniu
Posty: 417
Rejestracja: 21 mar 2008, 10:10
Rola: Administrator CDN XL
Lokalizacja: Świętokrzyskie, Kielce

Re: RKZ faktury

Post autor: Kyniu »

Jest coraz lepiej - może się komuś przyda na tym etapie więc wklejam:

Kod: Zaznacz cały

SELECT 
  CDN.TraElem.TrE_GIDNumer,
  SUM(CDN.TraElem.TrE_KsiegowaNetto) AS FIELD_1,
  SUM(CDN.TraElem.TrE_KosztKsiegowy) AS FIELD_2,
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS [Marża],
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3
FROM
  CDN.TraElem
  INNER JOIN CDN.TraNag ON (CDN.TraElem.TrE_GIDTyp = CDN.TraNag.TrN_GIDTyp)
  AND (CDN.TraElem.TrE_GIDNumer = CDN.TraNag.TrN_GIDNumer)
WHERE
  CDN.TraElem.TrE_GIDTyp IN (2033,2001)
GROUP BY
  CDN.TraElem.TrE_GIDNumer,
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3
ORDER BY
  CDN.TraNag.TrN_Data3
Mamy już selekcję FS i WZ, mamy kwotę netto dokumentu i jego koszty (nie zawsze ale mam podejrzenie że to dotyczy faktur usługowych które nie mają kosztu), marżę kwotowo, numer dokumentu i jego datę.

Problem w tym że atrybut - bo do niego zmierzamy (od tego zaczęła się dyskusja) jest przypięty do (S)FS. No i teraz to wszystko trzeba jakoś pogodzić.

Kyniu

Awatar użytkownika
wojtini
Posty: 150
Rejestracja: 24 sty 2008, 22:41
Rola: Administrator CDN XL
Wersja: 2016
Lokalizacja: Grodków, opolskie

Re: RKZ faktury

Post autor: wojtini »

Zapodam Wam taki uniwersalny SELECT z którego często korzystam ;-)

Kod: Zaznacz cały

SELECT 
CDN.NumerDokumentuTRN(TraNagMain.TrN_GIDTyp, TraNagMain.TrN_SpiTyp, TraNagMain.TrN_TrNTyp, TraNagMain.TrN_TrNNumer, TraNagMain.TrN_TrNRok, TraNagMain.TrN_TrNSeria) AS Trn_NumerPelny,
TrE_GIDTyp,
TrE_GIDNumer,

TraNagElem.TrN_GIDTyp	as TrN_GIDTypElem,
TraNagMain.TrN_GIDTyp	as TrN_GIDTypMain,
TraNagElem.TrN_GIDNumer as TrN_GIDNumerElem,
TraNagMain.TrN_GIDNumer as TrN_GIDNumerMain,
TraNagElem.TrN_TrNNumer as TrNNumerElem,
TraNagMain.TrN_TrNNumer as TrNNumerMain,
TraNagElem.TrN_SpiTyp   as SpiTypElem,
TraNagMain.TrN_SpiTyp   as SpiTypMain,
TraNagElem.TrN_SpiNumer as SpiNumerElem,
TraNagMain.TrN_SpiNumer as SpiNumerMain,

TrE_TwrNazwa,
* 
from CDN.TraSElem

INNER JOIN CDN.TraElem ON TrE_GIDTyp=TrS_GIDTyp AND TrE_GIDNumer=TrS_GIDNumer AND TrE_GIDLp=TrS_GIDLp
INNER JOIN CDN.TraNag as TraNagElem ON TraNagElem.TrN_GIDTyp=TrE_GIDTyp AND TraNagElem.TrN_GIDNumer=TrE_GIDNumer
FULL OUTER JOIN CDN.TraNag as TraNagMain ON TraNagMain.TrN_GIDTyp=TraNagElem.TrN_SPITyp AND TraNagMain.TrN_GIDNumer=TraNagElem.TrN_SPINumer
INNER JOIN CDN.KntKarty ON Knt_GIDNumer=TraNagElem.TrN_KntNumer
FULL OUTER JOIN CDN.TraPlat ON TraNagElem.TrN_GIDTyp=TRP_GIDTyp AND TraNagElem.TrN_GIDNumer=TRP_GIDNumer

where

PoZdrawiam

Wojciech FRED Błauciak
Administrator AgroAs.pl
GG# 2913
GSM: 608 037 025
administrator@agroas.pl

Kyniu
Posty: 417
Rejestracja: 21 mar 2008, 10:10
Rola: Administrator CDN XL
Lokalizacja: Świętokrzyskie, Kielce

Re: RKZ faktury

Post autor: Kyniu »

Kontynuując swój wywód dotyczący dokumentów spiętych. Dla dokumentów spiętych tabela TraNag przepisuje sie niejako sama na siebie korzystając z pól TrN_SpiTyp = TrN_GIDTyp i TrNSpiNumer = TrN_GIDNumer. Oczywiście może zachodzić sytuacja gdy spinacz spina kilka dokumentów, w wypadku o którym mowa czyli faktura sprzedaży (S)FS może obejmować kilka dokumentów WZ.

Przykład - załóżmy że mamy dokument (S)FS z GIDNumerem 4921:

Kod: Zaznacz cały

select TrN_GIDTyp, TrN_GIDNumer, TrN_SpiTyp, TrN_SpiNumer  from CDN.TraNag where TrN_SPINumer=4921

TrN_GIDTyp, TrN_GIDNumer, TrN_SpiTyp, TrN_SpiNumer 
2001	         4919	              2033	      4921
2001	         4922	              2033	      4921
Jak widać mamy dwa dokumenty WZ (co poznajemy po GIDTyp 2001 bo mogłyby być jeszcze np. korekty WZ) z GIDNumerami odpowiednio 4919 oraz 4922 (co poniekąd jest dziwne że dokument (S)FS ma GID niższy niż jedna z jego WZ'tek ale odłóżmy to na bok).

Jak zatem widać z każdym krokiem brniemy coraz głębiej - coś mi się widzi że nigdy tego zapytania nie napiszę albo trzeba się będzie posiłkować jakimś przepisywaniem wyników częściowych do tabel pośrednich.

Kyniu

marceynowa
Posty: 341
Rejestracja: 29 lut 2008, 11:27
Rola: Administrator CDN XL
Wersja: 2022
Lokalizacja: Gdynia

Re: RKZ faktury

Post autor: marceynowa »

Temat jest ciekawy, ale pracować trzeba...
Jesli do weekendu sprawa się nie rozwiąże to spróbuję się tym zająć.
Ale myślę, żę są lepsi ode mnie i w przerwie na kawę wygenerują odpowiednie zapytanie SQL.

pozdrawiam

P.S. Właśnie walczę z zakazami na karcie operatora - zupełny brak pomocy i dokumentacji.

Kyniu
Posty: 417
Rejestracja: 21 mar 2008, 10:10
Rola: Administrator CDN XL
Lokalizacja: Świętokrzyskie, Kielce

Re: RKZ faktury

Post autor: Kyniu »

marceynowa pisze:Temat jest ciekawy, ale pracować trzeba...
Jesli do weekendu sprawa się nie rozwiąże to spróbuję się tym zająć.
Ale myślę, żę są lepsi ode mnie i w przerwie na kawę wygenerują odpowiednie zapytanie SQL.
Jest i dlatego walczę. Teraz wymyśliłem że można by skorzystać z UNION i zrobić dwa SELECT'y. Dla dokumentów FS jeden i dla dokumentów WZ podpiętych pod (S)FS drugi. Bo w jednym zapytaniu się chyba tego nie da zrobić. Ech, a powinienem się uczyć do egzaminu CVOICE. I wiosna już za oknem.
marceynowa pisze:P.S. Właśnie walczę z zakazami na karcie operatora - zupełny brak pomocy i dokumentacji.
Załóż wątek i na bieżąco dziel się wiadomościami z placu boju.

Kyniu

Kyniu
Posty: 417
Rejestracja: 21 mar 2008, 10:10
Rola: Administrator CDN XL
Lokalizacja: Świętokrzyskie, Kielce

Re: RKZ faktury

Post autor: Kyniu »

Pomyślałem i zrobiłem na razie tyle czyli rozdzielenie zapytania dla FS i dla WZ:

Kod: Zaznacz cały

SELECT 
  CDN.TraElem.TrE_GIDNumer,
  SUM(CDN.TraElem.TrE_KsiegowaNetto) AS FIELD_1,
  SUM(CDN.TraElem.TrE_KosztKsiegowy) AS FIELD_2,
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS [Marża],
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3

FROM
  CDN.TraElem
  INNER JOIN CDN.TraNag ON (CDN.TraElem.TrE_GIDTyp = CDN.TraNag.TrN_GIDTyp)
  AND (CDN.TraElem.TrE_GIDNumer = CDN.TraNag.TrN_GIDNumer)
WHERE
  CDN.TraElem.TrE_GIDTyp IN (2001)
GROUP BY
  CDN.TraElem.TrE_GIDNumer,
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3

UNION

SELECT 
  CDN.TraElem.TrE_GIDNumer,
  SUM(CDN.TraElem.TrE_KsiegowaNetto) AS FIELD_1,
  SUM(CDN.TraElem.TrE_KosztKsiegowy) AS FIELD_2,
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS [Marża],
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3
FROM
  CDN.TraElem
  INNER JOIN CDN.TraNag ON (CDN.TraElem.TrE_GIDTyp = CDN.TraNag.TrN_GIDTyp)
  AND (CDN.TraElem.TrE_GIDNumer = CDN.TraNag.TrN_GIDNumer)
WHERE
  CDN.TraElem.TrE_GIDTyp IN (2033)
GROUP BY
  CDN.TraElem.TrE_GIDNumer,
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3

ORDER BY
  CDN.TraNag.TrN_Data3,
  CDN.TraElem.TrE_GIDNumer
Robi się zawile. No i coraz łatwiej się rypnąć sprawiając że te łączone tabele się rozjadą.

UPDATE:

Można przyjąć że nie interesują nas WZ nie spięte do (S)FS. Wynika to z tego będziemy szukać spinacza do tych WZ bo atrybut będzie nadany spinaczowi a nie WZ. Zatem tak na szybko można poprawić jeden z SELECT'ów i rozszerzyć w nim warunek:

Kod: Zaznacz cały

WHERE CDN.TraElem.TrE_GIDTyp IN (2001) AND CDN.TraNag.TrN_SPITyp=2033

Teraz mamy pewność że wybierzemy tylko te WZ które są spiete do faktury (S)FS. Problem jest teraz innej natury jak - w oparciu o to zapytanie:

Kod: Zaznacz cały

SELECT 
  CDN.TraElem.TrE_GIDNumer,
  SUM(CDN.TraElem.TrE_KsiegowaNetto) AS FIELD_1,
  SUM(CDN.TraElem.TrE_KosztKsiegowy) AS FIELD_2,
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS [Marża],
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3
FROM
  CDN.TraElem
  INNER JOIN CDN.TraNag ON (CDN.TraElem.TrE_GIDTyp = CDN.TraNag.TrN_GIDTyp)
  AND (CDN.TraElem.TrE_GIDNumer = CDN.TraNag.TrN_GIDNumer)
WHERE
  CDN.TraElem.TrE_GIDTyp IN (2001) AND 
  CDN.TraNag.TrN_SPITyp = 2033
GROUP BY
  CDN.TraElem.TrE_GIDNumer,
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3
ORDER BY
  CDN.TraNag.TrN_Data3,
  CDN.TraElem.TrE_GIDNumer
Dotrzeć poziom wyżej czyli do spinaczy. Mam już WZ co do których wiem że mają spinacz, pogrupowałem je po GIDNumerach, zsumowałem kolumny KwotaNetto i KosztKsiegowy, policzyłem marżę ale teraz dla tych GIDNumerów po których grupowałem chciałbym poznać GIDNumer rodzica wskazując kurde balans na tą samą tabelę. Jak złącze TraNag z samą sobą po kolumnach TrNGIDNumer oraz TrN_SpiNumer to kupa - pusto. Zresztą wcale mnie to nie dziwi. Znowu utknąłem.

Kyniu

Kyniu
Posty: 417
Rejestracja: 21 mar 2008, 10:10
Rola: Administrator CDN XL
Lokalizacja: Świętokrzyskie, Kielce

Re: RKZ faktury

Post autor: Kyniu »

Jeszcze jeden mały krok przed końcem pracy na dziś (16:00 kierunek dom). Tabelę spinaczy możemy zbudować tak:

Kod: Zaznacz cały

SELECT 
  CDN.TraNag.TrN_GIDNumer
FROM
  CDN.TraNag
WHERE
  TrN_SpiTyp = 0 AND 
  TrN_GIDTyp = 2033
Po co? Otóż CDN.TraNag.TrN_GIDNumer w tej tabeli którą roboczo będę nazywał tablicą spinaczy pokrywają się z CDN.TraNag.TrN_SpiNumer tabeli otrzymanej takim zapytaniem:

Kod: Zaznacz cały

SELECT 
  CDN.TraElem.TrE_GIDNumer,
  SUM(CDN.TraElem.TrE_KsiegowaNetto) AS FIELD_1,
  SUM(CDN.TraElem.TrE_KosztKsiegowy) AS FIELD_2,
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS [Marża],
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3,
  CDN.TraNag.TrN_SpiNumer
FROM
  CDN.TraElem
  INNER JOIN CDN.TraNag ON (CDN.TraElem.TrE_GIDTyp = CDN.TraNag.TrN_GIDTyp)
  AND (CDN.TraElem.TrE_GIDNumer = CDN.TraNag.TrN_GIDNumer)
WHERE
  CDN.TraElem.TrE_GIDTyp IN (2001) AND 
  CDN.TraNag.TrN_SPITyp = 2033
GROUP BY
  CDN.TraElem.TrE_GIDNumer,
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3,
  CDN.TraNag.TrN_SpiNumer
ORDER BY
  CDN.TraNag.TrN_SpiNumer,
  CDN.TraNag.TrN_Data3,
  CDN.TraElem.TrE_GIDNumer
Gdyby teraz sensownie złączyć wyniki tych tabel biorąc za łącznik CDN.TraNag.TrN_GIDNumer z tabeli spinaczy i CDN.TraNag.TrN_SpiNumer z tabeli wyliczonej z elementów transakcji to byłbym w domu. Ale jak zrobić dwa zapytania, dostać dwie tabele i spiąć je po określonej kolumnie? Coś mi chodzi po głowie że UNION powinien ugryźć ten temat.

No i gdzieś jeszcze jest małe "ale" bo mi się nie pokrywa liczba wierszy otrzymywanych w wyniku tych zapytań - tabela spinaczy liczy 827 wierszy gdy tymczasem z tabeli elementów wychodzi mi 978 elementów. Hmmm, co skopałem, co skopałem, .....

Kyniu
Ostatnio zmieniony 01 kwie 2008, 21:01 przez Kyniu, łącznie zmieniany 1 raz.

Awatar użytkownika
wojtini
Posty: 150
Rejestracja: 24 sty 2008, 22:41
Rola: Administrator CDN XL
Wersja: 2016
Lokalizacja: Grodków, opolskie

Re: RKZ faktury

Post autor: wojtini »

OKI juz nie moge ;-)
KYNIO jesteś jak TAJFUN ;-)
Zaspamowałeś nam całe forum (hie hie)

Jak wróce do domu to na twoim przykładzie zrobie tutorialka
jak to zrobić po kolei ale w postaci raportu CrystalReports ;-0

Dostałeś dużą dawkę wiedzy ale widzę, że idziesz dalej swoją drogą.

Napisze jeszcze do Ciebie maila albo na GG aby upewnić się w 100% jak chcesz aby ten raport wyglądał.

PS.
Jak ktoś chętny to niech zrobi tutorialka w formie wykresu :mrgreen:
PoZdrawiam

Wojciech FRED Błauciak
Administrator AgroAs.pl
GG# 2913
GSM: 608 037 025
administrator@agroas.pl

Kyniu
Posty: 417
Rejestracja: 21 mar 2008, 10:10
Rola: Administrator CDN XL
Lokalizacja: Świętokrzyskie, Kielce

Re: RKZ faktury

Post autor: Kyniu »

wojtini pisze:OKI juz nie moge ;-)
No cóż, mężczyzne poznaje się po tym jak (i kiedy) kończy). Dawaj, dawaj, nie ma lekko.
wojtini pisze:Zaspamowałeś nam całe forum (hie hie)
Motywuje was do ożywienia forum.
wojtini pisze: Jak wróce do domu to na twoim przykładzie zrobie tutorialka
jak to zrobić po kolei ale w postaci raportu CrystalReports ;-0
Już sobie ostrze pazurki.
wojtini pisze:Dostałeś dużą dawkę wiedzy ale widzę, że idziesz dalej swoją drogą.
Idę drogą którą rozumie. Co z tego że nawet ktos mi podeśle gotowca jak nie będę rozumiał co on robi i może się okazać że robi nie to co chciałem.
wojtini pisze:Napisze jeszcze do Ciebie maila albo na GG aby upewnić się w 100% jak chcesz aby ten raport wyglądał.
No to jeszcze raz. Raport ma zapytać użyszkodnia o dwie sprawy: zakres dat (data od, data do, raport ma brać pod uwagę TrN_Data3) oraz atrybut na dokumencie. Atrybutem na dokumencie w obecnej formie raportu jest pracownik wybierany z listy pracowników (tabela PrcKarty). Aby uniknąć pomyłki powinien być wybierany z listy a nie klepany z reki (ten krok zresztą mamy rozwiązany). Utrudnienie polega na tym że raport musi brać pod uwagę dokumenty FS oraz (S)FS (czyli w tym wypadku zaglądać do WZ'etek). Zawartość raportu to: nazwa kontrahenta (TrN_Nazwa1 + TrN_Nazwa2), symbol dokumentu (TrN_DokumentObcy lub składanie na piechotę jak ktoś woli ale jak wiadomo dla transakcji własnych jest tu zapisywany pełny numer dokumentu), wartość netto dokumentu, koszt na dokumencie (wynikający z SUM(TrE_KosztKsiegowy)), marża kwotowo (różnica między wartością dokumentu a kosztem), marża procentowo (najprościej chyba będzie liczyć ile jest marży kwotowej w wartości netto).
wojtini pisze:Jak ktoś chętny to niech zrobi tutorialka w formie wykresu :mrgreen:
No właśnie powstaje w bólach jak widać powyżej.

Kyniu

Kyniu
Posty: 417
Rejestracja: 21 mar 2008, 10:10
Rola: Administrator CDN XL
Lokalizacja: Świętokrzyskie, Kielce

Re: RKZ faktury

Post autor: Kyniu »

Kyniu pisze:Gdyby teraz sensownie złączyć wyniki tych tabel biorąc za łącznik CDN.TraNag.TrN_GIDNumer z tabeli spinaczy i CDN.TraNag.TrN_SpiNumer z tabeli wyliczonej z elementów transakcji to byłbym w domu. Ale jak zrobić dwa zapytania, dostać dwie tabele i spiąć je po określonej kolumnie?
Eureka, już wiem, już wiem. Buduję własną tabelę TRANSAKCJE która zawiera to co chciałem - wartość sprzedaży, koszty, marże kwotową i procentową, etc. i mogę ją łączyć z innymi tabelami :-)

Kod: Zaznacz cały

WITH Transakcje 
	(TR_GIDNumer,
         TR_GIDTyp,
	 TR_SpiNumer,
	 TR_SpiTyp,
	 TR_Dokument,
	 TR_Data,
	 TR_WartoscNetto,
	 TR_KosztNetto,
	 TR_MarzaK,
	 TR_MarzaP) AS
(
/* Wybieramy kolumny z TraElem i TraNag jak niżej */
SELECT 
  CDN.TraElem.TrE_GIDNumer,
  CDN.TraElem.TrE_GIDTyp,
  CDN.TraNag.TrN_SpiNumer,
  CDN.TraNag.TrN_SpiTyp,
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3,
  SUM(CDN.TraElem.TrE_KsiegowaNetto) AS Wartosc,
  /* Sumujemy cenę netto elementów jako wartość netto transakcji */
  SUM(CDN.TraElem.TrE_KosztKsiegowy) AS Koszt,
  /* Sumujemy koszt elementów jako koszt transakcji */
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS MarzaK,
CASE
WHEN SUM(CDN.TraElem.TrE_KosztKsiegowy)=0 THEN 0
/* Zabezpieczamy się przed dzieleniem przez 0 gdy koszt nieustalony */
ELSE (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy))
     / (SUM(CDN.TraElem.TrE_KosztKsiegowy))*100  
END AS MarzaP
FROM
  CDN.TraElem
  INNER JOIN CDN.TraNag ON 
  (CDN.TraElem.TrE_GIDTyp = CDN.TraNag.TrN_GIDTyp) AND 
  (CDN.TraElem.TrE_GIDNumer = CDN.TraNag.TrN_GIDNumer)
  /* Warunek łaczenie TraNag i TraElem po GIDTyp i GIDNumer */
WHERE
  CDN.TraNag.TrN_Stan<>6 AND
  /* Wykluczamy dokumenty anulowane */
  (CDN.TraElem.TrE_GIDTyp=2033 AND CDN.TraNag.TrN_SPITyp=2033 AND CDN.TraNag.TrN_SpiNumer<>0) OR
  /* Bierzemy pod uwagę dokumenty FS */
  (CDN.TraElem.TrE_GIDTyp=2001 AND CDN.TraNag.TrN_SPITyp=2033 AND CDN.TraNag.TrN_SpiNumer<>0)
  /* Bierzemy pod uwagę dokumenty WZ posiadające spinacz (S)FS */
  GROUP BY
  CDN.TraElem.TrE_GIDNumer,
  CDN.TraElem.TrE_GIDTyp,
  CDN.TraNag.TrN_SpiNumer,
  CDN.TraNag.TrN_SpiTyp,
  CDN.TraNag.TrN_DokumentObcy,
  CDN.TraNag.TrN_Data3
)
SELECT 
     TR_GIDNumer,
     TR_GIDTyp,
	 TR_SpiNumer,
	 TR_SpiTyp,
	 TR_Dokument,
	 TR_Data,
	 TR_WartoscNetto,
	 TR_KosztNetto,
	 TR_MarzaK,
	 TR_MarzaP
FROM 
     Transakcje
ORDER BY
     Transakcje.TR_Data
Hip Hip. Teraz już tylko JOIN jak w przykładach z SQL Server 2005 Books Online i powinienem dotrzeć do celu.

Kyniu

ODPOWIEDZ