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.

Pracownica magazynu z tabletem w dłoni przy regale, na ekranie widać kafelki z zadaniami
Ten sam system obsługuje stanowisko biurowe w przeglądarce i pracę z tabletem lub kolektorem przy regale.

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.

Wysokie regały z paletami owiniętymi folią i wózek widłowy w alejce magazynu wysokiego składowania
W wysokim magazynie błąd adresu lokalizacji kosztuje więcej niż w niskim, bo szukanie palety wymaga podnośnika.

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 plikuPole w bazieReguła kontroli
IndeksSymbol towaru w kartoteceNiepusty, bez duplikatów w pliku, bez spacji na końcu
IlośćIlość w jednostce podstawowejLiczba dodatnia, separator dziesiętny zgodny z ustawieniem
JednostkaJednostka miaryWartość ze słownika jednostek
LokalizacjaAdres składowaniaIstnieje 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.

SytuacjaCzęstośćGłówne ryzyko
Migracja początkowa kartotek i stanówJednorazowo, przy wdrożeniuDuplikaty indeksów i niespójne jednostki miary
Aktualizacja cennika lub kartoteki dostawcyCo tydzień albo co miesiącZmiana układu kolumn w pliku bez uprzedzenia
Lista dostawy od kontrahentaCodziennieBłę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.