Conta de subtração com resultados errados.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

Olá,

tenho uma procedure que, em determinado ponto, atualiza um campo com o resultado da subtração do valor de um campo pelo valor de outro campo.

O problema é que em varias linhas do resultado final, o valor está correto, mas em outras varias, a subtração foi feita errada... e o pior é que eu não consigo chegar no valor errado para identificar a fonte do problema...

o trecho do código é este:

Selecionar tudo

--ATUALIZAÇÃO DO VALOR A PAGAR

update TABELA1
set VALOR_A_PAGAR = NVL(VALOR_TOTAL,0) - NVL(VALOR_PAGO, 0);
commit;
Por exemplo:
a linha do codigo 10 tem valor total de 66,3285, valor pago 0 e valor a pagar 66,3285. este resultado está correto.

Mas...

a linha do codigo 30 tem valor total de 24014,0755, valor pago 16514 e o valor a pagar 9411,3255. o resultado está errado, pois o valor a pagar deveria ser 7500,0755. o pior que a diferença de
Codigo VALOR_TOTAL VALOR_PAGO VALOR_A_PAGAR valor excel diferença de -1911,25 eu não consigo encontrar...

alguém já viu esta situação onde a conta não sai como deveria?

Muito obrigado.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Joaoluizbt

Esquisito o seu problema ...

Teria dois pontos para você refletir:

1) Os campos VALOR_A_PAGAR, VALOR_TOTAL e VALOR_PAGO pertencem todos à mesma tabela (TABELA1)?

2) Quando você executa sua procedure, ela seria o UNICA processo a fazer update nesta tabela? Fico pensando se eventualmente - depois do UPDATE da coluna VALOR_A_PAGAR - esta tabela possa sofrer atualização nos campos VALOR_TOTAL ou VALOR_PAGO. Resumindo: Esta tabela está sujeita a sofrer atualizações (UPDATES) dos usuários? Neste caso, talvez fosse interessante você criar uma trigger que atualizasse o campo VALOR_A_PAGAR em caso de UPDATES nas colunas VALOR_TOTAL ou VALOR_PAGO. Esta trigger também seria disparada no INSERT de registros na TABELA1.

3) O que quero dizer no ponto 2 é que esta tabela pode estar sofrendo concorrência de vários usuários do banco de dados, que atualizam a tabela e inserem dados na mesma. Neste caso sua procedure não seria a melhor solução, e recomendaria criar a trigger descrita anteriormente;

Talvez os foristas possam ter outro ponto de vista a respeito deste problema.

Abraços,

Sergio Coutinho
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

Olá stcoutinho,

vamos às respostas:

1- sim, os três campos são da mesma tabela.

2- sim, este é o único processo (procedure) que atualiza esta tabela. Não, esta tabela não é utilizada para atualização por usuários. Na verdade é bem linear a procedure, primeiro ele calcula o valor total, depois calcula o valor pago e depois subtrai e calcula o valor a pagar.

3- Entendi seu ponto. mas não há concorrencia de usuários. mesmo assim a trigger seria uma boa opção?


Muito obrigado pela atenção.
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

Olá stcoutinho,

vamos às respostas:

1- sim, os três campos são da mesma tabela.

2- sim, este é o único processo (procedure) que atualiza esta tabela. Não, esta tabela não é utilizada para atualização por usuários. Na verdade é bem linear a procedure, primeiro ele calcula o valor total, depois calcula o valor pago e depois subtrai e calcula o valor a pagar.

3- Entendi seu ponto. mas não há concorrencia de usuários. mesmo assim a trigger seria uma boa opção?


Muito obrigado pela atenção.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Joaoluizbt,

Não me recordo de ter me deparado ou lido sobre o oracle calcular errado " às vezes", mas pode ser que outro forista tenha um ponto de vista ou experiência diferente sobre o tema.

Uma observação: não vejo necessidade de se manter um campo na tabela que seja resultado de subtração de dois campos da mesma tabela. Creio que você poderia obter este valor em tempo real nos SELECTs ..

Mas pode ser que você tenha herdado a base de dados desta maneira, não é?

Então, eu acho que valeria a pena montar uma trigger para ver se o problema é resolvido.

Talvez outro forista possa apresentar uma sugestão diferente para este problema.

Abraços,

Sergio Coutinho

"calculos errados de vez em quando"
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

tenta assim jovem

Selecionar tudo

update TABELA1
set VALOR_A_PAGAR = (NVL(VALOR_TOTAL,0) - NVL(VALOR_PAGO, 0));
commit; 
marcus.kobel
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qui, 12 Mai 2011 4:54 pm
Localização: Porto Alegre - RS

Cara, o teu UPDATE não tem WHERE por que tu não botou ou foi por que ele não tem mesmo?
Se não tiver... ele está atualizando toda a tabela o tempo inteiro... isso é bem incomum.
Mas fora isso, o fato de o Oracle estar atualizando com valores errados é mais improvável ainda.
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

Pois é....

coloquei para rodar de novo... e pasmem... fez o calculo certo... e eu nem modifiquei o código... vou esperar até a proxima conta errada....

muito estranho...

o meu update não tem where mesmo... ele atualiza todas as linhas.

valeu pela força galera,

até mais.
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

Pois é....

coloquei para rodar de novo... e pasmem... fez o calculo certo... e eu nem modifiquei o código... vou esperar até a proxima conta errada....

muito estranho...

o meu update não tem where mesmo... ele atualiza todas as linhas.

valeu pela força galera,

até mais.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes