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.
Spis treści
- Konfiguracja czy programowanie
- Parametry, które zastępują kod
- Procedura składowana z obsługą błędów
- Technologie rozszerzeń
- Terminale Android i tryb online
- Integracje z ERP i partnerami
- Kalendarz, kartoteki i raporty jako osobne obszary
- Skrypty zmian i wycofanie
- Testowanie zmian przed wdrożeniem
- Pytania i odpowiedzi o programowanie magazynowe
- Glosariusz pojęć z programowania magazynowego
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.
| Potrzeba | Konfiguracja | Programowanie |
|---|---|---|
| Układ menu i ulubione | tak, per konto użytkownika | niepotrzebne |
| Scenariusz dyspozycji magazynowej | tak, dowolna liczba typów | tylko przy nietypowej logice |
| Szablon etykiety | tak, edytor z tokenami danych | tylko dla nowych pól |
| Nowy kanał do ERP albo EDI | zależy od kanału | zwykle tak, interfejs i mapowanie |
| Nowy dokument z własnymi regułami | w ograniczonym zakresie | zwykle 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.
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.
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.
- Menu ULUBIONE. Lista transakcji przypisana do konta, widoczna po zalogowaniu na dowolnym komputerze.
- Typy dyspozycji. Scenariusze magazynowe dopasowane do rzeczywistego przepływu pracy.
- Role i uprawnienia. Zestaw funkcji dostępnych dla grupy użytkowników.
- Szablony wydruków. Układ etykiety lub dokumentu bez zmiany procedur.
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.
- XACT_ABORT ON. Błąd wykonania przerywa transakcję, więc połowa zapisu nie zostaje w bazie.
- THROW. Błąd wraca do aplikacji, która pokazuje operatorowi komunikat zamiast cichego niepowodzenia.
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.
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.
- Powtórzenie operacji. Ten sam skan wysłany dwa razy nie zmienia stanu dwukrotnie.
- Błąd w środku transakcji. Po wycofaniu stan i historia ruchów pozostają zgodne.
- Dwie sesje naraz. Dwa terminale nie przydzielają tej samej lokalizacji.
- Plan wykonania. Zapytanie na dużej tabeli używa indeksu, a nie przegląda całej tabeli.
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.