SQL Server w logistyce

Kiedy zlecenie jest zrealizowane: równość sum kontra liczba otwartych linii w T-SQL

Zlecenie przyjęcia z dwiema liniami po 10 sztuk można zamknąć po porównaniu sum i pomylić się o dwie sztuki. Warunek na widoku zatwierdzonych przyjęć nie ma tej luki.

sql.server.net.pl/sql-server/
Ukośne zbliżenie kolorowego wykresu słupkowego na ekranie
Ukośne zbliżenie kolorowego wykresu słupkowego na ekranie
W skrócie
  • Problem: porównanie sumy ilości zleconej z przyjętą zamyka zlecenie, w którym nadwyżka na jednej linii zasłania niedobór na drugiej, a przy nadwyżce nie zamknie go nigdy.
  • Wzorzec: zlecenie zamykamy, gdy w widoku zatwierdzonych przyjęć nie istnieje linia z ilością pozostałą większą od zera.
  • Pułapka: filtr statusu w WHERE zamienia LEFT JOIN w złączenie wewnętrzne, a COUNT DISTINCT liczy wiersz o ilości zero jako przyjęcie.
  • Kontrola: zapytanie zestawia naiwne sumy z liczbą otwartych linii dla sześciu zleceń przykładowych.

Zamknięcie zlecenia przyjęcia w T-SQL wygląda na proste, dopóki nie trafi się zlecenie, w którym jedna linia przyjęła o dwie sztuki za dużo, a druga o dwie za mało. Suma zleconych i suma przyjętych wynoszą wtedy tyle samo, więc zapytanie porównujące sumy uznaje zlecenie za zrealizowane.

Zlecenie przyjęcia jest zrealizowane wtedy, gdy nie istnieje ani jedna linia z ilością pozostałą większą od zera, liczoną na widoku zawierającym tylko zatwierdzone przyjęcia. Ilość pozostałą obcinamy do zera, więc nadwyżka na jednej linii nie zniesie niedoboru na innej, a zlecenie z nadwyżką nadal się zamknie.

To wzorzec z nazwami przykładowymi, a nie opis działania żadnego systemu. Uruchomiliśmy go na SQL Server 2022 przy poziomach zgodności 130 i 160 i za każdym razem dostaliśmy ten sam wynik.

Zlecenie przyjęcia jest zrealizowane, gdy żadna linia nie ma braku

Weźmy zlecenie z dwiema liniami po 10 sztuk (przykład). Magazynier przyjmuje 12 sztuk Artykułu A i 8 sztuk Artykułu B, a dokument zatwierdza. Suma zlecona i suma przyjęta wynoszą po 20, więc porównanie sum uznaje zlecenie za zrealizowane, choć Artykułowi B brakuje 2 sztuk. Nadwyżka na jednej linii zasłoniła niedobór na drugiej.

Odwrotny przypadek jest równie kłopotliwy. Gdy na liniach przyjęto 12 i 10 sztuk przy zleconych 10 i 10, suma przyjęta wynosi 22 i równość sum nie zachodzi nigdy, więc zlecenie z nadwyżką nie zamknęłoby się. Liczba linii z ilością pozostałą większą od zera wynosi tu 0, więc zamknięcie działa.

Dwa pozostałe zlecenia przykładowe pokazują linie bez pełnego przyjęcia: zlecenie 26-1002 nie ma na linii 2 żadnego przyjęcia, a zlecenie 26-1003 ma tam przyjęcie tylko w buforze. Dwa kolejne pokazują wyjątki: zlecenie 26-1004 ma na linii 2 jedynie wiersz o ilości zero, a zlecenie 26-1006 nie ma żadnej linii. Tabela zbiera wszystkie sześć sytuacji.

Sześć zleceń przykładowych: sumy, porównanie sum i liczba otwartych linii
ZlecenieZlecono i przyjęto (zatwierdzone)Porównanie sumLinie otwarte (zatwierdzone)Linie otwarte (z buforem)
26-100120 i 20zamknie11
26-100220 i 10nie zamknie11
26-100320 i 10nie zamknie10
26-100420 i 10nie zamknie11
26-100520 i 22nie zamknie00
26-1006brak liniinie zamknie00

Przykład. Porównanie sum zamyka zlecenie 26-1001 mimo otwartej linii, a zlecenie 26-1005 z nadwyżką zostawia otwarte.

Zlecenie jest zrealizowane wtedy, gdy nie ma ani jednej linii z ilością pozostałą większą od zera, a nie wtedy, gdy sumy się zgadzają.

Opis funkcji systemu magazynowego, która zapisuje nadmiar jako wiersz o ilości zero, jest w osobnym artykule o nadmiarze przy przyjęciu towaru w WMS. Ten artykuł dotyczy wyłącznie wzorca zapytania. Formularz przyjęcia dokumentu PZ ze zlecenia opisuje strona o przyjęciu PZ ze zlecenia w WMS.

Dane próbne mają trzy tabele i dwa poziomy realizacji

Przykład składa się z trzech tabel opisanych w zestawieniu poniżej. Sześć zleceń przykładowych, od 26-1001 do 26-1006, odtwarza po jednej sytuacji z tabeli z poprzedniej sekcji. Zlecenie ma status 1 (otwarte) albo 2 (zamknięte).

Trzy tabele danych próbnych
TabelaZawartośćStatusy
dbo.Zlecenienumer i status zlecenia1 otwarte, 2 zamknięte
dbo.ZlecLinianumer linii i ilość zleconabrak
dbo.Przyjecieprzyjęcia z ilością dla linii zlecenia0 bufor, 1 zatwierdzone, X usunięte
CREATE TABLE dbo.Zlecenie (Numer varchar(20) PRIMARY KEY, Status char(1) NOT NULL DEFAULT '1');
CREATE TABLE dbo.ZlecLinia (Numer varchar(20), Lp int, Zlecono decimal(15,3), PRIMARY KEY (Numer, Lp));
CREATE TABLE dbo.Przyjecie (Id int IDENTITY PRIMARY KEY, Numer varchar(20), Lp int, Ilosc decimal(15,3), Status char(1));
INSERT dbo.Zlecenie (Numer) VALUES ('26-1001'),('26-1002'),('26-1003'),('26-1004'),('26-1005'),('26-1006');
INSERT dbo.ZlecLinia VALUES ('26-1001',1,10),('26-1001',2,10),('26-1002',1,10),('26-1002',2,10),('26-1003',1,10),('26-1003',2,10),
                            ('26-1004',1,10),('26-1004',2,10),('26-1005',1,10),('26-1005',2,10);
INSERT dbo.Przyjecie (Numer, Lp, Ilosc, Status) VALUES
 ('26-1001',1,12,'1'),('26-1001',2,8,'1'),
 ('26-1002',1,10,'1'),
 ('26-1003',1,10,'1'),('26-1003',2,10,'0'),
 ('26-1004',1,10,'1'),('26-1004',2,0,'1'),
 ('26-1005',1,12,'1'),('26-1005',2,10,'1'),
 ('26-1001',1,5,'X');

Przyjęcie ze statusem X (5 sztuk na linii 1 zlecenia 26-1001) jest usunięte i nie może wpłynąć na żaden wynik. Dwa poziomy realizacji odpowiadają dwóm pytaniom. Poziom bufora obejmuje przyjęcia dopisane do dokumentu, ale jeszcze niezatwierdzone. Poziom zatwierdzonych obejmuje wyłącznie dokumenty zatwierdzone.

Różnica ma konsekwencje dla tego, co widzi operator i kiedy wolno zamknąć zlecenie. Omawiamy ją w dwóch następnych sekcjach.

Widok liczy ilość pozostałą na każdej linii i obcina ją do zera

Widok zwraca po jednym wierszu na linię zlecenia. Ilość przyjętą liczymy jako ISNULL(SUM(ilość), 0), więc linia bez żadnego przyjęcia ma 0, a nie NULL. Kolumna Brakuje to ilość zlecona minus przyjęta, obcięta do zera wyrażeniem CASE. Nadwyżka na jednej linii daje więc 0, a nie liczbę ujemną, która zniosłaby niedobór na innej.

Dwa widoki są tym samym zapytaniem z innym filtrem statusu w warunku złączenia. Widok v_Linie_Z_Buforem bierze statusy 0 i 1, a widok v_Linie_Zatwierdzone wyłącznie status 1. Przyjęcia ze statusem X nie liczą się w żadnym z nich. Składnię opisuje dokumentacja polecenia CREATE VIEW.

CREATE VIEW dbo.v_Linie_Z_Buforem AS
SELECT l.Numer, l.Lp, l.Zlecono,
       ISNULL(SUM(p.Ilosc), 0) AS Przyjeto,
       CASE WHEN l.Zlecono - ISNULL(SUM(p.Ilosc), 0) > 0 THEN l.Zlecono - ISNULL(SUM(p.Ilosc), 0) ELSE 0 END AS Brakuje
FROM dbo.ZlecLinia l
LEFT JOIN dbo.Przyjecie p ON p.Numer = l.Numer AND p.Lp = l.Lp AND p.Status IN ('0','1')
GROUP BY l.Numer, l.Lp, l.Zlecono;
GO
CREATE VIEW dbo.v_Linie_Zatwierdzone AS
SELECT l.Numer, l.Lp, l.Zlecono,
       ISNULL(SUM(p.Ilosc), 0) AS Przyjeto,
       CASE WHEN l.Zlecono - ISNULL(SUM(p.Ilosc), 0) > 0 THEN l.Zlecono - ISNULL(SUM(p.Ilosc), 0) ELSE 0 END AS Brakuje
FROM dbo.ZlecLinia l
LEFT JOIN dbo.Przyjecie p ON p.Numer = l.Numer AND p.Lp = l.Lp AND p.Status = '1'
GROUP BY l.Numer, l.Lp, l.Zlecono;
GO

Przykład ilustracyjny. Dwa widoki różnią się jednym warunkiem w złączeniu; GO oddziela partie.

Obcięcie do zera zapisaliśmy wyrażeniem CASE, a nie funkcjami LEAST i GREATEST, więc zapytania nie zależą od wersji silnika (według dokumentacji obie funkcje pojawiły się dopiero w SQL Server 2022).

Schemat: porównanie sum kontra liczba otwartych liniiSchemat: nadwyżka 2 sztuk na linii A kasuje w sumie niedobór 2 sztuk na linii B. Porównanie sum uznaje zlecenie za zamknięte (błąd), a liczba linii z ilością pozostałą większą od zera wynosi 1, więc zlecenie zostaje otwarte. UPDATE zamyka zlecenie tylko przy 0 linii otwartych, a dane bierze z widoku zatwierdzonych.Nadwyżka na jednej linii nie może zasłonić niedoboru na drugiejZlecenie ma dwie linie po 10 sztuk: linia A przyjęta w ilości 12, linia B w ilości 8. Sumy są równe, a jedna linia jest otwarta.Porównanie sumobrys: zlecono 10, wypełnienie: przyjętoLiczba otwartych liniiobrys: zlecono 10, wypełnienie: przyjętoLinia A+2zlecono 10przyjęto 12Linia B-2zlecono 10przyjęto 8suma zlecono 20, suma przyjęto 20zlecenie zamknięte (błąd)Linia A+2pozostało 0Linia B-2pozostało 2linie z pozostało > 0: 1zlecenie otwarteKolumna Brakuje: ilość pozostała na linii (liczy ją widok)zlecono - przyjęto, ale nie mniej niż 0nadwyżka daje 0, a nie liczbę ujemnąUPDATE zamyka zlecenie tylko przy 0 linii otwartychDwa widoki tego samego liczeniawidok z buforem (dla operatora)widok zatwierdzonych (dla zamknięcia)dane do zamknięcia
Schemat: nadwyżka linii A kasuje w sumie niedobór linii B, a liczba otwartych linii pokazuje, że zlecenia nie wolno zamknąć.

Widok z buforem jest przeznaczony dla operatora. W zleceniu 26-1003 linia 2 jest przyjęta w buforze, więc widok z buforem pokazuje 0 linii otwartych, a widok zatwierdzonych nadal 1. Operator widzi już zero do przyjęcia, a zamknięcie czeka na zatwierdzenie dokumentu.

Zamknięcie zlecenia to jeden UPDATE z trzema warunkami

Zamknięcie to jeden UPDATE nagłówka z trzema warunkami. Zlecenie musi mieć status 1, musi mieć co najmniej jedną linię i w widoku zatwierdzonych nie może istnieć linia z kolumną Brakuje większą od zera. Pierwszy warunek sprawia, że ponowne wykonanie polecenia nie dotyka zleceń już zamkniętych.

UPDATE z SET Status = '2'
FROM dbo.Zlecenie z
WHERE z.Status = '1'
  AND EXISTS (SELECT 1 FROM dbo.ZlecLinia l WHERE l.Numer = z.Numer)
  AND NOT EXISTS (SELECT 1 FROM dbo.v_Linie_Zatwierdzone r WHERE r.Numer = z.Numer AND r.Brakuje > 0);

W przykładzie zamyka się tylko zlecenie 26-1005 (1 wiersz), a drugie wykonanie tego samego polecenia zmienia 0 wierszy. Po zamknięciu status 2 ma wyłącznie 26-1005, a pozostałe pięć zleceń zostaje ze statusem 1.

Warunek, że zlecenie ma linie, jest strażnikiem. Bez niego ten sam UPDATE zamknąłby także zlecenie 26-1006, które nie ma żadnej linii, bo nie istnieje w nim linia z brakiem. Zapytanie sprawdzające, które zlecenia zamknęłyby się bez strażnika, zwróciło zlecenia 26-1005 i 26-1006.

SELECT 'PULAPKA_PUSTE' AS Sekcja, z.Numer FROM dbo.Zlecenie z
WHERE z.Status = '1' AND NOT EXISTS (SELECT 1 FROM dbo.v_Linie_Zatwierdzone r WHERE r.Numer = z.Numer AND r.Brakuje > 0)
ORDER BY z.Numer;

Filtr statusu w WHERE i COUNT DISTINCT zakrywają lukę

Trzy konstrukcje, które wyglądają niewinnie, psują wynik po cichu. Każdą uruchomiliśmy na tych samych danych, przed zamknięciem zleceń.

Pierwsza dotyczy złączenia. Filtr statusu wpisany w WHERE zamiast w warunek ON zamienia LEFT JOIN w złączenie wewnętrzne, bo wiersz bez przyjęcia ma po stronie przyjęć status NULL i zostaje odrzucony. Dla zlecenia 26-1002, którego linia 2 nie ma żadnego przyjęcia, takie zapytanie widzi 1 linię zamiast 2. Linia bez przyjęć znika, a zlecenie wygląda na kompletne.

SELECT 'PULAPKA_WHERE' AS Sekcja, l.Numer, COUNT(*) AS Linie_widoczne_z_2
FROM dbo.ZlecLinia l LEFT JOIN dbo.Przyjecie p ON p.Numer = l.Numer AND p.Lp = l.Lp
WHERE p.Status = '1' AND l.Numer = '26-1002'
GROUP BY l.Numer;

Druga dotyczy zliczania. W zleceniu 26-1004 linia 2 ma tylko wiersz o ilości 0. Wyrażenie COUNT(DISTINCT Lp) zlicza 2 linie z przyjęciem, a wersja z CASE WHEN Ilosc <> 0 THEN Lp END zlicza 1. Wiersz o ilości zero zapisuje wyjątek, a nie przyjęcie, więc nie wolno go liczyć jako przyjętej linii. Funkcję opisuje dokumentacja COUNT.

SELECT 'PULAPKA_COUNT' AS Sekcja, p.Numer, COUNT(DISTINCT p.Lp) AS Linie_z_przyjeciem_naiwnie,
       COUNT(DISTINCT CASE WHEN p.Ilosc <> 0 THEN p.Lp END) AS Linie_z_przyjeciem_ilosc_niezerowa
FROM dbo.Przyjecie p WHERE p.Numer = '26-1004' AND p.Status = '1' GROUP BY p.Numer;

Przykład ilustracyjny. Wynik: zlecenie 26-1004, 2 linie z przyjęciem naiwnie i 1 z ilością niezerową.

Trzecia dotyczy sumy różnic. Dla zlecenia 26-1001 wyrażenie SUM(Zlecono - Przyjeto) wynosi 0, bo nadwyżka +2 i niedobór -2 się znoszą. Suma ilości z kolumny Brakuje po obcięciu wynosi 2 i dopiero ona pokazuje, że zlecenie nie jest zrealizowane.

SELECT 'PULAPKA_ROZNICA' AS Sekcja, Numer, SUM(Zlecono - Przyjeto) AS Suma_roznic_bez_obciecia, SUM(Brakuje) AS Suma_brakuje
FROM dbo.v_Linie_Zatwierdzone WHERE Numer = '26-1001' GROUP BY Numer;
Wyniki trzech zapytań z pułapkami
ZapytanieZlecenieWynik błędnyWynik poprawny
Filtr statusu w WHERE26-10021 linia2 linie
COUNT(DISTINCT Lp)26-10042 linie z przyjęciem1 linia z ilością niezerową
Suma różnic26-10010,0002,000

Przykład. Wynik błędny to ten, po którym zlecenie wyglądałoby na zrealizowane.

Zapytanie kontrolne pokazuje różnicę między sumami a liczbą linii

Zapytanie kontrolne zestawia dla każdego zlecenia wynik naiwnego porównania sum z liczbą linii otwartych w dwóch widokach, zatwierdzonych i z buforem. Uruchamiamy je przed zamknięciem zleceń, bo pokazuje, które zlecenia zamknęłyby się błędnie.

SELECT 'KONTROLA' AS Sekcja, z.Numer,
       CASE WHEN (SELECT SUM(Zlecono) FROM dbo.ZlecLinia WHERE Numer = z.Numer)
               = (SELECT SUM(Ilosc) FROM dbo.Przyjecie WHERE Numer = z.Numer AND Status = '1')
            THEN 'zamknie' ELSE 'nie zamknie' END AS Naiwnie_sumy,
       (SELECT COUNT(*) FROM dbo.v_Linie_Zatwierdzone r WHERE r.Numer = z.Numer AND r.Brakuje > 0) AS Otwarte_linie_zatw,
       (SELECT COUNT(*) FROM dbo.v_Linie_Z_Buforem r WHERE r.Numer = z.Numer AND r.Brakuje > 0) AS Otwarte_linie_bufor
FROM dbo.Zlecenie z ORDER BY z.Numer;
Oczekiwany wynik zapytania kontrolnego
SekcjaNumerNaiwnie_sumyOtwarte_linie_zatwOtwarte_linie_bufor
KONTROLA26-1001zamknie11
KONTROLA26-1002nie zamknie11
KONTROLA26-1003nie zamknie10
KONTROLA26-1004nie zamknie11
KONTROLA26-1005nie zamknie00
KONTROLA26-1006nie zamknie00

Przykład. Jedyny wiersz z błędnym wynikiem naiwnych sum to zlecenie 26-1001.

Tak ten wynik wygląda w siatce zapytania, razem z drugą siatką po wykonaniu UPDATE.

Wynik zapytania kontrolnego: sześć zleceńMakieta poglądowa, dane przykładowe. Okno wyniku zapytania: siatka sześciu zleceń z kolumnami Numer, Naiwnie_sumy, Otwarte_linie_zatw i Otwarte_linie_bufor. Komórka zamknie przy zleceniu 26-1001 jest pomarańczowa (wynik błędny), wiersz zlecenia 26-1005 jest zielony. Pod spodem siatka Po zamknięciu: status 2 ma tylko zlecenie 26-1005.Wynikzapytanie kontrolneZapytanie kontrolne, przed zamknięciem zleceńNumerNaiwnie_sumyOtwarte_linie_zatwOtwarte_linie_bufor26-1001zamknie1126-1002nie zamknie1126-1003nie zamknie1026-1004nie zamknie1126-1005nie zamknie0026-1006nie zamknie00Pomarańczowa komórka: porównanie sum uznaje zlecenie 26-1001 za zrealizowane, choć jedna linia jest otwarta. Zielony wiersz: 0 linii otwartych w obu widokach.Po zamknięciuNumerStatus26-1005226-1001126-1002126-1003126-1004126-10061Makieta poglądowa, dane przykładowe
Makieta poglądowa, dane przykładowe. Wynik kontroli w siatce zapytania: sześć zleceń z liczbą otwartych linii dla zatwierdzonych i z buforem.

Przykład dał identyczny wynik na SQL Server 2022 przy poziomach zgodności 130 i 160. Widoki, złączenie LEFT JOIN i warunek NOT EXISTS są dostępne od SQL Server 2016 (według dokumentacji). Wzorzec sprawdziliśmy wyłącznie dla przyjęć, nie dla wydań, i nie oceniamy wydajności widoków.

Pytania przed napisaniem własnego warunku zamknięcia

Zanim przeniesiesz wzorzec do własnej bazy, odpowiedz sobie na cztery pytania.

  • Zamknięcie: jak zamyka się zlecenie: po porównaniu sum czy po liczbie otwartych linii, i czy robi to człowiek.
  • Widoczność: czy operator ma widzieć ilość pozostałą od razu po dopisaniu pozycji do bufora, czy dopiero po zatwierdzeniu dokumentu.
  • Nadwyżka: co ma się stać ze zleceniem, gdy na jednej linii przyjęto więcej, niż zlecono.
  • Wyjątki: czy w przyjęciach występują wiersze o ilości zero, które zapisują wyjątek, i kto je liczy.

Pokrewne wzorce z tej serii opisują artykuły o znaczniku wysłano w jednym UPDATE z OUTPUT i o alokacji zachłannej kompletów. Rozkład wydania na dostawy jednego artykułu opisuje artykuł o alokacji wydania sumą narastającą, a pułapkę zapytania o jeden wiersz w TOP 1 bez ORDER BY. O filtrze, który po cichu zmienia sens zapytania, pisze też artykuł o saldzie lokalizacji i pułapce HAVING. Wszystkie artykuły sekcji zebraliśmy w spisie artykułów o SQL Server.

FAQ

Najczęstsze pytania o zamykanie zlecenia w T-SQL

01

Dlaczego porównanie sumy zleconej z sumą przyjętą nie wystarcza?

Gdy jedna linia ma nadwyżkę 2 sztuk, a druga niedobór 2 sztuk, obie sumy wynoszą po 20 i zlecenie wygląda na zrealizowane. Przy nadwyżce na linii suma przyjęta jest większa od zleconej, więc równość nie zachodzi nigdy i zlecenie by się nie zamknęło. Suma różnic bez obcięcia też znosi się do 0, a suma ilości brakujących wynosi 2.

02

Jak liczyć ilość pozostałą na linii, żeby nadwyżka nie zasłaniała niedoboru?

Widok liczy ilość przyjętą jako ISNULL(SUM(ilość), 0), a ilość pozostałą jako zleconą minus przyjętą, obciętą do zera wyrażeniem CASE. Nadwyżka na jednej linii daje wtedy 0, a nie liczbę ujemną. Obcięcie jest napisane bez funkcji LEAST i GREATEST, więc nie zależy od wersji silnika.

03

Po co dwa widoki tego samego liczenia?

Widok z buforem bierze przyjęcia o statusach 0 i 1, a widok zatwierdzonych tylko status 1. Operator czytający widok z buforem widzi już zero do przyjęcia, a zamknięcie czeka na zatwierdzenie dokumentu. W przykładzie zlecenie 26-1003 ma 0 linii otwartych w pierwszym widoku i 1 w drugim.

04

Dlaczego filtr statusu stoi w warunku złączenia, a nie w WHERE?

Filtr w WHERE odrzuca wiersze, w których po stronie przyjęć jest NULL, więc LEFT JOIN działa jak złączenie wewnętrzne. Dla zlecenia 26-1002 zapytanie widzi 1 linię zamiast 2, bo linia bez przyjęć znika. W warunku ON filtr zostawia linię bez przyjęć w wyniku.

05

Jak zabezpieczyć zamknięcie przed zleceniem bez linii i przed ponownym wykonaniem?

UPDATE ma trzy warunki: status 1, co najmniej jedna linia i brak linii z ilością pozostałą większą od zera w widoku zatwierdzonych. Bez warunku, że zlecenie ma linie, zamknęłoby się także zlecenie 26-1006. Drugie wykonanie polecenia zmienia 0 wierszy, bo zamknięte zlecenie nie ma już statusu 1.

Słownik pojęć

Słownik pojęć

Pojęcia użyte we wzorcu zamykania zlecenia przyjęcia.

LLinia zlecenia
Pozycja zlecenia z numerem linii i ilością zleconą. We wzorcu o zamknięciu zlecenia decyduje stan każdej linii osobno, a nie suma ilości z całego zlecenia.
IIlość pozostała
Ilość zlecona minus przyjęta, obcięta do zera. We wzorcu jest liczona w kolumnie Brakuje, więc nadwyżka na jednej linii nie daje liczby ujemnej, która zniosłaby niedobór na innej.
BBufor
Stan dokumentu przyjęcia, w którym pozycje są dopisane, ale dokument nie jest zatwierdzony. We wzorcu przyjęcia ze statusem 0 widzi widok z buforem, a widok zatwierdzonych ich pomija.
DDokument zatwierdzony
Dokument przyjęcia ze statusem 1. Tylko takie przyjęcia liczy widok, na którym oparte jest zamknięcie zlecenia, więc pozycje z bufora go nie otwierają ani nie zamykają.
ZZłączenie LEFT JOIN
Złączenie, które zachowuje wiersze lewej tabeli także bez dopasowania. We wzorcu zachowuje linię bez żadnego przyjęcia, o ile filtr statusu stoi w warunku ON, a nie w WHERE.
NNadwyżka
Ilość przyjęta ponad zleconą na jednej linii. We wzorcu nadwyżka daje ilość pozostałą 0 i nie zasłania niedoboru na innej linii ani nie blokuje zamknięcia zlecenia.
WWidok
Zapisane zapytanie, z którego korzysta się jak z tabeli. We wzorcu dwa widoki liczą to samo, a różnią się filtrem statusu przyjęć w warunku złączenia.
NNOT EXISTS
Warunek prawdziwy, gdy podzapytanie nie zwraca żadnego wiersza. We wzorcu zamknięcie wymaga, żeby w widoku zatwierdzonych nie istniała linia z ilością pozostałą większą od zera.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.