Skocz do zawartości

Remanent na dzień i wartość magazynowa

Polecane posty

W jaki sposób, wyliczacie wartość magazynową w wierszach raportu Remanent na dzień, bo mimo wielu prób, w przypadku indeksów z dłuższą historią, nie jestem w stanie uzyskać jednakowego względem oryginalnego raportu wyniku. W dodatku, licząc na piechotę, mój raport wypada zgodnie, a wasz błędnie, np.:

obraz.png.519030469e587a7dfbbeafbc98ff9983.png

Mamy na stanie dwie partie, 40 i 50 sztuk co nam daje w komplecie 90szt.

W raporcie, mamy wartość magazynową: 21,84 + 27,50 = 49,34

W ruchu asortymentu mamy: 2,20 - 2,20 + 54,70 - 5,47 + 38,50 - 27,31 - 11,00 = 49,42

Po próbach uzyskania wyników bezpośrednio z bady danych, doszedłem do wniosku, że zapewne musicie używać danych bezpośrednio z dokumentów, ale mimo mocnego skomplikowania zapytania, nie udało mi się nadal uzyskać oczekiwanych wyników:

DECLARE @okresPoczatek date = '2020-07-15';

SELECT 
prz.Ilosc [Przychod]
,ROUND(posPZ.KosztMagazynowy*ISNULL(wlkPZ.Kurs,1)/posPZ.Ilosc,2) [CenaPrzychoduPZ]
,ROUND(posPZ.KosztMagazynowy*ISNULL(wlkPZ.Kurs,1),2) [WartoscPrzychoduPZ]
,ROUND(posFZ.KosztMagazynowy*ISNULL(wlkFZ.Kurs,1)/posFZ.Ilosc,2) [CenaPrzychoduFZ]
,posPZ.KosztMagazynowy*ISNULL(wlkFZ.Kurs,1) [WartoscPrzychoduFZ]
,rch.Ilosc [Rozchod]
,ROUND(posWZ.KosztMagazynowy*ISNULL(wlkWZ.Kurs,1)/posWZ.Ilosc,2) [CenaRozchoduWZ]
,ROUND(posWZ.KosztMagazynowy*ISNULL(wlkWZ.Kurs,1),2) [WartoscRozchoduWZ]
,ROUND(posFS.KosztMagazynowy*ISNULL(wlkFS.Kurs,1)/posFS.Ilosc,2) [CenaRozchoduFS]
,posFS.KosztMagazynowy*ISNULL(wlkFS.Kurs,1) [WartoscRozchoduFS]

FROM ModelDanychContainer.Przychody AS prz
INNER JOIN ModelDanychContainer.Partie AS prt ON prt.Id=prz.Partia_Id
INNER JOIN ModelDanychContainer.PozycjeDokumentu AS posPZ ON posPZ.Przyjecie_Id=prt.Przyjecie_Id
INNER JOIN ModelDanychContainer.Dokumenty AS pz ON pz.Id=posPZ.Dokument_Id
LEFT JOIN ModelDanychContainer.RealizacjePozycji AS rpFZ ON posPZ.Id=rpFZ.PozycjaRealizowanaId AND rpFZ.TypDokumentuRealizujacego=1024
LEFT JOIN ModelDanychContainer.PozycjeDokumentu AS posFZ ON posFZ.Id=rpFZ.PozycjaRealizujacaId
LEFT JOIN ModelDanychContainer.Dokumenty AS fz ON fz.Id=posFZ.Dokument_Id

LEFT JOIN ModelDanychContainer.Rozchody AS rch ON rch.Partia_Id=prz.Partia_Id
LEFT JOIN ModelDanychContainer.PozycjeDokumentu AS posWZ ON posWZ.Wydanie_Id=rch.Wydanie_Id
LEFT JOIN ModelDanychContainer.Dokumenty AS wz ON wz.Id=posWZ.Dokument_Id
LEFT JOIN ModelDanychContainer.RealizacjePozycji AS rpFS ON posWZ.Id=rpFS.PozycjaRealizowanaId AND rpFS.TypDokumentuRealizujacego=64
LEFT JOIN ModelDanychContainer.PozycjeDokumentu AS posFS ON posFS.Id=rpFS.PozycjaRealizujacaId
LEFT JOIN ModelDanychContainer.Dokumenty AS fs ON fs.Id=posFS.Dokument_Id

LEFT JOIN ModelDanychContainer.KursyWalutyDokumentu AS wlkPZ ON wlkPZ.Id=pz.Dokument_KursWalutyDokumentu_Id 
LEFT JOIN ModelDanychContainer.KursyWalutyDokumentu AS wlkFZ ON wlkFZ.Id=fz.Dokument_KursWalutyDokumentu_Id 
LEFT JOIN ModelDanychContainer.KursyWalutyDokumentu AS wlkWZ ON wlkWZ.Id=wz.Dokument_KursWalutyDokumentu_Id 
LEFT JOIN ModelDanychContainer.KursyWalutyDokumentu AS wlkFS ON wlkFS.Id=fs.Dokument_KursWalutyDokumentu_Id 
WHERE prz.Asortyment_Id = 101226 AND prz.Data<@okresPoczatek

obraz.thumb.png.6e2521fe2730799ecb2236988640f99a.png

Sumując wyniki, uzyskałem wynik 49,33, co jest już prawie wynikiem z listy, ale nie ma tutaj aż takich zaokrągleń, aby miało mi to uciec mocniej. W dodatku celowo wychodziłem od KosztMagazynowy a nie od JednostkowyKosztMagazynowy, bo tam przez zaokrąglenie wszystko uciekało.

Podpowiecie jak to liczyć? ;)

obraz.png

Link to postu

Im dalej w las ... to wiadomo ;) Generalnie chyba wydedukowałem, że używacie wszędzie ceny z dokumentu przyjęcia/zakupu, odpowiednio niezaokrąglonej, co zaczęło mi dawać odpowiednie efekty, ale teraz muszę rozgryźć na jakiej zasadzie obliczacie ilości na bieżący dzień ...

Szkoda, że nie można Sobie powielić raportu jak w starym dobrym GT :(

Link to postu

Jako baza do wyliczania kosztu magazynowego używana jest tabela koszty zakupu, która przechowuje koszty przyjęć (oraz ich korekty wynikające z fakturowania PZ lub korekt wartościowych) w postaci Wartość + Ilość + Kurs. Każde przyjęcie ma swój koszt pierwotny, którego Id jest przechowywany w tabeli Przyjecia, potem korekty kosztów tworzą kolejne wpisy w tabeli kosztów zakupu, które niejako "zastępują" rekord kosztu pierwotnego więc do wyliczeń należy zawsze wziąć ostatnią korektę kosztu (w kolejności wg LP z tabeli KosztyZakupu). Dodatkowo należy uwzględnić koszty dodatkowe wynikające z KKD z tabeli KosztyDodatkowe (w tej tabeli jest identyfikator powiązanego przyjęcia). Sumę ostatecznego kosztu z kosztów zakupu oraz kosztów dodatkowych dzielimy przez ilość co daje nam cenę magazynową, a następnie ta cena magazynowa w połączeniu z ilością pozostałą na dzień daje nam aktualną wartość magazynową.

Co do samego wyliczania ilości pozostałej to należy oprzeć się na najbardziej "atomowych" elementach ruchu magazynowego czyli przychodach i rozchodach. Suma przychodów minus suma rozchodów w połączeniu z filtrowaniem po dacie określi ilość pozostałą na magazynie.

Jeśli chodzi o powielanie raportów to tak jak kiedyś już pisaliśmy na forum, są one napisane w LINQu i nie mamy planów udostępniania kodu tych zestawień. Można jednak podejrzeć w SQL profilerze zapytanie, które idzie do serwera już po przetłumaczeniu na T-SQL.

  • Dziękuję 1
Link to postu

Wielkie dzięki za nakierowanie. Zmodyfikowałem i dostosowałem się do metody pobierania kosztów, wskazanej przez Pana :D Niestety, jak na złość nie mam żadnej bazy, w której mógłbym podpiąć KosztyDodatkowe więc podpiąłem je na Słowo Honoru :)Co prawda wartości pokryły się z moimi wcześniejszymi wyliczeniami, ale to pewnie szczęście, że nie trafiłem w jakieś korekty i w efekcie mam teraz wartość zgodną z waszym raportem. Po za tym, bardzo ładne i czyste zapytanie wyszło, więc jest zdecydowanie lepiej :)

Ilości to mój błąd, bo zapomniałem całkiem o uwzględnieniu rezerwacji w rozchodach. Czasem trzeba się przespać z problemem ;)

Jak coś, dla potomnych baza, może się przyda ;)

SELECT
SUM(ROUND((StanyPartii.Przychody-StanyPartii.Rozchody)*StanyPartii.Koszt,2)) [Wartosc]
FROM
(
SELECT
prt.Id,prj.Id [Przyjecie_Id],prj.Asortyment_Id
,ISNULL((SELECT SUM(prz.Ilosc) FROM ModelDanychContainer.Przychody AS prz WHERE prz.Partia_Id=prt.Id AND prz.Data<@dzienMagazynowy),0) [Przychody]
,ISNULL((SELECT SUM(rch.Ilosc) FROM ModelDanychContainer.Rozchody AS rch WHERE rch.Partia_Id=prt.Id AND rch.Wydanie_Id!=0 AND rch.Data<@dzienMagazynowy),0) [Rozchody]
,ISNULL((SELECT TOP 1 ((kz.Wartosc*kz.Kurs)+ISNULL((SELECT kd.Wartosc*kd.Kurs FROM ModelDanychContainer.KosztyDodatkowe AS kd WHERE kd.KosztPrzyjeciaGenerujacy_Id=prj.Id),0))/kz.Ilosc FROM ModelDanychContainer.KosztyZakupu AS kz WHERE (kz.Id=prj.KosztPierwotny_Id OR kz.PrzyjecieDlaKtoregoKorekta_Id=prj.Id) AND kz.Data<@dzienMagazynowy ORDER BY kz.Lp DESC),0) [Koszt]
FROM ModelDanychContainer.Partie AS prt
INNER JOIN ModelDanychContainer.Przyjecia AS prj ON prj.Id=prt.Przyjecie_Id
) [StanyPartii]
INNER JOIN ModelDanychContainer.Asortymenty AS a ON a.Id=StanyPartii.Asortyment_Id
WHERE StanyPartii.Przychody>StanyPartii.Rozchody

 

Link to postu
×
×
  • Dodaj nową pozycję...