Я использую этот код для обновления количества товаров на складе за день до (вчера). Это работает, но очень медленно.
Каждый день система генерирует около 50 000+ строк, каждая из которых предназначена для адреса (позиции) на складе.
Таким образом, курсор получает каждый адрес, а затем ищет количество за день до этого, затем обновляет.
Пример:
Адрес 01B134010 от 08.04.2009 г. имел количество 500
Адрес 01B134010 от 09.04.2009 г. имел количество 450
Итак, когда код запускается, он обновляет столбец "DIF_DIA" с -50
Сегодня я запустил код, и только для одного браха (47k + строк) это заняло более 1 часа.
Есть ли лучший / более быстрый способ сделать это?
DECLARE @ARMAZEM VARCHAR(2),
@FILIAL VARCHAR(3),
@CLIENTE VARCHAR(6),
@GRPESTOQUE VARCHAR(6),
@DATA AS VARCHAR(8),
@ENDERECO as VARCHAR(30),
@DIFERENCA AS FLOAT
-- reinicia variaveis
SET @armazem = ''
SET @FILIAL = ''
SET @CLIENTE = ''
SET @GRPESTOQUE = ''
SET @DATA = ''
SET @ENDERECO = ''
SET @DIFERENCA = ''
DECLARE CUR_UPD_DIF_DIA CURSOR FOR
SELECT CODIGO_ARMAZEM,
CODIGO_FILIAL,
CODIGO_CLIENTE,
GRP_EST_COD,
DATA_SALDO,
CODIGO_ENDERECO
FROM WMS_OCUPACAO_ARMAZEM_DETALHE_V2_ESTATICO
WHERE DATA_SALDO >= '20190401'
and CODIGO_FILIAL = '106'
AND DIF_DIA IS NULL
FOR UPDATE OF DIF_DIA
OPEN CUR_UPD_DIF_DIA
FETCH NEXT FROM CUR_UPD_DIF_DIA INTO @ARMAZEM,
@FILIAL,
@CLIENTE,
@GRPESTOQUE,
@DATA,
@ENDERECO
WHILE @@FETCH_STATUS = 0
BEGIN
-- pega a quantidade deste endereço ontem
SELECT @DIFERENCA = IsNull(QUANTIDADE_PALLET,0)
FROM WMS_OCUPACAO_ARMAZEM_DETALHE_V2_ESTATICO T1
WHERE T1.DATA_SALDO = dateadd(day, -1 , @DATA)
AND T1.GRP_EST_COD = @GRPESTOQUE
AND T1.CODIGO_CLIENTE = @CLIENTE
AND T1.CODIGO_ARMAZEM = @ARMAZEM
AND T1.CODIGO_ENDERECO = @ENDERECO
AND T1.CODIGO_FILIAL = @FILIAL
-- e atualiza o endereço na data de hoje, tendo o valor da DIF_DIA a quantidade atual - a quantidade de ontem, assim, tem a diferença.
-- se positivo, incrementou o endereço. Se negativo, diminuiu do endereço. Válido, na prática, somente para BLOCADO pois PP sempre terá apenas "1" de quantidade
UPDATE WMS_OCUPACAO_ARMAZEM_DETALHE_V2_ESTATICO
SET DIF_DIA = (QUANTIDADE_PALLET - @DIFERENCA)
WHERE CURRENT OF CUR_UPD_DIF_DIA
SET @DIFERENCA = 0
FETCH NEXT FROM CUR_UPD_DIF_DIA INTO @ARMAZEM,
@FILIAL,
@CLIENTE,
@GRPESTOQUE,
@DATA, @ENDERECO
END
CLOSE CUR_UPD_DIF_DIA
DEALLOCATE CUR_UPD_DIF_DIA