Wyszukiwanie partii/dostawy, na której występuje ujemny stan wartościowy przy zerowym lub dodatnim stanie ilościowym
Problem:
Na zestawieniu stanów magazynowych mogą występować indeksy, dla których stan wartościowy jest ujemny, natomiast stan ilościowy jest zerowy lub dodatni.
Systuacja wynika z nieprawidłowej wartości na ostatnim dokumencie rozchodowym dla partii/dostawy.
Do wyszukania konkretnej partii użyteczne jest poniższe zapytanie, w którym należy podstawić odpowiedni itemID (ID indeksu magazynowego):
select dl.initialIncomeSourceLineID, sum(dl.sign * dl.itemQuantity) itemQuantity, sum(isnull(cordl.sign, dl.sign) * dl.sysItemValue) itemValue
FROM [document].[documentLine] dl
LEFT JOIN document.documentLine cordl ON dl.initialSourceDocumentLineId = cordl.documentLineID and dl.isCorrectiveLine = 1
where dl.itemID = 'd2cd4dc2-52a1-e911-80d8-9c8e994dc647' and dl.[status] >= 0
--and dl.locationID = '8B33A6DD-310E-489A-AE94-43B996A70A23'
group by dl.initialIncomeSourceLineID
Zapytanie zwraca sumy ilości i wartość na wszystkich partiach dla danego indeksu.
Umożliwia wyszukania partii, na których wartość jest ujemna.
Po odszukaniu takiej parii, można podstawić jej id pod zapytanie i wyszukać wszystkie dokumenty z danej partii w kolejności ich wastawiania zapytaniem.
SELECT dl.*, d.documentType, d.documentFullNR, dl.sign, dl.initialIncomeSourceLineID, dl.sysItemValue, dl.itemPrice, dl.itemQuantity, d.warehouseID
FROM [document].[documentLine] dl
LEFT JOIN [document].[document] d on d.documentID = dl.documentID
where dl.itemID = 'd2cd4dc2-52a1-e911-80d8-9c8e994dc647' -- id indeksu magazynowego
and dl.[status] = 1
and dl.initialIncomeSourceLineID = '88D056CA-11A8-EF11-80FA-9C8E994DC647' -- id partii/dostawy z poprzedniego zapytania
order by addDate
W większości przypadków powodem jest to, że na ostatnim dokumencie rozchodowym jest zby duża wartość, niż wynikająca z iloczynu ilości i wartości.
Poprawienie danych na istniejącym dokumencie
Jeżeli dokument został wystawiony w danym miesiącu kalendarzowym i istnieje możliwość poprawienia wartości na nim, to można to wykonać poniższym skryptem, podstawiając numer linii dokumentu oraz wartość, która powinna znaleźć się na dokumencie:
UWAGA !!! Poprawiany dokument musi być ostatnim dokumentem rozchodowym z danej partii.
DECLARE @documentLineID UNIQUEIDENTIFIER = '0FCAB088-9CA9-F011-80FF-9C8E994DC647' --ID pozycji dokumentu
DECLARE @newValue DECIMAL(18,2) = 35.80 --Nowa wartość na pozycji dokumentu
--===============================================================================
DECLARE @documentID UNIQUEIDENTIFIER
DECLARE @itemID UNIQUEIDENTIFIER
SELECT TOP 1 @documentID = documentID, @itemID = itemID FROM document.documentLine WHERE documentLineID = @documentLineID
update document.documentLine
set sysItemValue = @newValue,
sysItemValueLeft = @newValue,
correctedItemValue = @newValue,
itemValue = @newValue,
itemValueLeft = @newValue
where documentLineID = @documentLineID
EXEC [document].[documentLine_updateDocument] @documentID = @documentID
EXEC [wms].[stockBalanceFix] @itemID = @itemID
Wystawienie korekty dokumentu
W przypadku, gdy nie jest możliwe poprawienie wartości na dokumencie, istnieje możliwość "półręcznego" wystawienia korekty dokumentu.
UWAGA! Błędny dokument rozchodowy musi być ostatnim dokumentem z partii/dostawy. W przeciwnym wypadku aplikacja nie pozwoli zatwierdzić korekty, a skrypt nie zadziała prawidłowo. W skrypcie nie ma sprawdzania poprawności parametrów wejściowych.
Najpierw należy wystawić w aplikacji dokument korekty do pozycji danego dokumentu rozchodowego (dla danego indeksu) na dowolną ilość.
Następnie należy ZATWIERDZIĆ DOKUMENT KOREKTY!
W ostatniej kolejności należy wykonać skrypt, podstawiając w parametrze wejściowym odpowiedni ID dostawy z zapytania wyszukującego dostawy.
Wszystkie wartości powinny zostać poprawione automatycznie.
Skrypt pokazuje wartości przed poprawieniem, poprawiane i po poprawie. Przed zmaknięciem okna skryptu warto sprawdzić, czy poprawione wartości są zgodne z oczekiwaniami.