Forum Użytkownikow Subiekt GT
InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: mironas w Grudzień 18, 2020, 17:49:57
-
W tej konkretnej bazie, wszystkie produky (urządzenia) wprowadzane są detalicznie, każdy ma swój indywidualny numer seryjny. Ten numer wpisywany jest jako Kod dostawy i występuje w bazie danych w tabeli/polu: dok_Pozycja.ob_NumerSeryjny.
Potrzebuję zrobić zapytanie SQL, które zwróci mi listę wszystkich urządzeń z numerem seryjnym (czyli Kodem dostawy) i informacją, czy dane urządzenie jest jeszcze na magazynie, czy już z niego zeszło.
Jedyne co wymyśliłem, to sprawdzić typ dokumentu magazynowego powiązanego z ostatną pozycją - a potem na podstawie tego typu ustalić, czy urzadzenie zeszło z magazymnu, czy nie:
SELECT
P.ob_NumerSeryjny,
D.dok_Typ
FROM
dok_Pozycja P,
dok__Dokument D
WHERE
D.dok_Id = P.ob_DokMagId
AND P.ob_id = (SELECT MAX(ob_id) FROM dok_Pozycja WHERE ob_DokMagId is not null AND ob_NumerSeryjny = P.ob_NumerSeryjny)
AND D.dok_Status = 1 -- 1-wykonany
Działa, ale wolałbym wyciągnąć bezpośrednio z bazy danych informację, czy dane urządzenie jest na magazynie, czy już nie.
Próbowałem wyciągnąć to z dok_MagRuch.mr_Pozostalo ale to pole zawsze dla ostatniego dokumentu ma wartość '1' nawet jeśli jest to dokument typu WZ (dok_Typ=11):
SELECT
P.ob_NumerSeryjny,
D.dok_Typ,
R.mr_Pozostalo
FROM
dok_Pozycja P,
dok__Dokument D,
dok_MagRuch R
WHERE
D.dok_Id = P.ob_DokMagId
AND R.mr_PozId = P.ob_Id
AND P.ob_id = (SELECT MAX(ob_id) FROM dok_Pozycja WHERE ob_DokMagId is not null AND ob_NumerSeryjny = P.ob_NumerSeryjny)
AND D.dok_Status = 1 -- 1-wykonany
Jakaś podpowiedź, jak można zrobić to lepiej?
Albo, co tak naprawdę zawiera pole mr_Pozostalo, bo raczej nie jest to ilość pozostała w magazynie po wykonaniu tego ruchu magazynowego.
-
Albo, co tak naprawdę zawiera pole mr_Pozostalo, bo raczej nie jest to ilość pozostała w magazynie po wykonaniu tego ruchu magazynowego.
Pokaż, że tak nie jest.
-
Pokaż, że tak nie jest.
Pokazuję...
Ostatni dokument w któym jes pozycja z urządzeniem o numerze '1508806' to WZ (Wydanie Zewnętrzne). Dokument jest zatwierdzony i faktycznie urzadzenie zniknęło ze stanów magazynowych (remanent już go nie pokazuje). Jednak powiązany z tą pozycją wpis w dok_MagRuch posiada mr_Pozostalo o wartości '1'.
Konkretnie to zapytanie:
SELECT
P.ob_NumerSeryjny,
D.dok_Typ,
R.mr_Pozostalo
FROM
dok_Pozycja P,
dok__Dokument D,
dok_MagRuch R
WHERE
D.dok_Id = P.ob_DokMagId
AND R.mr_PozId = P.ob_Id
AND P.ob_id = (SELECT MAX(ob_id) FROM dok_Pozycja WHERE ob_DokMagId is not null AND ob_NumerSeryjny = P.ob_NumerSeryjny)
AND D.dok_Status = 1
AND P.ob_NumerSeryjny = '1508806'
Daje wynik:
| ob_NumerSeryjny | | dok_Typ | | mr_Pozostalo | | |
| 1508806 | | 11 | | 1,00 | | 11 - czyli WZ |
A 'historia' tego urzadzenia wygląda następując:
SELECT
P.ob_NumerSeryjny,
D.dok_Typ,
R.mr_Pozostalo
FROM
dok_Pozycja P,
dok__Dokument D,
dok_MagRuch R
WHERE
D.dok_Id = P.ob_DokMagId
AND R.mr_PozId = P.ob_Id
AND P.ob_NumerSeryjny = '1508806'
ORDER BY
R.mr_Id
| ob_NumerSeryjny | | dok_Typ | | mr_Pozostalo | | |
| 1508806 | | 12 | | 0,00 | | 12 - czyli PW |
| 1508806 | | 11 | | 1,00 | | 11 - czyli WZ |
Jak widać, w dok_MagRuch.mr_Pozostalo, w rekordzie powiązanym z Przyjęciem na magazyn mamy Pozostało '0', a w rokordzie powiązanym z Wydaniem z magazynu, mamy Pozostało '1'.
Oczywiście zdaję sobie sprawę, że dane w polu mr_Pozostalo są poprawne, ale nie jest to taka informacja jaką zrozumiałem z dokumentaci, że jest to stan ilościowy na magazynie jaki pozostał po wykonaniu danej operacji.
-
Podaję czysto z pamięci bo nie mam czasu sprawdzać: rekord powiązany bezpośrednio z WZ-tką oznacza zupełnie co innego. To jest min. informacja o tym ile towaru możesz z tej WZ-tki zwrócić. Jak tam będzie 0 tzn. że towar z tej WZ wrócił w całości na magazyn (korekta/zwrot/zwz...). Wypisz paragon, zrób do niego zwrot i sprawdź ;)
Info czy z danej dostawy coś zostało na magazynie jest przy rekordach powiązanych z PZ/PW :)
-
Info czy z danej dostawy coś zostało na magazynie jest przy rekordach powiązanych z PZ/PW :)
Rozwiązałem problem w inny sposób. Sprawdzam ostatni dokument magazynowy dla wybranych dostaw i jeśli jest to wydanie z magazynu, to znaczy, że urządzenie nie znajduje się na magazynie. Najpierw zrobiłem to tak:
SELECT
P.ob_NumerSeryjny,
D.dok_Typ
FROM
dok_Pozycja P,
dok__Dokument D
WHERE
D.dok_Id = P.ob_DokMagId
AND P.ob_id = (SELECT MAX(ob_id) FROM dok_Pozycja WHERE ob_DokMagId is not null AND ob_NumerSeryjny = P.ob_NumerSeryjny)
AND D.dok_Status = 1 -- 1-wykonany
AND
(
P.ob_NumerSeryjny IN ('1504924','1504925','1504926','1504927','1504928')
OR P.ob_NumerSeryjny IN ('xxxxxIN','xxxxxKO','xxxxxLA','xxxxxMO','xxxxxSE','xxxxxST')
)
Ale pojawił się problem, w przypadku gdy na pojedyńczej pozycji na FS znajduje się kilka urządzeń (zamiast nr dostawy jest wpis 'z wielu dostaw'). Zmieniłem wię zapytanie na takie:
SELECT
pp.ob_NumerSeryjny, D.dok_Typ
FROM
dok__Dokument D,
dok_Pozycja P,
dok_MagRuch R
LEFT JOIN dok_MagRuch mr on mr.mr_Id = R.mr_SeriaId
LEFT JOIN dok_Pozycja pp on pp.ob_Id = mr.mr_PozId
WHERE
P.ob_DokMagId = D.dok_Id
AND P.ob_Id = R.mr_PozId
AND R.mr_Id = (select max(mr_Id) from dok_MagRuch where mr_SeriaId = R.mr_SeriaId)
AND
(
pp.ob_NumerSeryjny IN ('NW-1001','NW-1002','NW-1003','NW-1004')
OR pp.ob_NumerSeryjny IN ('NW-1001','NW-1002','NW-1003','NW-1004')
)
ORDER BY pp.ob_NumerSeryjny
Przypomnę - zapytanie ma zwrócić TYP ostatniego dokumnetu magazynowego dla podanych nrumerów seryjnych (kodów dostaw) urzadzeń.
W testach wychodzi, że działa, ale jeśli ktoś znalazłby słabe punktu w tym rozwiązaniu, to bedę wdzięczny.