Kartoteki i stany początkowe większość firm ma już w arkuszu. Zanim system magazynowy zacznie pracować, dane trzeba przenieść do bazy, a później utrzymywać wymianę z systemem handlowym oraz z kontrahentami. Jakość tego przeniesienia wpływa na pracę magazynu bardziej niż liczba funkcji na liście ofertowej.
Ten tekst opisuje dostęp do systemu przez przeglądarkę i kolektor Android oraz import danych z Excela do WMS wraz z walidacją i interfejsami. Osobno omawia wymagania magazynu wysokiego składowania wobec danych. Ogólne wprowadzenie do klasy systemów daje strona o Warehouse Management System, a produkt opisuje serwis magazyn.softwarestudio.com.pl.
Dostęp online do systemu WMS przez przeglądarkę i kolektor
System magazynowy dostępny online działa na jednej bazie danych, do której łączą się dwa rodzaje klientów. Pierwszy to przeglądarka internetowa na stanowisku biurowym, drugi to aplikacja na kolektorze danych z systemem Android. Obie strony zapisują do tych samych tabel, więc dokument utworzony w biurze jest widoczny na hali w chwili zapisu.
Zmienia się przede wszystkim miejsce pracy, a nie zasada. Użytkownik loguje się z dowolnego urządzenia z dostępem do Internetu i wykonuje operacje w zakresie swoich uprawnień. Nie instaluje programu i nie aktualizuje go lokalnie, bo zmiany wersji wdraża się na serwerze. Zasady dostępu zdalnego opisuje tekst o programie magazynowym online.
Przeglądarka w pracy biurowej
Przeglądarka obsługuje ekrany z gęstym układem danych, na przykład kartoteki i dokumenty. Cienki klient przenosi logikę na serwer, więc stacja robocza nie wymaga mocnego sprzętu, a każda operacja przechodzi przez tę samą warstwę walidacji. Model opisuje strona o programie internetowym WWW jako cienkim kliencie.
Kolektor Android w pracy na hali
Kolektor służy do potwierdzania skanem przyjęć i pobrań. Okno aplikacji jest zaprojektowane pod jedną czynność, a kod kreskowy zastępuje wpisywanie. Dobór urządzeń i konfigurację omawia strona o aplikacji magazynowej na Androida.

Magazyn wysokiego składowania a wymagania wobec danych
Magazyn wysokiego składowania potrzebuje innej funkcjonalności niż standardowy księgowy program magazynowy. Ewidencja obejmuje numery seryjne, a rozmieszczenie zapasów zależy od rotacji towaru. Firmy logistyczne dodatkowo wyceniają usługi magazynowe, aby obciążyć klienta fakturą. Każda z tych funkcji opiera się na danych, które trzeba poprawnie wprowadzić na starcie.
Adres lokalizacji w takim magazynie ma kilka składowych. Zapis w formacie STREFA-RZĄD-KOLUMNA-POZIOM, na przykład A-02-05-3, pozwala kierować operatora do konkretnej komórki regału. Import słownika lokalizacji z arkusza wymaga więc czterech kolumn i kontroli, że żaden adres się nie powtarza. Praktykę pracy na wysokich regałach opisuje strona o aplikacji dla magazynów wysokiego składowania.

Numery seryjne w kartotece
Ewidencja według numerów seryjnych oznacza, że system zna każdą sztukę z osobna, a nie tylko jej ilość w lokalizacji. Kartoteka musi więc mieć znacznik, że towar podlega takiej ewidencji, a import stanów początkowych dostarcza listę numerów przypisanych do lokalizacji. Ilość w wierszu pliku musi zgadzać się z liczbą numerów, bo inaczej stan i lista rozjadą się od pierwszego dnia.
Reguła: dla towaru z numerami seryjnymi import stanu odrzuca wiersz, w którym liczba numerów różni się od ilości.
Wycena usług magazynowych
Operator logistyczny rozlicza klienta za zajętą powierzchnię oraz usługi dodatkowe. Cennik trafia do systemu tym samym torem co kartoteki: przez plik i walidację. Stawka zaimportowana z błędnym separatorem dziesiętnym zaniża albo zawyża fakturę w każdym okresie rozliczeniowym, aż ktoś to zauważy.
Import słownika lokalizacji
Słownik lokalizacji przychodzi zwykle z arkusza, w którym adres zapisano jednym ciągiem. System potrzebuje jednak osobnych pól, bo po nich sortuje trasy i grupuje strefy. Rozbicie adresu w tabeli pośredniej wykonuje jedno zapytanie, a wiersz o innej liczbie segmentów niż cztery trafia do raportu błędów.
-- adres w formacie STREFA-RZĄD-KOLUMNA-POZIOM, np. A-02-05-3
SELECT Adres,
PARSENAME(REPLACE(Adres, '-', '.'), 4) AS Strefa,
PARSENAME(REPLACE(Adres, '-', '.'), 3) AS Rzad,
PARSENAME(REPLACE(Adres, '-', '.'), 2) AS Kolumna,
PARSENAME(REPLACE(Adres, '-', '.'), 1) AS Poziom
FROM dbo.ImportLokalizacja_Staging
WHERE PlikId = @PlikId;
Funkcja PARSENAME dzieli ciąg po kropce i obsługuje najwyżej cztery segmenty, co w tym układzie wystarcza. Adres z pięcioma segmentami albo z pustym poziomem zwraca NULL, więc kontrola nie wymaga osobnego wyrażenia regularnego. Po rozbiciu sprawdza się jeszcze unikalność pełnego adresu w pliku i w słowniku.
Import danych z Excela do WMS - jak przebiega transakcja
Transakcja importu z pliku XLS pobiera dane z arkusza Microsoft Excel i zapisuje je w tabelach bazy SQL programu StudioSystem. Jej działanie opiera się na schematach importu skonfigurowanych wcześniej. Programy SoftwareStudio korzystają standardowo z bazy Microsoft SQL Server, dzięki czemu w trakcie wdrożenia i w codziennej eksploatacji dane można szybko uzupełnić lub zaktualizować.
Poniżej opisano mechanizm ogólny, taki jak w każdym rzetelnym imporcie z arkusza. To wiedza inżynierska, a nie specyfikacja konkretnego ekranu, więc nazwy tabel w przykładach są umowne. Ładowanie kartotek z arkusza opisuje też strona o migracji z Excela do programu magazynowego.
Schemat importu i mapowanie kolumn
Schemat importu wiąże kolumny pliku z polami bazy i określa reguły dla każdej z nich. Opłaca się go zapisać raz dla danego dostawcy albo typu pliku, bo ręczne mapowanie przy każdym pliku szybko zniechęca użytkowników.
| Kolumna pliku | Pole w bazie | Reguła kontroli |
|---|---|---|
| Indeks | Symbol towaru w kartotece | Niepusty, bez duplikatów w pliku, bez spacji na końcu |
| Ilość | Ilość w jednostce podstawowej | Liczba dodatnia, separator dziesiętny zgodny z ustawieniem |
| Jednostka | Jednostka miary | Wartość ze słownika jednostek |
| Lokalizacja | Adres składowania | Istnieje w słowniku lokalizacji i nie jest zablokowana |
Tabela pośrednia i walidacja
Bezpieczny import nie zapisuje danych od razu do tabel produkcyjnych. Wiersze trafiają do tabeli pośredniej jako tekst, a dopiero potem przechodzą kontrolę typów i reguł. Zapis tekstowy jest celowy, bo pusta komórka i litera w polu liczbowym nie mogą przerwać wczytania całego pliku.
-- przykładowy schemat, nie rzeczywista struktura produktu
CREATE TABLE dbo.ImportTowar_Staging (
WierszId int IDENTITY(1,1) PRIMARY KEY,
PlikId int NOT NULL,
NumerWiersza int NOT NULL,
Indeks nvarchar(40) NULL,
Nazwa nvarchar(200) NULL,
IloscTekst nvarchar(30) NULL,
Jednostka nvarchar(10) NULL
);
-- kontrola ilości: zapis błędu z numerem wiersza pliku
INSERT INTO dbo.ImportBlad (PlikId, NumerWiersza, Kod, Opis)
SELECT s.PlikId, s.NumerWiersza, 'ILOSC', N'Ilość nie jest liczbą dodatnią'
FROM dbo.ImportTowar_Staging AS s
WHERE s.PlikId = @PlikId
AND ISNULL(TRY_CONVERT(decimal(18,3), REPLACE(s.IloscTekst, ',', '.')), 0) <= 0;
Funkcja TRY_CONVERT zwraca NULL zamiast błędu, gdy konwersja się nie powiedzie, dlatego jedno zapytanie oznacza wszystkie wiersze z nieprawidłową ilością. Zapis błędu z numerem wiersza pliku pozwala użytkownikowi poprawić arkusz w miejscu, a nie szukać pomyłki po całej tabeli.
Raport błędów przed zatwierdzeniem
Import w dwóch krokach daje użytkownikowi podgląd. Po wczytaniu system pokazuje liczbę wierszy poprawnych i odrzuconych oraz listę błędów z numerami wierszy. Zapis do tabel produkcyjnych następuje dopiero po zatwierdzeniu. Wiersze budzące wątpliwości, na przykład z nieznanym indeksem albo z ilością odbiegającą od typowej, warto oznaczać osobno, bo pomyłka wychwycona przed zapisem kosztuje minutę, a po zapisie godziny korekt.
Zapis danych w jednej transakcji
Przeniesienie zatwierdzonych wierszy do kartoteki wykonuje się w jednej transakcji. Instrukcja MERGE aktualizuje istniejące indeksy i dodaje nowe, a błąd w środku cofa całość, więc baza nigdy nie zostaje z połową pliku.
BEGIN TRY
BEGIN TRANSACTION;
MERGE dbo.Towar AS cel
USING (SELECT Indeks, Nazwa, Jednostka
FROM dbo.ImportTowar_Staging
WHERE PlikId = @PlikId) AS zrodlo
ON cel.Indeks = zrodlo.Indeks
WHEN MATCHED THEN
UPDATE SET cel.Nazwa = zrodlo.Nazwa,
cel.Jednostka = zrodlo.Jednostka
WHEN NOT MATCHED BY TARGET THEN
INSERT (Indeks, Nazwa, Jednostka)
VALUES (zrodlo.Indeks, zrodlo.Nazwa, zrodlo.Jednostka);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
Zapis wymaga braku duplikatów indeksu w pliku. Gdy źródło zawiera ten sam indeks dwa razy, instrukcja MERGE zgłasza próbę zmiany tego samego wiersza więcej niż raz i cofa transakcję. Kontrola duplikatów w tabeli pośredniej powinna więc poprzedzać zapis.
Reguła: stany początkowe wprowadza się jako zapis w historii ruchów, a nie przez bezpośrednią edycję tabeli stanów, bo historia musi zgadzać się ze stanem.
Dziennik importu i uprawnienia
Import zmienia dane, których dotyczą później dokumenty, więc zostawia ślad. Dziennik zapisuje nazwę pliku z sumą kontrolną oraz dane osoby i czas importu. Odnotowuje też liczbę wierszy przyjętych i odrzuconych. Dzięki temu po miesiącu da się ustalić, z którego pliku pochodzi dana wartość, a ten sam plik nie zostanie wczytany dwa razy.
Uprawnienie do importu przyznaje się osobno od uprawnienia do pracy na dokumentach. Osoba, która potrafi wgrać kartotekę, może też zmienić jednostki miary wszystkich towarów, dlatego ten zakres dostaje wąska grupa użytkowników.
Kiedy arkusz wystarcza jako format wymiany
Arkusz pozostaje najczęstszym formatem wymiany z mniejszymi kontrahentami. Import z pliku bywa więc funkcją używaną codziennie, a nie awaryjnie. Trzeba jednak odróżnić trzy sytuacje, bo każda ma inne wymagania wobec kontroli i częstości.
| Sytuacja | Częstość | Główne ryzyko |
|---|---|---|
| Migracja początkowa kartotek i stanów | Jednorazowo, przy wdrożeniu | Duplikaty indeksów i niespójne jednostki miary |
| Aktualizacja cennika lub kartoteki dostawcy | Co tydzień albo co miesiąc | Zmiana układu kolumn w pliku bez uprzedzenia |
| Lista dostawy od kontrahenta | Codziennie | Błędy ręcznego wypełniania i brak kontroli przed zapisem |
Format pliku ma znaczenie. XLS to starszy, binarny format programu Excel, a XLSX to archiwum plików XML, więc schemat przygotowany dla jednego z nich wymaga potwierdzenia, że drugi także jest obsługiwany. Komórki formatowane jako tekst i jako liczba zachowują się różnie: indeks 00123 zapisany jako liczba traci zera wiodące, a data zapisana jako tekst nie sortuje się chronologicznie. Te dwie pułapki odpowiadają za większość błędów w pierwszych plikach.
Przy większym wolumenie ręczne wgrywanie plików przestaje wystarczać. Wtedy zamiast arkusza stosuje się interfejs, którego mechanizmy opisano niżej.
Wymiana danych z otoczeniem przez interfejsy
System magazynowy rzadko pracuje samodzielnie. Odbiera zamówienia z systemu handlowego, zwraca potwierdzenia wydań i wymienia dane z przewoźnikami. Interfejs programistyczny pozwala robić to bez udziału człowieka, ale automat pozostawiony bez nadzoru potrafi powielić pomyłkę setki razy, więc ustala się, co dzieje się przy błędzie.
Dobrą praktyką jest kolejkowanie komunikatów z możliwością ponowienia. Chwilowa niedostępność jednego z systemów oznacza wtedy opóźnienie w przetworzeniu, a nie utratę zamówienia. Każdy komunikat niesie unikalny identyfikator, dzięki któremu odbiorca rozpoznaje ponowioną wiadomość i nie tworzy drugiego dokumentu.
{
"idKomunikatu": "7f3c1e52-0c9a-4b7e-9d0a-2b8f5e1a6c41",
"typ": "ZamowienieSprzedazy",
"numer": "ZS/2026/000123",
"pozycje": [
{ "indeks": "ABC-001", "gtin": "05901234123457", "ilosc": 24 }
]
}
Przykład jest umowny, ale pokazuje zasadę: identyfikator komunikatu odpowiada za idempotentność, a numer dokumentu i identyfikatory towaru za jego treść. Integracje z ERP opisano w tekście o integracji WMS z ERP przez REST i kolejki, a łączenie aplikacji internetowych strona integrowanie aplikacji webowych.
Standaryzacja identyfikacji towarów w wymianie z kontrahentami
Wymiana z większą liczbą partnerów działa sprawnie przy wspólnym języku. Oparcie identyfikacji towarów na standardach GS1 pozwala uniknąć osobnego słownika przeliczeń dla każdego kontrahenta. Indeks własny oraz indeks dostawcy powinny współistnieć w kartotece z numerem GTIN, a nie zastępować się nawzajem. Etykiety opisuje strona o etykiecie GS1.
Przy współpracy z sieciami handlowymi standard bywa wymogiem formalnym. Oczekiwania te warto sprawdzić na etapie wyboru systemu, bo dostosowanie po wdrożeniu jest droższe niż uwzględnienie ich w założeniach.
Raporty na zaimportowanych danych
Dane w bazie SQL Server są dostępne dla serwera raportów. Raporty zainstalowane na tym serwerze można udostępniać użytkownikom przez nadanie uprawnień i przyjaznych nazw, a menu zbudowane na tej podstawie pozwala nawigować wśród wybranych zestawień zamiast w zbędnych informacjach. Więcej na ten temat zawiera strona o SQL Report Builder i wydrukach RDL.
Kontrola po imporcie zamyka pętlę. Zestawienie liczby wierszy w pliku, w tabeli pośredniej i w kartotece powinno się zgadzać, a różnica musi mieć wyjaśnienie w raporcie błędów. Taka zgodność jest najprostszym dowodem, że migracja przebiegła bez utraty danych. Strukturę kartotek omawia strona o kartotekach magazynowych w WMS.net.




