Programowanie magazynowe zaczyna się od pytania, czy zmiana wymaga kodu, czy wystarczy ustawienie. Studio WMS.net ma moduły i szablony, które pokrywają większość potrzeb bez programisty. Strona opisuje, gdzie kończy się konfiguracja i jak wygląda praca nad kodem, który musi znosić równoległe terminale i przerwane połączenia.

Konfiguracja czy programowanie

Standardowy program do obsługi magazynu rzadko pasuje do specyfiki firmy. Dlatego Studio WMS.net ma wiele sprawdzonych konfiguracji dla różnych scenariuszy użytkowania, a administrator dobiera typy dyspozycji i strefy bez zmiany kodu. Kod pojawia się dopiero tam, gdzie potrzebna jest nowa logika albo nowy kanał wymiany danych.

PotrzebaKonfiguracjaProgramowanie
Układ menu i ulubionetak, per konto użytkownikaniepotrzebne
Scenariusz dyspozycji magazynowejtak, dowolna liczba typówtylko przy nietypowej logice
Szablon etykietytak, edytor z tokenami danychtylko dla nowych pól
Nowy kanał do ERP albo EDIzależy od kanałuzwykle tak, interfejs i mapowanie
Nowy dokument z własnymi regułamiw ograniczonym zakresiezwykle tak, procedura i formularz

Zakres ustawień opisuje strona o konfiguracji programu magazynowego. Przy decyzji o kodzie pomaga prosta zasada: najpierw sprawdza się, czy konfiguracja pokrywa wymaganie, bo własny kod trzeba utrzymywać po każdej aktualizacji.

Parametry, które zastępują kod

Edytor szablonu etykiety pokazuje kod szablonu i wymiary etykiety w milimetrach. Są w nim też standard i rozdzielczość drukarki. Nad polem kodu leży zestaw tokenów danych, takich jak numer towaru i partia, które wstawia się w miejscu kursora. Dostępne są także numer nośnika i termin ważności. Nowa etykieta dla odbiorcy powstaje więc bez programisty.

Studio WMS.net - edytor szablonu etykiety w języku ZPL z listą tokenów danych i parametrami wydruku
Edytor szablonu ZPL - parametry etykiety, lista tokenów do wstawienia i kod źródłowy szablonu

Podobnie działa parser kodów. Separator pól określa, jaki znak czytnik przesyła w miejscu symbolu FNC1, a domyślnie jest to znak ASCII 29. Osobne ustawienie określa zachowanie parsera przy braku separatora, na przykład przy kodzie przepisanym ręcznie z wydruku. Tabela mapowania wiąże każdy identyfikator GS1 z kolumną bazy i jej typem.

Studio WMS.net - konfiguracja separatora FNC1, normalizacji dat oraz mapowania identyfikatorów GS1 na pola bazy
Ustawienia parsera - znak separatora przesyłany przez skaner, zachowanie przy jego braku i mapowanie AI na kolumny bazy

Projektowanie szablonów opisuje strona o etykietach ZPL. Kod trzeba pisać dopiero wtedy, gdy etykieta wymaga pola, którego baza nie przechowuje.

Co zostaje w rękach administratora

Część zmian nigdy nie powinna trafiać do programisty, bo kosztują wtedy więcej czasu niż wynika z ich wagi. Administrator ustawia je sam, a zmiana nie wymaga wdrożenia nowej wersji aplikacji ani okna serwisowego. Programista wchodzi do projektu dopiero wtedy, gdy lista poniżej przestaje wystarczać, i wtedy opisuje różnicę między stanem obecnym a potrzebnym.

Procedura składowana z obsługą błędów

Logika dokumentu, na przykład przyjęcie z aktualizacją stanu, dobrze mieści się w procedurze składowanej. Aplikacja wywołuje jedną procedurę, a baza wykonuje wszystkie zapisy w jednej transakcji. Poniższy przykład jest ilustracyjny i nie pokazuje kodu produktu. Wstawia paletę na stan i zapisuje ruch, a przy błędzie wycofuje obie zmiany.

CREATE PROCEDURE dbo.PrzyjmijPalete
    @PaletaId int, @LokalizacjaId int,
    @IndeksId int, @Ilosc decimal(18,3)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    BEGIN TRY
        BEGIN TRAN;
        INSERT dbo.StanyPalet (PaletaId, LokalizacjaId, IndeksId, Ilosc)
        VALUES (@PaletaId, @LokalizacjaId, @IndeksId, @Ilosc);
        INSERT dbo.RuchyMagazynowe (PaletaId, LokalizacjaId, TypRuchu, Ilosc, DataRuchu)
        VALUES (@PaletaId, @LokalizacjaId, 'PZ', @Ilosc, SYSDATETIME());
        COMMIT;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0 ROLLBACK;
        THROW;
    END CATCH
END;

Gdy klucz obcy odrzuci wartość LokalizacjaId, wyjątek przechodzi do bloku CATCH. Polecenie ROLLBACK wycofuje wtedy oba zapisy, a THROW zachowuje numer błędu i komunikat dla aplikacji. Opcja SET XACT_ABORT ON oznacza transakcję po błędzie wykonania jako niezatwierdzalną, więc w bloku CATCH pozostaje tylko wycofanie. Otwarta transakcja blokowałaby wiersze dla innych terminali, dlatego jej pozostawienie jest błędem.

Składnię opisuje dokumentacja CREATE PROCEDURE, a obsługę błędów dokumentacja TRY...CATCH.

Reguła: procedura, którą wywołuje terminal, musi znosić powtórzenie. Operator może zeskanować ten sam kod dwa razy albo ponowić operację po zerwaniu połączenia. Unikalne ograniczenie na PaletaId odrzuca drugi zapis, więc stan nie rośnie dwukrotnie.

Technologie rozszerzeń

Aplikacje internetowe SoftwareStudio powstają w technologii Microsoft ASP.net, a dane przechowuje Microsoft SQL Server. Interfejs w przeglądarce jest zgodny ze standardem HTML5 i CSS3, a skrypty korzystają z jQuery. Terminale pracują pod systemem Android, a zestawienia i wydruki generują usługi raportowe SQL Reporting Services.

Dokumentacja Studio WMS.net dotyczy wersji 64-bitowej z interfejsem WWW i modułami Android Mobile. Zakres funkcjonalny w dokumentacji jest obrazem możliwości systemu, a dostarczane rozwiązania różnią się zależnie od zakupionych i wdrożonych modułów. Przed zleceniem zmiany trzeba więc ustalić, który moduł już działa u klienta.

Terminale Android i tryb online

Aplikacja mobilna skanuje kody wbudowanym skanerem albo aparatem urządzenia i aktualizuje stany w chwili skanu. Pracuje w trybie online, więc terminal nie przechowuje własnej kopii danych. Programista musi zakładać, że połączenie przerwie się w środku operacji, i projektować zapisy jako atomowe.

Aplikacje na urządzenia mobilne pisze się według zasad platformy, które publikuje dokumentacja Android. Zasady pracy aplikacji w magazynie opisuje strona o WMS na Androidzie. Formularz na terminalu ma mniej pól niż jego odpowiednik w przeglądarce, a komunikat błędu wskazuje pole do poprawy.

Integracje z ERP i partnerami

System wymienia dane przez API i WebService z ERP, przez EDI z sieciami handlowymi i przez panel webowy z klientami. Kod integracji odpowiada za mapowanie pól i ponawianie po awarii. Osobno chroni przed duplikatami. Wywołanie synchroniczne wymaga, by obie strony działały jednocześnie, dlatego trwałe integracje opiera się na kolejce komunikatów w bazie.

Kanały i kolejkę z przykładem T-SQL opisuje strona o komunikacji z programem magazynowym. Programy dopasowane do procesu firmy, od aplikacji internetowych po reklamacje, opisuje strona o tworzeniu programów dla firm.

Efektywna kalkulacja zysku w logistyce - Studio WMS.net
Kalkulacja zysku: pełne koszty operacyjne zamiast samej ceny zakupu, na przykład z danych ruchów w bazie

Kalendarz, kartoteki i raporty jako osobne obszary

Nie każda zmiana dotyczy logiki magazynowej. Okna czasowe obsługuje aplikacja kalendarz, która wyznacza sloty dla dostawców i zmniejsza kolejki przed rampą. Kartoteki towarów z nazwą i zdjęciami opisuje strona o kartotekach magazynowych, a zestawienia strona o serwerze raportów.

Podział na osobne obszary skraca zmianę. Poprawka w raporcie nie dotyka procedury przyjęcia, a nowy slot w kalendarzu nie wymaga zmiany w kartotece. Każdy obszar ma własnego właściciela i własny zakres testów.

Skrypty zmian i wycofanie

Każdą zmianę w bazie zapisuje się jako skrypt z numerem i uruchamia w ustalonej kolejności. Skrypt, który zmienia procedurę, ma swój odpowiednik wycofujący, bo wdrożenie w środku zmiany magazynowej nie może zostawić bazy w stanie pośrednim. Aplikację i bazę wdraża się razem, żeby terminal nie wywoływał procedury o starej liczbie parametrów.

Testowanie zmian przed wdrożeniem

Zmianę w procedurze sprawdza się na kopii bazy, a nie na produkcji. Test obejmuje powtórzenie operacji, błąd w środku transakcji i równoległe wywołanie z dwóch sesji. Dopiero wynik zgodny we wszystkich trzech przypadkach przechodzi dalej.

Modułowa budowa pozwala wdrażać zmiany etapami. Firma płaci tylko za funkcje, z których korzysta, a nowe moduły dodaje się wraz ze wzrostem wymagań. Przykładem rozszerzenia jest automatyczny magazyn wysokiego składowania. Każdy nowy moduł przechodzi ten sam cykl testów co zmiana w procedurze, z kopią bazy i trzema przypadkami granicznymi.

Pytania i odpowiedzi o programowanie magazynowe

Nie. Menu, typy dyspozycji, strefy, uprawnienia i szablony etykiet ustawia administrator. Programista jest potrzebny przy nowej logice dokumentu, nowym kanale integracji albo polu, którego baza nie przechowuje.

Procedura wykonuje wszystkie zapisy w jednej transakcji i zwraca błąd do aplikacji. Przerwane połączenie terminala nie zostawia połowy dokumentu, a ta sama logika działa tak samo z każdego ekranu.

Powtórzenie wywołania, na przykład po zerwaniu połączenia lub drugim skanie. Unikalne ograniczenie na kluczu dokumentu odrzuca duplikat, więc stan nie rośnie dwukrotnie.

Studio WMS.net współpracuje z terminalem w trybie online, więc operacja zapisuje się w bazie w chwili potwierdzenia. Brak zasięgu Wi-Fi uniemożliwia zapis, dlatego pokrycie siecią sprawdza się przed wdrożeniem.

Na kopii bazy, z trzema przypadkami: powtórzenie operacji, błąd w środku transakcji i równoległe wywołanie z dwóch sesji. Plan wykonania pokazuje, czy zapytanie używa indeksu.

Glosariusz pojęć z programowania magazynowego

Programowanie magazynowe
Tworzenie i rozbudowa logiki systemu magazynowego: procedur, integracji i formularzy, tam gdzie nie wystarcza konfiguracja.
Procedura składowana
Nazwany zestaw instrukcji T-SQL zapisany w bazie, który aplikacja wywołuje jednym poleceniem.
Transakcja
Zestaw zapisów wykonywanych jako całość: wszystkie zostają zatwierdzone albo wszystkie wycofane.
TRY...CATCH
Konstrukcja T-SQL przechwytująca błąd wykonania i pozwalająca wycofać transakcję.
Token danych
Znacznik w szablonie etykiety, zastępowany podczas wydruku wartością pola, na przykład numerem partii.
FNC1
Symbol funkcyjny oddzielający pola o zmiennej długości w kodzie GS1-128, przesyłany przez czytnik jako znak separatora.
Idempotentność
Cecha operacji, której powtórzenie nie zmienia wyniku poza pierwszym wykonaniem.
Tryb online
Sposób pracy terminala, w którym każda operacja zapisuje się w bazie w chwili potwierdzenia, bez lokalnego bufora.

Warto przeczytać