Autor Wątek: SQL - Czy konkretne urządzenie jest na magazynie, cz już nie  (Przeczytany 6516 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline mironas

  • Nowy użytkownik
  • *
  • Wiadomości: 13
  • Reputacja +0/-0
  • Wersja programu: 1.47 SP2 HF1
SQL - Czy konkretne urządzenie jest na magazynie, cz już nie
« dnia: 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.

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17040
  • Reputacja +798/-27
  • Wersja programu: GT/Navireo/nexo
Odp: SQL - Czy konkretne urządzenie jest na magazynie, cz już nie
« Odpowiedź #1 dnia: Grudzień 18, 2020, 18:08:04 »
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.
Daniel, Białystok.

Offline mironas

  • Nowy użytkownik
  • *
  • Wiadomości: 13
  • Reputacja +0/-0
  • Wersja programu: 1.47 SP2 HF1
Odp: SQL - Czy konkretne urządzenie jest na magazynie, cz już nie
« Odpowiedź #2 dnia: Grudzień 18, 2020, 19:13:38 »
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.

Offline yemet

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 1246
  • Reputacja +46/-1
  • Wersja programu: Navireo
Odp: SQL - Czy konkretne urządzenie jest na magazynie, cz już nie
« Odpowiedź #3 dnia: Styczeń 14, 2021, 08:24:51 »
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 :)
« Ostatnia zmiana: Styczeń 14, 2021, 08:26:51 wysłana przez yemet »

Offline mironas

  • Nowy użytkownik
  • *
  • Wiadomości: 13
  • Reputacja +0/-0
  • Wersja programu: 1.47 SP2 HF1
Odp: SQL - Czy konkretne urządzenie jest na magazynie, cz już nie
« Odpowiedź #4 dnia: Styczeń 14, 2021, 09:23:24 »
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.

Forum Użytkownikow Subiekt GT

Odp: SQL - Czy konkretne urządzenie jest na magazynie, cz już nie
« Odpowiedź #4 dnia: Styczeń 14, 2021, 09:23:24 »