Skip to content

Naprawa ujemnych stanów wartościowych

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):

Text Only
1
2
3
4
5
6
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.

Text Only
1
2
3
4
5
6
7
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.

Text Only
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.

Text Only
DECLARE @initialSourceLineID UNIQUEIDENTIFIER = '7FE8D43D-DF17-8589-9DB3-019B6E1C1227'

--===================================================================================================================

select * from document.documentLine where initialIncomeSourceLineID = @initialSourceLineID order by addDate

DECLARE @correctionDocumentLineID UNIQUEIDENTIFIER
DECLARE @correctionDocumentID UNIQUEIDENTIFIER
DECLARE @lastRwLineID UNIQUEIDENTIFIER
DECLARE @newValue DECIMAL(18, 2)
DECLARE @itemID UNIQUEIDENTIFIER

SELECT TOP 1 @correctionDocumentLineID = documentLineID, @itemID = itemID,
@correctionDocumentID = documentID
FROM document.documentLine where initialIncomeSourceLineID = @initialSourceLineID order by addDate DESC

SELECT TOP 1 @lastRwLineID = documentLineID FROM document.documentLine where initialIncomeSourceLineID = @initialSourceLineID and documentLineID <> @correctionDocumentLineID order by addDate DESC

select @newValue = sum(isnull(cordl.sign, dl.sign) * dl.sysItemValue)
FROM [document].[documentLine] dl
LEFT JOIN document.documentLine cordl ON dl.initialSourceDocumentLineId = cordl.documentLineID and dl.isCorrectiveLine = 1
where dl.initialIncomeSourceLineID = @initialSourceLineID and dl.documentLineID <> @correctionDocumentLineID and dl.[status] >= 0

select @correctionDocumentLineID, @lastRwLineID, @newValue, @itemID

update document.documentLine set itemQuantity = 0, itemQuantityLeft = 0, correctedItemQuantity = 0,
sysItemValue = @newValue, sysItemValueLeft = (-1.00) * @newValue, correctedItemValue = @newValue, itemValue = @newValue, itemValueLeft = (-1.00) * @newValue, 
sysCorrectedItemValueQcorrExcluded = @newValue
where documentLineID = @correctionDocumentLineID

update document.documentLine set itemQuantityLeft = itemQuantity, correctedItemQuantity = itemQuantity, itemValueLeft = itemValue, sysItemValueLeft = sysItemValue, correctedItemValue = itemValue + @newValue
where documentLineID = @lastRwLineID

EXEC [document].[documentLine_updateDocument] @documentID = @correctionDocumentID

EXEC [wms].[stockBalanceFix] @itemID = @itemID

select * from document.documentLine where initialIncomeSourceLineID = @initialSourceLineID order by addDate