Transakcja dpinw_insert.aspx wykorzystywana w programie Studio magazyn WMS.net służy do wygenerowania arkusza inwentaryzacyjnego.
Opis działania
Po wywołaniu transakcji zostanie wyświetlone okno

Inwentaryzacja może zostać wygenerowana dla wybranego magazynu, dla wskazanej lokalizacji, wybranego asortymentu lub kontrahenta. W zależności od wybranego rodzaju inwentaryzacji zostanie wyświetlone okno z wyborem stosownej informacji. W przypadku inwentaryzacji wg kontrahenta zostanie wyświetlone okno jak poniżej

Co ważne w polu Kontrahent należy wskazać kontrahenta, dla którego chcemy dokonać spisu z natury. Po wskazaniu kontrahenta należy uruchomić przycisk ZAPISZ, by arkusz został wygenerowany. Przed wygenerowaniem arkusza system dokona kontroli, czy wszystkie dokumenty skojarzone z wybranym kontrahentem są zatwierdzone (nie ma dokumentów w buforze). Jeżeli weryfikacja przebiegnie pomyślnie zostanie wygenerowany arkusz, co zostanie potwierdzone komunikatem:

Kartoteki lokalizacji, które występują w arkuszu zostają zablokowane, by nie można było na nich dokonywać obrotów. Lokalizacje zostaną ponownie odblokowane po zamknięciu arkusza inwentaryzacji.
Uruchomienie
Transakcję wywołujemy bez wskazywania dodatkowych parametrów, a więc np. studiosystemdemo.softwarestudio.com.pl/role_wms/dpinw_insert.aspx
Transakcja dpinw_insert.aspx
Poniższy opis przedstawia mechanizm działania rozwiązania, które umożliwia generowanie arkusza inwentaryzacyjnego oraz zapis wyników do bazy danych. Rozwiązanie składa się z części klienta – napisanej w JavaScript z użyciem jQuery – oraz części serwerowej w technologii ASP.NET (C#). Poniżej przedstawiono szczegółowy opis poszczególnych etapów działania systemu.
1. Inicjalizacja i pobieranie danych sesji
JavaScript – $(document).ready
oraz DocumentReady()
- Inicjalizacja zmiennych
Na początku definiowane są zmienne globalne, takie jakcRodzaj
,ssSessionId
,gcRefno
,cZrodloUser
icUserRole
, które będą wykorzystywane w trakcie działania aplikacji. - Pobranie identyfikatora sesji i referencyjnego numeru dokumentu
Po załadowaniu dokumentu wywoływana jest funkcjaDocumentReady()
. W tej funkcji zmiennessSessionId
orazgcRefno
są inicjowane na podstawie wartości przekazanych przez serwer (przez tablicęssVar
). - Weryfikacja danych użytkownika
Funkcja wywołuje metodęssDataSQL
(prawdopodobnie abstrakcję umożliwiającą wykonanie zapytania SQL), aby pobrać dane użytkownika. Jeżeli dane nie zostaną znalezione, użytkownik otrzymuje komunikat o braku danych, a dalsze wykonywanie funkcji zostaje przerwane. - Ustalenie roli użytkownika
Po pobraniu danych użytkownika, zmiennacUserRole
jest ustawiana. W przypadku, gdy użytkownik posiada rolę „SuperVisor”, zmienna ta przyjmuje dodatkową wartość z polaSUPERVISOR
. - Konfiguracja interfejsu
Następnie wykonywana jest funkcjassTlumaczenie()
, która prawdopodobnie odpowiada za tłumaczenie elementów interfejsu użytkownika. Początkowo ukrywane są przyciski akcji, a widoczny zostaje główny kontener formularza.
2. Generowanie arkusza inwentaryzacyjnego
Funkcja ThisArkusz(cTypInw)
- Wybór rodzaju inwentaryzacji
FunkcjaThisArkusz
przyjmuje jako parametr typ arkusza (cTypInw
), który może przyjmować wartości:"mag"
– arkusz dla wybranego magazynu,"lok"
– arkusz dla lokalizacji magazynowej,"aso"
– arkusz dla asortymentu,"ktr"
– arkusz dla kontrahenta.
- Dynamiczne generowanie formularza
Na podstawie wybranego typu, formularz jest budowany dynamicznie w zmiennejcTekst
. W zależności od typu arkusza, w formularzu wyświetlane są odpowiednie nagłówki oraz informacje o oddziale, magazynie lub innych parametrach użytkownika. - Wstawienie kontrolki wyboru
Dla każdego typu arkusza generowany jest element kontrolki (WebComboFly), skonfigurowany do pobierania danych z odpowiedniego źródła (np. dane magazynowe, lokalizacyjne, asortymentowe lub kontrahentów). Warto zauważyć, że kontrolki te wspierają mechanizm wyszukiwania (placeholder: „wpisz 2 znaki, aby wyszukać”), co ułatwia odnalezienie odpowiedniej pozycji w dużym zbiorze danych. - Konfiguracja kontrolek
Po wstawieniu formularza do DOM, wszystkie elementy oznaczone klasąWebComboFly
są konfigurowane przy użyciu funkcjiKonfigurujjqxComboFly
, co umożliwia ich poprawne działanie (np. inicjalizację kontrolki jQWidgets).
3. Zapis arkusza inwentaryzacyjnego
Funkcja btnZapisz()
- Walidacja formularza
Przed wykonaniem zapisu, wykonywana jest walidacja formularza przy użyciu funkcjiJqxTestWypelnienia
, która sprawdza, czy wszystkie wymagane pola zostały uzupełnione. - Pobranie wybranej wartości
Z kontrolki wyboru (identyfikowanej przez#ssID
) pobierana jest wartość, która reprezentuje identyfikator wybranej pozycji (np. numer magazynu lub identyfikator lokalizacji). - Wywołanie metody serwerowej
Następnie, przy użyciu mechanizmu PageMethods, wywoływana jest metoda serwerowaSaveForm
, przekazując identyfikator sesji, numer referencyjny, wybraną wartość oraz rodzaj arkusza. W trakcie zapisu wyświetlany jest komunikat z animacją oczekiwania (preloader). - Obsługa wyniku
Po wykonaniu operacji na serwerze, funkcjaThisSuccessAdd
interpretuje wynik. W zależności od zwróconej treści (czy zawiera komunikat o błędzie czy potwierdzenie poprawnego wykonania operacji), użytkownik otrzymuje odpowiedni komunikat:- W przypadku błędu – komunikat informujący o problemie oraz ilości pozycji blokujących zapis.
- W przypadku sukcesu – informację o poprawnym przygotowaniu arkusza inwentaryzacyjnego i zablokowaniu lokalizacji.
4. Logika serwerowa (C# ASP.NET)
Inicjalizacja strony (dpinw_insert.aspx.cs
)
- Inicjalizacja parametrów
W metodziePage_Load
, przy pierwszym wywołaniu strony (nie jest to postback), generowany jest unikalny numer referencyjny (gcRefno
) oraz identyfikator sesji (ssSessionId
). Dodatkowo, z danych użytkownika (przechowywanych w sesji) pobierane są informacje takie jak oddział, magazyn, numer MPK, rola systemowa oraz nazwa użytkownika. - Utworzenie sesji
Utworzony jest słownik z parametrami, który jest zapisywany w sesji – pozwala to na późniejszą weryfikację zgodności sesji przy zapisie arkusza.
Metoda SaveForm
- Weryfikacja sesji
Metoda statycznaSaveForm
pobiera parametry sesji oraz dane użytkownika, weryfikując zgodność przekazanego numeru referencyjnego z danymi zapisanymi w sesji. W przypadku niezgodności, metoda zwraca komunikat o błędzie. - Wywołanie zapisu arkusza
W zależności od przekazanego rodzaju arkusza (cRodzaj
), wykonywana jest metodaZapiszInwenture
, która realizuje główną logikę zapisu danych.
Metoda ZapiszInwenture
- Sprawdzenie blokady dokumentów
Na początku wykonywane są zapytania do bazy danych w celu sprawdzenia, czy dla wybranego magazynu, lokalizacji, asortymentu lub kontrahenta nie istnieją już dokumenty w buforze (poleACH
równe0
). Jeśli takie dokumenty występują, zapis arkusza zostaje zablokowany, a użytkownik otrzymuje komunikat wraz z informacją o liczbie pozycji. - Pobranie danych inwentaryzacyjnych
W zależności od rodzaju inwentaryzacji, konstruowane jest zapytanie SQL do procedury lub widokuwms_inwentura
, które pobiera dane niezbędne do sporządzenia arkusza. - Iteracyjne wstawianie danych
Dla każdego wiersza danych pobranych z bazy wykonywana jest iteracyjna operacja wstawiania (INSERT) do odpowiedniej tabeli (np.dpinw
). Każdy rekord wstawiany jest przy użyciu parametrów SQL, które są dynamicznie aktualizowane dla poszczególnych pozycji. Numeracja pozycji oraz stronicowanie (przy zwiększaniu numeru strony po przekroczeniu 14 pozycji) są realizowane wewnątrz pętli. - Blokada lokalizacji i asortymentu
Po wykonaniu wstawień wykonywane są aktualizacje (UPDATE) w tabelach magazynowych, lokalizacyjnych i asortymentowych, które blokują dalsze operacje na tych rekordach (ustawienie polaACH
na odpowiednią wartość). - Rejestracja w historii
Na zakończenie operacji wykonywane jest wstawienie rekordu do tabeli_HISTORIA
, co pozwala na zachowanie informacji o utworzeniu nowego arkusza inwentaryzacyjnego oraz liczbie pozycji. - Obsługa wyjątków
Cały proces wstawiania danych opakowany jest w bloktry-catch
. W przypadku wystąpienia błędu, wykonywana jest procedura logowania błędów, a metoda zwraca komunikat o niepowodzeniu operacji.
Podsumowanie
Przedstawiony kod realizuje kompleksowy proces przygotowania arkusza inwentaryzacyjnego, łącząc interaktywność po stronie klienta (dynamiczne generowanie formularza, walidacja, komunikacja AJAX) z zaawansowaną logiką serwerową odpowiedzialną za pobieranie danych, walidację stanu magazynu oraz wstawianie rekordów do bazy danych. Mechanizm ten gwarantuje, że operacja zostanie przeprowadzona tylko wtedy, gdy nie występują blokady wynikające z dokumentów w buforze, a wszystkie operacje zapisu są odpowiednio rejestrowane, co umożliwia śledzenie aktywności użytkowników.
Skrypt dpinw_insert.js
1. Inicjalizacja i wczytywanie strony
Po załadowaniu dokumentu przeglądarki funkcja $(document).ready()
wywołuje metodę DocumentReady()
. Skrypt natychmiast pobiera dane sesji oraz przygotowuje interfejs do dalszych operacji. Na początku kod przypisuje wartości z tablicy ssVar
do zmiennych globalnych ssSessionId
oraz gcRefno
, dzięki czemu system uzyskuje unikalny identyfikator sesji oraz numer referencyjny umożliwiający dalszą komunikację z serwerem.
2. Weryfikacja danych użytkownika
Następnie skrypt wykonuje zapytanie do bazy danych za pomocą funkcji ssDataSQL
, które pobiera dane użytkownika i zapisuje je w zmiennej cZrodloUser
. Jeżeli długość otrzymanej tablicy wynosi 0, skrypt wyświetla komunikat alert o braku danych użytkownika i przerywa dalsze wykonywanie funkcji. Następnie kod przypisuje wartość pola ROLA
do zmiennej cUserRole
i, jeśli rola wynosi „SuperVisor”, zmienia ją na wartość pola SUPERVISOR
. Po ustaleniu roli kod wywołuje funkcję ssTlumaczenie()
, która aktualizuje elementy interfejsu zgodnie z ustawionym językiem, a następnie ukrywa elementy oznaczone klasą mybutton
i wyświetla główny kontener formularza o identyfikatorze Container
.
3. Generowanie formularza arkusza inwentaryzacyjnego
Funkcja ThisArkusz(cTypInw)
uruchamia się po wybraniu przez użytkownika jednego z typów inwentaryzacji. Kod przypisuje wartość parametru cTypInw
do zmiennej globalnej cRodzaj
i ukrywa element odpowiadający wyborowi rodzaju inwentaryzacji (rowRodzajInw
). Następnie system wyświetla przyciski akcji. Skrypt buduje zmienną cTekst
, w której krok po kroku dodaje elementy HTML. W zależności od wybranego typu (np. "mag"
, "lok"
, "aso"
lub "ktr"
) kod dodaje odpowiedni nagłówek oraz informację o oddziale, a dla typów innych niż magazyn dodaje także informację o magazynie. Dzięki temu użytkownik otrzymuje przejrzysty formularz odpowiadający wybranemu rodzajowi inwentaryzacji.
W dalszej części system wstawia kontrolkę WebComboFly
, która umożliwia wybór pozycji (np. magazynu, lokalizacji, asortymentu lub kontrahenta). System przypisuje kontrolce odpowiednie atrybuty, takie jak szerokość, identyfikator danych (data-ssUID
) oraz parametry wyszukiwania (ssplaceholder
). Po wstawieniu dynamicznego formularza kod konfiguruje wszystkie elementy oznaczone klasą WebComboFly
przy użyciu funkcji KonfigurujjqxComboFly()
, co zapewnia poprawne działanie kontrolki i gotowość interfejsu do interakcji.
4. Zapis arkusza inwentaryzacyjnego
Funkcja btnZapisz()
odpowiada za zapis przygotowanego arkusza. Skrypt najpierw przeprowadza walidację formularza, wywołując funkcję JqxTestWypelnienia
z odpowiednimi parametrami, aby upewnić się, że wszystkie wymagane pola zostały uzupełnione. Następnie kod pobiera wartość kontrolki wyboru za pomocą metody jqxComboBox('val')
, co ustala identyfikator wybranej pozycji. Po tym system wyświetla komunikat z animacją oczekiwania i wywołuje metodę PageMethods.SaveForm()
, przekazując identyfikator sesji, numer referencyjny, wybraną wartość oraz rodzaj arkusza. Dzięki temu system komunikuje się z serwerem i przekazuje dane do dalszego przetwarzania.
5. Obsługa wyniku zapisu
Funkcja ThisSuccessAdd(wynik)
reaguje na odpowiedź zwróconą przez serwer. Jeśli wynik zawiera treść komunikatu, kod generuje pole komunikatu o ważnym komunikacie, wyświetlając informację o błędzie oraz przycisk umożliwiający anulowanie operacji. Jeśli wynik nie zawiera komunikatu, system generuje komunikat potwierdzający przygotowanie arkusza i informuje użytkownika o zablokowaniu lokalizacji. Na końcu funkcji kod wywołuje metodę ssTlumaczenie()
, która aktualizuje treści interfejsu w zależności od ustawionego języka.
Podsumowanie
Skrypt dpinw_insert.js
inicjuje interfejs, weryfikuje dane użytkownika oraz dynamicznie generuje formularz arkusza inwentaryzacyjnego. Następnie system przeprowadza walidację danych, pobiera wybraną pozycję i wysyła dane do serwera przy użyciu metody PageMethods.SaveForm()
. Ostatecznie system wyświetla komunikat o wyniku operacji, informując użytkownika o powodzeniu lub błędzie. Dzięki zastosowaniu słów łączących zdania oraz strony czynnej, opis przedstawia przejrzysty i spójny mechanizm działania, który zapewnia bezpieczeństwo i poprawność wykonywanych operacji.
Czytaj więcej:
Usunięcie inwentaryzacji – jqs_dpinw_delete.js
Skrypt wykorzystywany w programie WMS.net umożliwiający użytkownikowi na usunięcie dokumentu inwentaryzacji, który znajduje się w buforze.
dpinw_zamknij.aspx
Transakcja dpinw_zamknij.aspx wykorzystywana w programie Studio Magazyn WMS.net służy do zamknięcia arkusza inwentaryzacji oraz wygenerowania dokumentów różnic inwentaryzacyjnych.
dpmag_insert_mxj.aspx
Transakcja dpmag_insert_mxj.aspx wykorzystywana jest w programie Studio Magazyn WMS.net do dopisania dokumentu tworzenia palety mix. Opis dzialania Po wywołaniu transakcji dpmag_insert_mxj.aspx wyświetlone zostanie okno dopisania dokumentu: W polu asortyment należy wskazać rodzaj przesuwanego towaru. Wyszukiwanie w polu ułatwi funkcja filtrowania. Po wpisaniu w polu ciągu dowolnych znaków lista zostanie zawężona do rekordów zawierających wpisane znaki. W polu Lokalizacja
jqs_dpinw_insert
Skrypt jqs_dpinw_insert.js realizuje kompleksowy proces dopisywania inwentaryzacji. Na początku inicjuje i konfiguruje interfejs, pobiera dane użytkownika oraz generuje dynamiczny formularz na podstawie wybranego rodzaju inwentaryzacji. Następnie system aktywnie waliduje dane, sprawdza istnienie dokumentów w buforze oraz weryfikuje, czy dana inwentaryzacja nie została już wcześniej dopisana.
jqs_dpinw_zamknij
Skrypt jqs_dpinw_zamknij.js realizuje kompleksowy proces zamykania inwentaryzacji. Na początku dynamicznie generuje interfejs, wyświetlając dane inwentaryzacji, takie jak numer i data. Następnie skrypt sprawdza, czy inwentaryzacja zawiera pozycje bez bilansu otwarcia, co może blokować zamknięcie.