Numer partii i data ważności jako dane wyrobu
Partia produkcyjna obejmuje ilość wyrobu wytworzoną w jednym cyklu, na tej samej linii i z tych samych surowców. Numer partii wskazuje tę grupę jednym identyfikatorem, a data ważności określa moment, po którym wyrób nie powinien już trafić do sprzedaży ani do użycia. Oba pola zapisuje się w chwili powstania wyrobu i nie zmienia się ich później.
Dla żywności rozróżnia się dwa rodzaje terminu: „należy spożyć do” oraz „najlepiej spożyć przed”. W kartotece indeksu zapisuje się, który z nich obowiązuje, bo od tego zależy dalsze postępowanie z towarem po upływie terminu. Zestawienie poniżej pokazuje, kto nadaje poszczególne pola i skąd system bierze ich wartości.
| Pole | Kto nadaje | Skąd wartość |
|---|---|---|
| Numer partii | Produkcja albo dostawca towaru handlowego | Nadany przy zamknięciu zlecenia albo odczytany z etykiety dostawcy |
| Data produkcji | Linia produkcyjna | Data zakończenia partii |
| Data ważności | System | Data produkcji powiększona o okres trwałości z kartoteki |
| Rodzaj terminu | Kartoteka indeksu | Ustawienie „należy spożyć do” albo „najlepiej spożyć przed” |
Wyliczanie daty ważności z okresu trwałości
Okres trwałości zapisuje się w kartotece indeksu w dniach. Data ważności powstaje przez dodanie tej liczby do daty produkcji, a nie przez ręczne wpisanie daty kalendarzowej na hali. Funkcja DATEADD w T-SQL wykonuje to jednym zapytaniem, które uzupełnia partie bez daty. Tabele w przykładzie są przykładowe, a nie schematem produktu.
UPDATE l
SET l.ExpiryDate = DATEADD(DAY, i.ShelfLifeDays, l.ProductionDate)
FROM dbo.ProductionLot AS l
JOIN dbo.Item AS i ON i.ItemId = l.ItemId
WHERE l.ExpiryDate IS NULL;
Miesiące dodaje się ostrożnie. DATEADD z częścią MONTH od 31 stycznia daje 28 albo 29 lutego, więc okres liczony w miesiącach nie odpowiada okresowi w dniach. Okres zapisany w dniach jest jednoznaczny i daje ten sam wynik w każdym miesiącu.
Reguła: data ważności wynika z daty produkcji i okresu trwałości. Data wpisana ręcznie na hali jest źródłem błędu, bo system uzna partię za ważną o kilka dni za długo.
Partia własna i partia dostawcy
Wyrób własny dostaje numer partii przy zamknięciu zlecenia produkcyjnego. Rejestrację na hali opisuje tekst o panelach produkcyjnych w systemie ERP. Towar handlowy przychodzi z numerem nadanym przez dostawcę, a magazynier odczytuje go z etykiety przy przyjęciu.
Dwie dostawy tego samego indeksu mogą mieć ten sam numer partii dostawcy, jeśli pochodzą z jednej serii. System tworzy wtedy jedną partię z dwoma przyjęciami albo dwie partie z tym samym numerem zewnętrznym, zależnie od przyjętej reguły, a regułę ustala się przed uruchomieniem ewidencji.

Rejestracja partii na produkcji i przy przyjęciu
Partię rejestruje się w miejscu, w którym powstaje albo wchodzi do firmy. Na produkcji robi to operator przy zamknięciu zlecenia, a na rampie magazynier przy przyjęciu dostawy. Dane trafiają na etykietę w tej samej operacji, w której zapisują się w bazie, więc oba zapisy nie mogą się rozejść.
Standard GS1-128 zapisuje partię i daty w polach o stałych identyfikatorach zastosowania. Wybrane identyfikatory zestawia tabela poniżej, a budowę całej etykiety opisuje tekst o etykietach logistycznych GS1.
| Identyfikator | Znaczenie | Format |
|---|---|---|
| 01 | GTIN jednostki handlowej | 14 cyfr |
| 10 | Numer partii | Do 20 znaków, pole o zmiennej długości |
| 11 | Data produkcji | RRMMDD |
| 15 | Data minimalnej trwałości | RRMMDD |
| 17 | Data ważności | RRMMDD |
Numer partii ma zmienną długość, więc jeśli po nim następuje kolejne pole, kończy go znak FNC1. Kolejność pól na etykiecie ma zatem znaczenie dla odczytu. Zasady kodowania opisuje strona o kodach kreskowych w magazynie.
Reguła: numer partii i datę ważności zapisuje się na etykiecie w tej samej operacji, w której powstaje ilość towaru. Dopisywanie ich później, z pamięci albo z papierowej notatki, kończy się partią bez daty.
Kontrola wprowadzanej daty
Data odczytana z etykiety dostawcy jest daną wejściową, którą system sprawdza przed zapisem. Na kolektorze odrzuca się datę wcześniejszą niż dzisiejsza oraz taką, która zostawia mniej dni trwałości, niż dopuszcza umowa z dostawcą. Ta sama kontrola działa po stronie bazy jako ograniczenie, które chroni dane także przy imporcie z pliku albo z innego systemu.
ALTER TABLE dbo.ProductionLot
ADD CONSTRAINT CK_ProductionLot_Expiry
CHECK (ExpiryDate > ProductionDate);
Ograniczenie CHECK odrzuca wiersz, w którym data ważności nie jest późniejsza od daty produkcji. Wyłapuje najczęstszy błąd ręcznego wpisu, czyli zamianę miejscami dnia i miesiąca w jednej z dat.
Zasady wydawania towaru a kolejność partii
Kolejność wydawania partii jest decyzją, którą system podejmuje przy każdym dokumencie WZ. FIFO wydaje najpierw partię przyjętą najwcześniej, FEFO partię o najkrótszym terminie ważności, a LIFO partię przyjętą ostatnio.
| Zasada | Kryterium wyboru | Kiedy się sprawdza | Ryzyko |
|---|---|---|---|
| FIFO | Data przyjęcia | Towar o stałej trwałości i wycena rozchodu | Partia przyjęta później może wygasnąć wcześniej |
| FEFO | Data ważności | Żywność i leki z terminem | Wymaga daty przy każdej partii |
| LIFO | Najnowsza partia | Wyjątkowo, gdy fizycznie dostępna jest tylko ostatnia paleta | Starsze partie przeterminowują się w głębi regału |
| Wydanie doraźne | Wygoda magazyniera | Brak zasady | Nieprzewidywalna rotacja i straty |
Reguła: FIFO i FEFO dają inny wynik, gdy partia przyjęta później ma krótszy termin. O kolejności wydań decyduje wtedy data ważności, a nie data przyjęcia.
Zapytanie wybierające partię do wydania
Zapytanie FEFO sortuje dostępne partie rosnąco według daty ważności. Pomija partie zablokowane oraz te, które wygasłyby przed dotarciem towaru do odbiorcy. Parametr @MinShelfLifeDays przenosi wymagany zapas terminu.
SELECT TOP (5)
s.LotNo, s.LocationCode, s.QtyAvailable, s.ExpiryDate
FROM dbo.StockLot AS s
WHERE s.ItemCode = @ItemCode
AND s.QtyAvailable > 0
AND s.LotStatus = 'RELEASED'
AND s.ExpiryDate >= DATEADD(DAY, @MinShelfLifeDays, CAST(GETDATE() AS date))
ORDER BY s.ExpiryDate ASC, s.ReceivedAt ASC;
Drugie kryterium sortowania rozstrzyga remis między partiami o tym samym terminie. Składnię klauzuli ORDER BY opisuje dokumentacja Microsoft, a indeks po dacie ważności skraca sortowanie przy dużej liczbie partii.
Minimalny okres trwałości u odbiorcy
Część odbiorców wymaga, aby towar dotarł z zapasem terminu, na przykład z połową okresu trwałości. Wartość zapisuje się przy odbiorcy albo przy indeksie i przekazuje do zapytania jako parametr. Partia, która wygaśnie przed upływem tego okresu, nie trafia na zamówienie tego klienta, ale pozostaje dostępna dla innych.
Rezerwacja partii przy pracy wielu magazynierów
Dwóch magazynierów kompletujących różne zamówienia może wskazać tę samą partię. Blokada wiersza rozwiązuje tę kolizję: wskazówki tabelowe UPDLOCK i READPAST sprawiają, że drugi proces pomija wiersz zablokowany przez pierwszy i bierze następną partię w kolejności FEFO.
BEGIN TRANSACTION;
DECLARE @LotId int;
SELECT TOP (1) @LotId = s.LotId
FROM dbo.StockLot AS s WITH (UPDLOCK, READPAST, ROWLOCK)
WHERE s.ItemCode = @ItemCode
AND s.QtyAvailable >= @Qty
AND s.LotStatus = 'RELEASED'
ORDER BY s.ExpiryDate, s.ReceivedAt;
IF @LotId IS NULL
BEGIN
ROLLBACK TRANSACTION;
RETURN;
END
UPDATE dbo.StockLot
SET QtyAvailable = QtyAvailable - @Qty,
QtyReserved = QtyReserved + @Qty
WHERE LotId = @LotId;
COMMIT TRANSACTION;
Gdy żadna pojedyncza partia nie pokrywa zamówionej ilości, program dzieli wydanie na dwie partie w kolejności FEFO. Każda z nich dostaje osobną pozycję dokumentu WZ z własnym numerem partii.

Statusy partii i blokada jakościowa
Partia ma status niezależny od daty ważności. Partia świeża może być zablokowana, bo kontrola jakości wykryła wadę, a partia bliska terminu nadal zwolniona do wydania. Status ogranicza wydania w zapytaniu, a nie na hali, więc magazynier nie musi pamiętać, które partie wolno brać. Model poniżej jest przykładowy: statusy ustala proces jakości każdej firmy.
| Status | Czy wolno wydać | Typowa przyczyna |
|---|---|---|
| Kwarantanna | Nie | Oczekiwanie na wynik badania po produkcji albo przyjęciu |
| Zwolniona | Tak | Poprawny wynik kontroli |
| Zablokowana | Nie | Wada wykryta przez kontrolę jakości albo reklamację |
| Wycofana | Nie | Decyzja o wycofaniu partii z rynku |
| Przeterminowana | Nie | Upłynęła data ważności |
Zasady kontroli w procesie wytwarzania omawia strona o kontroli jakości w systemie produkcyjnym. System nie zmienia statusu sam, dopóki nie dostanie wyniku z tej kontroli.
Partia po upływie terminu przechodzi na status przeterminowanej bez udziału magazyniera. Robi to zadanie nocne, które zmienia status partii z dodatnim stanem, jeśli data ważności jest wcześniejsza niż bieżąca. Towar przeterminowany pozostaje na stanie do chwili utylizacji, którą dokumentuje osobny dokument rozchodu z numerem i datą.
Zbliżający się termin i alerty
Partie o zbliżającym się terminie wykrywa zapytanie uruchamiane cyklicznie, na przykład zadaniem SQL Agent. Wynik trafia do osób odpowiedzialnych za sprzedaż i magazyn, co pozwala sprzedać albo przesunąć towar, zanim wygaśnie. W opisie Studio WMS.net odpowiednie osoby są informowane o zbliżającej się dacie ważności.
SELECT s.ItemCode, s.LotNo, s.ExpiryDate,
DATEDIFF(DAY, CAST(GETDATE() AS date), s.ExpiryDate) AS DaysLeft,
s.QtyOnHand
FROM dbo.StockLot AS s
WHERE s.QtyOnHand > 0
AND s.ExpiryDate <= DATEADD(DAY, 30, CAST(GETDATE() AS date))
ORDER BY s.ExpiryDate;
CREATE NONCLUSTERED INDEX IX_StockLot_Expiry
ON dbo.StockLot (ExpiryDate)
INCLUDE (ItemCode, LotNo, QtyOnHand)
WHERE QtyOnHand > 0;
Indeks filtrowany obejmuje tylko partie z zapasem na stanie, więc pozostaje mały mimo rosnącej historii partii wyprzedanych. Jego składnię opisuje dokumentacja indeksów filtrowanych.
Identyfikowalność i wycofanie partii z rynku
Identyfikowalność oznacza możliwość przejścia w obie strony: od partii wyrobu do jej surowców oraz od partii do odbiorców. Pierwszy kierunek obsługuje ewidencja zużycia materiałów na zleceniu, drugi dokumenty wydań z numerem partii. Mechanizm po stronie systemu ERP opisuje tekst o śledzeniu partii produktów w HermesSQL, a kontrolę terminów tekst o terminach ważności w HermesSQL.
| Kierunek | Pytanie | Dokumenty źródłowe |
|---|---|---|
| Wstecz | Z jakich surowców powstała partia | Rozchód materiałów na zleceniu, przyjęcia PZ z numerem partii dostawcy |
| Naprzód | Którzy odbiorcy dostali partię | Dokumenty WZ z numerem partii |
| Na stanie | Gdzie leży reszta partii | Lokalizacje i ilości w magazynie |
Zapytanie o odbiorców partii
Wycofanie zaczyna się od pytania, gdzie trafiła partia. Zapytanie łączy pozycje dokumentów wydania z ich nagłówkami i grupuje ilości według odbiorcy.
SELECT d.CustomerCode, d.DocNo, d.IssueDate, SUM(l.Qty) AS QtyIssued
FROM dbo.IssueLine AS l
JOIN dbo.IssueDoc AS d ON d.DocId = l.DocId
WHERE l.LotNo = @LotNo
AND l.ItemCode = @ItemCode
GROUP BY d.CustomerCode, d.DocNo, d.IssueDate
ORDER BY d.IssueDate;
Reguła: przy wycofaniu najpierw blokuje się partię w magazynie, a dopiero potem sporządza listę odbiorców. Kolejność odwrotna zostawia okno, w którym magazyn wydaje partię, o której już wiadomo, że jest wadliwa.
Zgłoszenia od klientów łączą się z partią przez numer z etykiety. Reklamacja jakościowa, która wskazuje numer partii, pozwala policzyć skargi na jedną serię, a zależność między reklamacjami a jakością omawia tekst o zarządzaniu reklamacjami a jakością produktów.
Zwrot towaru od odbiorcy też niesie numer partii. Wraca on do magazynu ze statusem kwarantanny, a nie na stan dostępny, dopóki kontrola nie oceni opakowania i nie potwierdzi, że data ważności pozwala na dalszą sprzedaż. Bez tej reguły zwrócona paleta trafia na regał i zostaje wydana jako pełnowartościowa.
Ewidencja partii w programie magazynowym
Ewidencja partii działa dla indeksów, które mają ją włączoną w kartotece. Dla pozostałych system nie pyta o partię, więc magazynier nie skanuje zbędnych pól. Atrybuty „wymaga partii” i „wymaga daty ważności” są pierwszym ustawieniem przy zakładaniu kartoteki, co omawia strona o kartotekach w systemie WMS.
W opisie Studio WMS.net ewidencja terminów ważności pozwala tworzyć dokumenty wydań tak, aby magazynier pobierał towar o najkrótszym terminie, a w magazynie zostawały partie niewygasające. Odczyt partii z etykiety odbywa się na kolektorze, co opisuje strona o programie magazynowym ze skanerem. Dokumenty, na których zapisują się partie, omawia tekst o dokumentach magazynowych.
Inwentaryzacja w rozbiciu na partie
Przy spisie liczy się ilość osobno dla każdej partii, a nie tylko dla indeksu. Różnica na poziomie indeksu równa zeru może ukrywać zamianę dwóch partii: jedna ma nadwyżkę, druga niedobór o tę samą wartość. To błąd terminu, a nie ilości, i wychodzi na jaw dopiero przy wydaniu, gdy magazynier bierze z regału partię o innej dacie, niż wskazał system.
Zestawienie różnic pokazuje więc partie ze znakiem plus i minus obok siebie. Rozliczenie takiej pary polega na korekcie lokalizacji partii, a nie na dokumencie przychodu i rozchodu, bo ilość na stanie się zgadza.
Ewidencję po stronie samego magazynu opisuje tekst o partiach produkcyjnych w ewidencji magazynowej WMS, a wymagania towarów o krótkim terminie tekst o logistyce w branży spożywczej. Funkcje magazynowe można obejrzeć w demo systemu magazynowego, a opis produktu znajduje się na stronie Studio WMS.net.




