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 »

Z każdym krokiem bliżej celu.

Doszedłem do stanu gdy wynik wygląda mniej więcej tak:

Obrazek

A kod który za to odpowiada:

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,
  TrN_DokumentObcy,
   CONVERT( char(10),DATEADD(dd, TR_Data, '18001228' ), 104 ) AS 'Data sprzedaży',
  (STR(TR_WartoscNetto, 10, 2) + ' zł') AS 'Wartość netto',
  (STR(TR_KosztNetto, 10, 2) + ' zł') AS 'Koszt zakupu',
  (STR(TR_MarzaK, 10, 2) + ' zł') AS 'Marża kwota',
  CASE WHEN TR_MarzaP<>0 THEN (STR(ROUND(TR_MarzaP, 0), 10, 2) + ' %')
  ELSE (LEFT(TR_MarzaP, 0) + 'Brak kosztu')
END AS 'Marża procent'
FROM Transakcje JOIN CDN.TraNag ON
(TR_SpiTyp=TrN_GIDTyp) AND (TR_SpiNumer=TrN_GIDNumer)
ORDER BY
  Transakcje.TR_Data
Kyniu

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

Re: RKZ faktury

Post autor: Kyniu »

Skończyłem i kupa. Z poziomu MS SQL Server Management Studia działa a XL wywala błąd: "Wystąpiła sytuacja wyjątkowa. %SOURCE%=Microsoft OLE DB Provider for SQL Server. %DESCRIPTION%=Incorrect syntax near the keyword 'WITH'."

Kod: Zaznacz cały

@PAR ?@D17|DataOd|&Data Od:REG={DateClwFirstDay('m')} @? PAR@
@PAR ?@D17|DataDo|&Data Do:REG={DateClwLastDay('m')} @? PAR@
@PAR ?@R(SELECT Prc_GIDNumer, Prc_Akronim FROM CDN.PrcKarty)|Handlowiec|&Handlowiec:REG= @? PAR@

WITH Transakcje
   (TR_GIDNumer,
    TR_GIDTyp,
    TR_SpiNumer,
    TR_SpiTyp,
    TR_Dokument,
    TR_Data,
    TR_WartoscNetto,
    TR_KosztNetto,
    TR_MarzaK,
    TR_MarzaP) AS
(

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,
  SUM(CDN.TraElem.TrE_KosztKsiegowy) AS Koszt,
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS MarzaK,
	CASE
		WHEN SUM(CDN.TraElem.TrE_KosztKsiegowy)=0 THEN 0
		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)
WHERE
  CDN.TraNag.TrN_Stan<>6 AND
    (CDN.TraElem.TrE_GIDTyp=2033 AND CDN.TraNag.TrN_SPITyp=2033 AND CDN.TraNag.TrN_SpiNumer<>0) OR
  (CDN.TraElem.TrE_GIDTyp=2001 AND CDN.TraNag.TrN_SPITyp=2033 AND CDN.TraNag.TrN_SpiNumer<>0)
   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_Dokument,
  TrN_DokumentObcy,
   CONVERT( char(10),DATEADD(dd, TR_Data, '18001228' ), 104 ) AS 'Data sprzedaży',
  (STR(TR_WartoscNetto, 10, 2) + ' zł') AS 'Wartość netto',
  (STR(TR_KosztNetto, 10, 2) + ' zł') AS 'Koszt zakupu',
  (STR(TR_MarzaK, 10, 2) + ' zł') AS 'Marża kwota',
  CASE WHEN TR_MarzaP<>0 THEN (STR(ROUND(TR_MarzaP, 0), 10, 2) + ' %')
  ELSE (LEFT(TR_MarzaP, 0) + 'Brak kosztu')
END AS 'Marża procent'
FROM Transakcje 
JOIN CDN.TraNag ON (TR_SpiTyp=TrN_GIDTyp) AND (TR_SpiNumer=TrN_GIDNumer)
JOIN CDN.Atrybuty ON (TrN_GIDTyp=Atr_ObiTyp) AND (TrN_GIDNumer=Atr_ObiNumer)
JOIN CDN.PrcKarty ON (Atr_AtrTyp=Prc_GIDTyp) AND (Atr_AtrNumer=Prc_GIDNumer)
WHERE
  CDN.Atrybuty.Atr_ObiTyp=2033 AND
  CDN.Atrybuty.Atr_AtrTyp=944 AND
  CDN.Atrybuty.Atr_AtrNumer= ??Handlowiec AND 
  TR_Data BETWEEN ??DataOd AND ??DataDo
ORDER BY
  Transakcje.TR_Data
Z zapytania SQL wynik wygląda mnie więcej tak (oczywiście po podstawieniu danych w miejsce parametrów dynamicznych):

Kod: Zaznacz cały

TR_Dokument                              TrN_DokumentObcy                         Data sprzedaży Wartość netto Koszt zakupu  Marża kwota   Marża procent
---------------------------------------- ---------------------------------------- -------------- ------------- ------------- ------------- -------------
(...)
WZ-280/08/KI                             (S)FS-240/08/KI                          06.02.2008        1530.00 zł    1113.30 zł     416.70 zł      37.00 %
WZ-279/08/KI                             (S)FS-238/08/KI                          06.02.2008       14164.20 zł   13646.40 zł     517.80 zł       4.00 %
WZ-294/08/KI                             (S)FS-246/08/KI                          07.02.2008         526.40 zł     412.15 zł     114.25 zł      28.00 %
WZ-310/08/KI                             (S)FS-390/08/KI                          08.02.2008         393.75 zł     292.09 zł     101.66 zł      35.00 %
WZ-342/08/KI                             (S)FS-391/08/KI                          13.02.2008        1938.00 zł    1476.00 zł     462.00 zł      31.00 %
(...)
Ręce opadają.

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 »

Kyniu pisze:Skończyłem i kupa. Z poziomu MS SQL Server Management Studia działa a XL wywala błąd: "Wystąpiła sytuacja wyjątkowa. %SOURCE%=Microsoft OLE DB Provider for SQL Server. %DESCRIPTION%=Incorrect syntax near the keyword 'WITH'."

Kyniu
No mi ten twój kod już z poziomu MS SQL Server Management Studio błąd wywala ;-(

jaka masz baze SQL'a ?? 2000/2005 ??

PS.
Jak bym coś głupiego napisał to wybaczcie ale mam dzis prawie 39,5 st. Celsjusza :oops:
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: jaka masz baze SQL'a ?? 2000/2005 ??
MS SQL 2005. We wcześniejszych nie zadziała, bo jeśli dobrze rozumiem dokumentację to WITH wprowadzono od wersji 2005. Ale zrobiłem inaczej poprzez SELF JOIN. Na razie doszedłem do:

Kod: Zaznacz cały

SELECT 
  Tra2.TrN_DokumentObcy AS DokPotomny,
  CONVERT( char(10),DATEADD(dd, Tra2.TrN_Data2, '18001228' ), 104 ) AS 'Data',
-- Wyświetlamy datę w strawny sposób
  (STR(SUM(TrE_KsiegowaNetto), 10, 2) + ' zł') AS 'Wartość netto',
-- Obliczamy wartość netto sprzedaży z elementów transakcji
  (STR(SUM(TrE_KosztKsiegowy), 10, 2) + ' zł') AS 'Koszt zakupu',
-- Obliczamy koszt zakupu towarów na tej transakcji z elementów transakcji
  (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS MarzaK,
-- Obliczamy kwotę marży jako różnicę wartości naetto i kosztu zakupu
  CASE WHEN SUM(CDN.TraElem.TrE_KosztKsiegowy)=0 THEN 0
-- Zabezpieczamy się przed dzieleniem przez 0 gdy koszt nieustalony
  ELSE STR(
        ROUND(
        ((SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy))/SUM(CDN.TraElem.TrE_KosztKsiegowy))*100,0))       
  END AS MarzaP
-- Obliczamy procent marży 
FROM
  CDN.TraNag Tra1 
  INNER JOIN CDN.TraNag Tra2 ON 
  (Tra1.TrN_SpiTyp = Tra2.TrN_GIDTyp) AND (Tra1.TrN_SpiNumer = Tra2.TrN_GIDNumer)
  LEFT OUTER JOIN CDN.TraElem ON
  Tra1.TrN_GIDNumer=TrE_GIDNumer AND Tra1.TrN_GIDTyp=TrE_GIDTyp
WHERE
  Tra1.TrN_GIDTyp IN (2001,2033) AND 
-- Wybieramy faktury sprzedaży FS i dokumenty WZ
  Tra1.TrN_SpiTyp <> 0 AND Tra1.TrN_SpiNumer <> 0 AND 
-- Ale wykluczamy spinacze
  Tra1.TrN_Stan <> 6 AND 
-- Wykluczamy anlulowane FS i WZ
  Tra2.TrN_GIDTyp = 2033 AND 
  Tra2.TrN_Stan <> 6
-- Wykluczamy anulowane (S)FS
GROUP BY
  Tra2.TrN_GIDNumer,
  Tra2.TrN_DokumentObcy,
  Tra2.TrN_Data2,
  Tra1.TrN_SpiNumer 
Wszelkie uwagi mile widziane. A tak przy okazji, czy ktoś wie jak zmienić powyższe na coś takiego - mam nadzieje że ktoś zrozumie o co mi chodzi (no bo po co liczyć po kilka razy to samo, a i taki zapis byłby znacznie czytelniejszy).

Kod: Zaznacz cały

  @wartosc=(STR(SUM(TrE_KsiegowaNetto), 10, 2) + ' zł') AS 'Wartość netto',
  @koszt=(STR(SUM(TrE_KosztKsiegowy), 10, 2) + ' zł') AS 'Koszt zakupu',
  @marza_k=(wartosc - koszt) AS MarzaK,
  CASE WHEN koszt=0 THEN 0
  ELSE STR(ROUND((marza_k/koszt)*100,0))       
  END AS MarzaP
No i oczywiście zachęcam do testów i przekazywania uwag czy wskazywania na błędy.

Kyniu

P.S. A koledze życzę szybkiego powrotu do zdrowia.

ODPOWIEDZ