Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

andregv

Otimizar Procedure

Recommended Posts

Tenho duas procedures que dão entrada e saida de estoque... uma quando fecha uma nota e outra quando essa nota é excluída do sistema... ambas estão funcionando muito bem... só gostaria de saber se alguém tem sugestões para otimizar as suas execuções.--> Procedure para fechamento de NotaALTER PROCEDURE dbo.SP_MOVIMENTACAO_FECHAR @idMovimentacao INTAS BEGIN TRANSACTION MOV_CLS SET NOCOUNT ON CREATE TABLE #TMP (idCol INT IDENTITY, idProduto INT, ItemQuantidade REAL, ItemValorTotal MONEY) DECLARE @TMP_VALOR_MOVIMENTO SMALLMONEY, @VALOR_ITENS SMALLMONEY DECLARE @TMP INT, @TMP_ITEM INT, @TMP_ID INT, @TMP_ESTOQUE REAL, @TMP_VALORTOTAL MONEY SELECT @TMP_VALOR_MOVIMENTO = ValorTotal FROM dbo.MOVIMENTACOES WHERE idMovimentacao = @idMovimentacao SELECT @VALOR_ITENS = SUM(ItemValorTotal) FROM dbo.MOVIMENTACOES_PRODUTOS WHERE idMovimentacao = @idMovimentacao IF @TMP_VALOR_MOVIMENTO = @VALOR_ITENS BEGIN SELECT @TMP = COUNT(idItem) FROM MOVIMENTACOES_PRODUTOS WHERE idMovimentacao=@idMovimentacao INSERT #TMP SELECT idProduto, ItemQuantidade, ItemValorTotal FROM dbo.MOVIMENTACOES_PRODUTOS WHERE idMovimentacao = @idMovimentacao WHILE @TMP > 0 BEGIN SELECT @TMP_ITEM = idCol, @TMP_ID = idProduto, @TMP_ESTOQUE = ItemQuantidade, @TMP_VALORTOTAL = ItemValorTotal FROM #TMP DELETE FROM #TMP WHERE idCol = @TMP_ITEM UPDATE dbo.PRODUTOS SET ProdutoEstoque = ProdutoEstoque + @TMP_ESTOQUE, ProdutoTotal = ProdutoTotal + @TMP_ESTOQUE, ProdutoValorTotal = ProdutoValorTotal + @TMP_VALORTOTAL WHERE idProduto = @TMP_ID SELECT @TMP = @TMP - 1 END UPDATE MOVIMENTACOES SET MovimentacaoStatus=0 WHERE idMovimentacao = @idMovimentacao END SET NOCOUNT OFF IF @@ERROR <> 0 BEGIN ROLLBACK TRANSACTION MOV_CLS RETURN END COMMIT TRANSACTION MOV_CLSGO--> Procedure de Excluir do Sistema (tem que dar estorno na entrada)ALTER PROCEDURE dbo.SP_MOVIMENTACAO_DEL @idMovimentacao INTAS BEGIN TRANSACTION MOV_DEL SET NOCOUNT ON CREATE TABLE #TMP (idCol INT IDENTITY, idProduto INT, ItemQuantidade REAL, ItemValorTotal MONEY) DECLARE @TMP TINYINT, @TMP_ITEM INT, @TMP_ID INT, @TMP_ESTOQUE REAL, @TMP_VALORTOTAL MONEY SELECT @TMP = COUNT(idItem) FROM MOVIMENTACOES_PRODUTOS WHERE idMovimentacao=@idMovimentacao INSERT #TMP SELECT idProduto, ItemQuantidade, ItemValorTotal FROM dbo.MOVIMENTACOES_PRODUTOS WHERE idMovimentacao = @idMovimentacao WHILE @TMP > 0 BEGIN SELECT @TMP_ITEM = idCol, @TMP_ID = idProduto, @TMP_ESTOQUE = ItemQuantidade, @TMP_VALORTOTAL = ItemValorTotal FROM #TMP DELETE FROM #TMP WHERE idCol = @TMP_ITEM UPDATE dbo.PRODUTOS SET ProdutoEstoque = ProdutoEstoque - @TMP_ESTOQUE, ProdutoTotal = ProdutoTotal - @TMP_ESTOQUE, ProdutoValorTotal = ProdutoValorTotal - @TMP_VALORTOTAL WHERE idProduto = @TMP_ID SELECT @TMP = @TMP - 1 END DELETE FROM MOVIMENTACOES_PRODUTOS WHERE idMovimentacao=@idMovimentacao DELETE FROM MOVIMENTACOES WHERE idMovimentacao=@idMovimentacao SET NOCOUNT OFF IF @@ERROR <> 0 BEGIN ROLLBACK TRANSACTION MOV_DEL RETURN END COMMIT TRANSACTION MOV_DELGO-- FinalAgradeço desde já

Compartilhar este post


Link para o post
Compartilhar em outros sites

andregv,Uma sugestão seria tirar os loops e tentar colocar os updates, insert's e delete direto com inner join.. em alguns casos fiz isso e agilizout+

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.