| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
mfrade Visitante


Registrado em: Jan 08, 2006 Mensagens: 6 Localização: Brasil
|
Enviada: 17 Mar 2009 21:52 Assunto: Calculo de Estoque em Stored Procedure |
|
|
Estou desenvolvendo uma stored proc para efetuar o recalculo dos valores do estoque da minha empresa.
Preciso calculo o estoque dia a dia e atualizar os valores em uma tabela.
Exemplo
01/01 Produto X Entrada = 10 Saida = 5 Saldo = 5
02/02 Produto X Entrada = 0 Saida = 2 Saldo = 3
Assim por diante.
Tenho 12.000 itens e preciso efetuar para todos eles.
Atualmente estou utilizando Cursor para isso , mais a performance e muito ruim.
Alguem tem alguma sugestao para ganho de performance |
|
| Voltar ao Topo |
|
 |
lfbraz Doutor no assunto

![]()
Registrado em: Mar 26, 2007 Mensagens: 132 Localização: São Paulo/SP
|
Enviada: 18 Mar 2009 07:30 Assunto: |
|
|
Existem métodos de substituição de cursores por estruturas mais rápidas (com WHILE) caso ele seja realmente necessário. No entanto, talvez não seja necessário você correr linha a linha para este cálculo ...
Existem estes campos em uma tabela ( Data,Produto,Entrada,Saida,Saldo ) ??
O cálculo está sendo feito com base nos campos de uma só tabela ou são vários cálculos ? |
|
| Voltar ao Topo |
|
 |
mfrade Visitante


Registrado em: Jan 08, 2006 Mensagens: 6 Localização: Brasil
|
Enviada: 18 Mar 2009 10:20 Assunto: |
|
|
A estrutura da Tabela é:
produto
Data
entrada
saida
saldo = entrada - saida
saldo_acumulado - saldo_acumulado anterior - saldo do dia
Todos os calculos são efetuados em cima de uma unica tabela. |
|
| Voltar ao Topo |
|
 |
lfbraz Doutor no assunto

![]()
Registrado em: Mar 26, 2007 Mensagens: 132 Localização: São Paulo/SP
|
Enviada: 18 Mar 2009 10:26 Assunto: |
|
|
Então você pode simplesmente atualizar o campo que você quer fazendo tudo num unico comando :
Exemplo :
UPDATE Tabela SET saldo = entrada - saida ,
saldo_acumulado = saldo_acumulado anterior - saldo do dia
Para o Saldo Acumulado anterior você pode fazer no próprio Update uma subquery retornando o Saldo do dia anterior .... |
|
| Voltar ao Topo |
|
 |
joliveira PhD no assunto


Registrado em: Sep 12, 2005 Mensagens: 718 Localização: São José ods Campos/SP
|
Enviada: 18 Mar 2009 11:07 Assunto: |
|
|
| O seu saldo acumulado anterior seria o saldo referente à ultima data que o produto teve movimentação antrior a data atual? |
|
| Voltar ao Topo |
|
 |
mfrade Visitante


Registrado em: Jan 08, 2006 Mensagens: 6 Localização: Brasil
|
Enviada: 18 Mar 2009 12:13 Assunto: |
|
|
O processo atual esta sendo efetuado assim:
Calculo de uma unica vez o saldo do DIA
O Acumulado eu estou fazendo utilizando um cursor produto a produto. São 10.4000
Então eu pego um Produto , Vou no primeiro dia de vida dela e inicio o calculo do acumulado.
O Meu problema é como atualizar esse valor do acumulado . sendo que ele é calculo na hora . |
|
| Voltar ao Topo |
|
 |
joliveira PhD no assunto


Registrado em: Sep 12, 2005 Mensagens: 718 Localização: São José ods Campos/SP
|
Enviada: 18 Mar 2009 14:13 Assunto: |
|
|
| Voce pode usar Common Table Expression para calcular o saldo acumulado e fazer o update |
|
| Voltar ao Topo |
|
 |
mfrade Visitante


Registrado em: Jan 08, 2006 Mensagens: 6 Localização: Brasil
|
Enviada: 18 Mar 2009 16:41 Assunto: |
|
|
JOliveira , não conheço CTE
Pequisei no google e verifiquei que ela é para SQL 2005. O Meu é 2000. |
|
| Voltar ao Topo |
|
 |
mfrade Visitante


Registrado em: Jan 08, 2006 Mensagens: 6 Localização: Brasil
|
Enviada: 18 Mar 2009 21:26 Assunto: |
|
|
o que pode estar errado nesse comando:
Não esta alterando as informações
update A
set A.SALDO = A.Saldo_dia + ( select isnull(c.Saldo,0) from #Temp_estoque c where c.Dta_movimento = a.Dta_movimento -1 )
from #Temp_estoque A
where 1 = 1
AND Saldo_dia <> 0 |
|
| Voltar ao Topo |
|
 |
lfbraz Doutor no assunto

![]()
Registrado em: Mar 26, 2007 Mensagens: 132 Localização: São Paulo/SP
|
Enviada: 19 Mar 2009 08:28 Assunto: |
|
|
mfrade, este 1 = 1 não é necessário, você poderia tirar ...
Qto a data (campo Dta_movimento) ela esta em formato SMALLDATETIME (ou DATETIME) sem a informação das horas ? |
|
| Voltar ao Topo |
|
 |
mfrade Visitante


Registrado em: Jan 08, 2006 Mensagens: 6 Localização: Brasil
|
Enviada: 19 Mar 2009 17:53 Assunto: |
|
|
Os campos estão com Somente data
o comando esta asssim:
update A
set A.SALDO = A.Saldo_dia + ( select isnull(c.Saldo,0) from #Temp_estoque c
where convert(varchar(12),c.Dta_movimento,112) = convert(varchar(12),a.Dta_movimento -1,112) )
from #Temp_estoque A
where Saldo_dia <> 0
o resultado esta:
dta_movimento COD_LOJA COD_PRODUTO ENTRADAS Saidas Saldo_Dia SALDO
2009-03-02 00:00:00.000 3 00297189 72 61 11 34
2009-03-03 00:00:00.000 3 00297189 60 48 12 12
2009-03-04 00:00:00.000 3 00297189 60 36 24 24
o correto seria
dta_movimento COD_LOJA COD_PRODUTO ENTRADAS Saidas Saldo_Dia SALDO
2009-03-02 00:00:00.000 3 00297189 72 61 11 34
2009-03-03 00:00:00.000 3 00297189 60 48 12 34+12=46
2009-03-04 00:00:00.000 3 00297189 60 36 24 46+24=70
e assim por diante. O saldo tem que ser o saldo do anterior + saldo do Dia
Valeu mesmo pela força |
|
| Voltar ao Topo |
|
 |
lfbraz Doutor no assunto

![]()
Registrado em: Mar 26, 2007 Mensagens: 132 Localização: São Paulo/SP
|
Enviada: 20 Mar 2009 09:27 Assunto: |
|
|
Veja se é isto que você quer ...
update A
set A.SALDO = A.Saldo_dia +
( SELECT SUM(Saldo)
FROM #temp_estoque C
WHERE c.Dta_movimento < a.Dta_movimento
and c.cod_loja = a.cod_loja and c.cod_produto = a.cod_produto )
from #Temp_estoque A
where Saldo_dia <> 0 |
|
| Voltar ao Topo |
|
 |
|