tamanho de casas decimais em sql
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
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
Curtidas 0
Respostas
Rjun
08/09/2005
Você pode garantir que b.ValorTotal nunca será igual a zero? Por que você esta comparando um número entre ´´?
GOSTEI 0
Salupe
08/09/2005
Já tinha colocado isso no sql tambem e mesmo assim nao funcionou e deu a mesma mensagem de erro.
GOSTEI 0
Rjun
08/09/2005
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
GOSTEI 0
Salupe
08/09/2005
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.
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.
GOSTEI 0
Ehvasc
08/09/2005
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.
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.
GOSTEI 0