Cześć!
Natknąłem się na problem niezrealizowanych zamówień, które pozostawały niezrealizowane mimo iż realizacja jest możliwa ze względu na to, że po ich utworzeniu pojawił się stan magazynowy.
Sprawdzanie wszystkich zamówień przy dużej ich ilości jest niewygodne, więc dobrze by było, że będzie to widoczne od razu.
Rozwiązanie:
Zastosowałem dwa widoki (korzystając z profilera podejrzałem co robi Subiekt gdy korzystamy z opcji "sprawdź dostępność towarów z zamówienia") + formatowanie warunkowe. Być może udałoby się to zrobić prościej - zwłaszcza pierwszy widok, ale przewiduję rozwinięcie funkcjonalności, a już teraz działa całkiem sympatycznie oraz szybko na dość pokaźnej bazie.
Zapytanie tworzące widoki:
CREATE view vw_rk_ZamowieniaDostepnosc AS (
SELECT ob_dokHanId,
case when (((ob_IloscMag + (rezerwacjaBiezacyMagazyn-ZarezerwowaneNaTymDokumencie) - wydano) - StanBiezacyMagazyn ) <= 0) then 0 else ((ob_IloscMag + (rezerwacjaBiezacyMagazyn-ZarezerwowaneNaTymDokumencie) - wydano) - StanBiezacyMagazyn ) end as brakujeBiezacy
FROM (
SELECT MAX(pozHan.ob_DokHanLp) as ob_DokHanLp, MAX(pozHan.ob_TowRodzaj) as ob_TowRodzaj, MAX(tw_Symbol) as tw_Symbol
, MAX(tw_DostSymbol) as tw_DostSymbol, MAX(tw_Nazwa) as tw_Nazwa, SUM(pozHan.ob_IloscMag) as ob_IloscMag
, MAX(st_Stan) as StanBiezacyMagazyn
, (select SUM(st_Stan) from tw_Stan where st_TowId = pozHan.ob_TowId and st_MagId in (1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13) ) as StanWszystkieMagazyny
,COUNT(pozHan.ob_DokHanLp) as liczbaPozycji, MAX(pozHan.ob_TowId) as ob_TowId, MAX(pozHan.ob_DokHanId) as ob_DokHanId
, MAX(ISNULL(dbo.fnSub_IloscTowWydanaDoZamowienia(pozHan.ob_DokHanId, pozHan.ob_TowId), 0)) as wydano
, MAX(st_StanRez) as rezerwacjaBiezacyMagazyn
, (select Sum(st_StanRez) from tw_Stan where st_TowId = pozHan.ob_TowId and st_MagId in (1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13) ) as rezerwacjaWszystkieMagazyny
, case when MAX(dok_Status) = 7 then (case when (SUM(pozHan.ob_IloscMag) - MAX(ISNULL(dbo.fnSub_IloscTowWydanaDoZamowienia(pozHan.ob_DokHanId, pozHan.ob_TowId), 0))) > 0
then (SUM(pozHan.ob_IloscMag) - MAX(ISNULL(dbo.fnSub_IloscTowWydanaDoZamowienia(pozHan.ob_DokHanId, pozHan.ob_TowId), 0)))
else 0 end )
else 0 end as ZarezerwowaneNaTymDokumencie
FROM dok_Pozycja as pozHan
LEFT JOIN tw__Towar ON tw_Id = ob_TowId
LEFT JOIN tw_Stan ON ob_TowId = st_TowId
LEFT JOIN dok__Dokument On dok_Id = pozHan.ob_DokHanId
WHERE st_MagId = 1 and ob_TowRodzaj != 2 AND dok_Typ = 16 AND dok_Status = 7
GROUP BY pozHan.ob_TowId
) as widok );
CREATE VIEW vw_rk_ZamowieniaDostepnosc_grupowanie AS (
SELECT ob_dokHanId, sum(brakujeBiezacy) AS brakujeRazem FROM vw_rk_ZamowieniaDostepnosc GROUP BY ob_dokHanId)
Zapytania w formatowaniu warunkowym:
case when brakujeRazem=0 and dok_Typ=16 and dok_status=7 then 1 else 0 end
i dodatkowe w polu poniżej:
left join vw_rk_ZamowieniaDostepnosc_grupowanie ON dok_Id=ob_dokHanId
na końcu proszę pamiętać o pokolorowaniu wiersza
Może się komuś przyda. Pozdrawiam.