Fórum tamanho de casas decimais em sql #294914

08/09/2005

0

Oi, Uso Delphi 6 e Firebird 1.5

Tem como eu limitar o tamanho de casas decimais dentro de uma sql, para uma conta feita dentro dela.
O problema é o seguinte:

Preciso achar as comissoes que estejam ultrapassando o valor de 15¬, para isso eu tenho que dividir o valor total da nota pelo valor total da comissao que está gravada. Fiz a seguinte SQL.

Select * from Parcelas a, MovProdutos b,
CadTipoDocumentos c, CadCli_Forn d
where a.CodMovProduto = b.CodMovProdutos
and b.CodCliente = d.CodCli_Forn
and a.codfilial = ´1´
and a.CodFilial = b.CodFilial
and b.CodTipoDocumento = c.CodTipoDocumento
and c.AtualFinanceiro = ´S´
and c.AtualEstoque = ´S´
and c.CodNatureza = ´4´
AND b.totalcom > ´0´
and (b.totalcom / b.valortotal) > ´0.15´

A principio funciona mas deve ter alguma nota no meio que estoure o tamanho de casas decimais suportado pelo numeric e me dá o seguinte erro

Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.

Verifique e nao tem nenhuma divisao por zero entao imaginei que fosse o numeric overflow que em tese indicaria numero maior que a variavel pudesse demonstar.

Alguem sabe como fazer essa limitaçãoi na sql, ou tem alguma outra ideia de como fazer isso.

Agradeço antecipadamente qualquer ajuda

Sandro


Salupe

Salupe

Responder

Posts

09/09/2005

Rjun

Você pode garantir que b.ValorTotal nunca será igual a zero? Por que você esta comparando um número entre ´´?


Responder

Gostei + 0

09/09/2005

Salupe

Já tinha colocado isso no sql tambem e mesmo assim nao funcionou e deu a mesma mensagem de erro.


Responder

Gostei + 0

09/09/2005

Rjun

Continuo com minhas perguntas. [b:ff2b93102f]Você pode garantir que b.ValorTotal nunca vai ser zero?[/b:ff2b93102f]

SELECT * 
FROM 
  Parcelas a, 
  MovProdutos b, 
  CadTipoDocumentos c, 
  CadCli_Forn d 
WHERE 
  a.CodMovProduto = b.CodMovProdutos AND
  b.CodCliente = d.CodCli_Forn AND
  a.codfilial = 1 AND
  a.CodFilial = b.CodFilial AND
  b.CodTipoDocumento = c.CodTipoDocumento AND
  c.AtualFinanceiro = ´S´ AND
  c.AtualEstoque = ´S´ AND
  c.CodNatureza = 4 AND
  b.totalcom > 0 AND
  (b.totalcom / b.valortotal) > 0.15 



Responder

Gostei + 0

09/09/2005

Salupe

Eu já tinha colocado o sql assim :
SELECT *
FROM
Parcelas a,
MovProdutos b,
CadTipoDocumentos c,
CadCli_Forn d
WHERE
a.CodMovProduto = b.CodMovProdutos AND
b.CodCliente = d.CodCli_Forn AND
a.codfilial = 1 AND
a.CodFilial = b.CodFilial AND
b.CodTipoDocumento = c.CodTipoDocumento AND
c.AtualFinanceiro = ´S´ AND
c.AtualEstoque = ´S´ AND
c.CodNatureza = 4 AND
b.totalcom > 0 AND
b.ValorTotal > 0 and
(b.totalcom / b.valortotal) > 0.15

e continuou da mesma forma, mas de qualquer forma eu já olhei todos os registros do arquivo e nenhum deles está com o valortotal < 0 ou nulo.


Responder

Gostei + 0

09/09/2005

Ehvasc

Saudações,


Uma coisa que pode estar acontecendo é a geração de um plano cartesiano do resultado :
pode ser que alguma das junções feitas retornem nulo algum dos campos
(ja que vc está usando * sem especificar de qual tabela vc quer que retornem todos os campos.
Isso implica que todos os campos de todas as tabelas retornaram). Se acontecer
de de algum relacionamento desses que vc criou furar, retornará uma coluna
nula e pode estar causando o erro.
Sugiro usar um left outer join ou right outer join para a consulta que vc quer.
Pelo observado existem junções que não estão sendo filtradas o que leva a se ter
quase certeza da geração de um plano cartesiano.

Espero te ajudado.
Boa Sorte e até a próxima.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar