Radomił Ząbik 310 Napisano 15 Lipca 2020 Udostępnij Napisano 15 Lipca 2020 w Remanent na dzień i wartość magazynowa 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.: 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 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ć? Link to postu
Radomił Ząbik 310 Napisano 15 Lipca 2020 Autor Udostępnij Napisano 15 Lipca 2020 w Remanent na dzień i wartość magazynowa 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
Wojciech Szopiński 227 Napisano 16 Lipca 2020 Udostępnij Napisano 16 Lipca 2020 w Remanent na dzień i wartość magazynowa 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. 1 Link to postu
Radomił Ząbik 310 Napisano 16 Lipca 2020 Autor Udostępnij Napisano 16 Lipca 2020 w Remanent na dzień i wartość magazynowa Wielkie dzięki za nakierowanie. Zmodyfikowałem i dostosowałem się do metody pobierania kosztów, wskazanej przez Pana 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
Polecane posty