GARANTIR DESCONTO

Fórum Estouro de Capacidade no Firebird 2.5 #560194

11/08/2016

0

Boa noite ao executar este código no firebird 2.5 :

select cr.DATA_PGTO,cr.NUM_PEDIDO,cr.CLIENTE,cr.VALOR_PAGO,
cr.CUSTOPARCELA,cr.QTDE_PARC,cr.NUM_PARC,
cast(cr.VALOR_PAGO as double precision)- cast(cr.CUSTOPARCELA as double precision) lucro
from conta_receber cr
where cr.DATA_PGTO BETWEEN :p_inicio AND :p_fim order by cr.num_pedido

em alguns registros os campos "VALOR_PAGO" e "CUSTOPARCELA" estão com seus valores zerados,
porem no retorno ao invés de me retornar zero("VALOR_PAGO" - "CUSTOPARCELA"=0 ) me retorna um número gigante 92.233.720.368.547.760,000

acrescentando a linha um cast a linha:
cast(cast(cr.VALOR_PAGO as double precision)- cast(cr.CUSTOPARCELA as double precision)as decimal(12,2)) lucro

o resultado obtido é zero "cast(cast(cr.VALOR_PAGO as double precision)- cast(cr.CUSTOPARCELA as double precision)as decimal(12,2)) lucro"=0

porem ao executar esse sql do delphi da um erro de estouro de capacidade alguem sabe como resolver? Esse dois campos são decimal 12,2
Ederson Rodrigues

Ederson Rodrigues

Responder

Post mais votado

12/08/2016

Experimente o seguinte código:

select cr.DATA_PGTO,cr.NUM_PEDIDO,cr.CLIENTE,cr.VALOR_PAGO,
cr.CUSTOPARCELA,cr.QTDE_PARC,cr.NUM_PARC,
(case when cr.VALOR_PAGO is null then 0 else cr.VALOR_PAGO end)-(case when cr.CUSTOPARCELA is null then 0 else cr.CUSTOPARCELA end) as LUCRO
from conta_receber cr
where cr.DATA_PGTO BETWEEN :p_inicio AND :p_fim order by cr.num_pedido


Att.

Anderson.

Anderson

Anderson
Responder

Gostei + 1

Mais Posts

12/08/2016

Jones Granatyr

Tente utilizar o comando Coalesce ao invés do Cast. Por exemplo:

Select
Coalesce(valor_pago, 0)
from
Tabela

Se o valor_pago for nulo, é retornado zero
Responder

Gostei + 0

12/08/2016

Ederson Rodrigues

Jones obrigado pela tentativa, mas não deu certo...

Eu já havia verificado esses campos estão preenchidos com numero "0" dentro do banco

com o coalesce me retorna aquele número "9,22337203685478E16" e por não usar o cast

da erro até no ibexpert
Responder

Gostei + 0

12/08/2016

Eduardo Silva.

Qual o tipo de campo você está utilizando para cr.VALOR_PAGO e cr.CUSTOPARCELA?

Se esses campos já são do tipo numéricos não faz sentido você utilizar o cast para converter novamente.

Eduardo Belo
Responder

Gostei + 0

12/08/2016

Ederson Rodrigues

Qual o tipo de campo você está utilizando para cr.VALOR_PAGO e cr.CUSTOPARCELA?

Se esses campos já são do tipo numéricos não faz sentido você utilizar o cast para converter novamente.

Eduardo Belo


Estou usando decimal(12,2) para os dois, porém só usando o cast eu consegui fazer retornar "0",mas dessa forma da estouro de capacidade ao executar o client data set
Responder

Gostei + 0

12/08/2016

Ederson Rodrigues

Experimente o seguinte código:

select cr.DATA_PGTO,cr.NUM_PEDIDO,cr.CLIENTE,cr.VALOR_PAGO,
cr.CUSTOPARCELA,cr.QTDE_PARC,cr.NUM_PARC,
(case when cr.VALOR_PAGO is null then 0 else cr.VALOR_PAGO end)-(case when cr.CUSTOPARCELA is null then 0 else cr.CUSTOPARCELA end) as LUCRO
from conta_receber cr
where cr.DATA_PGTO BETWEEN :p_inicio AND :p_fim order by cr.num_pedido


Att.

Anderson.


Anderson também não foi, o campo não está nulo está preenchido com o número "0" , a unica forma que roda no sql é usando cast já estou conformado com isso rs...agora o problema é que no dephi 7 ele da erro de estouro de capacidade
Responder

Gostei + 0

12/08/2016

Anderson

Outra tentativa então. Imagino que se VALOR_PAGO for zero, então LUCRO deverá ser zero, se sim use o código abaixo:

select cr.DATA_PGTO,cr.NUM_PEDIDO,cr.CLIENTE,cr.VALOR_PAGO,
cr.CUSTOPARCELA,cr.QTDE_PARC,cr.NUM_PARC,
(case when cr.VALOR_PAGO is 0 then 0 else (cr.VALOR_PAGO-cr.CUSTOPARCELA) end) as LUCRO
from conta_receber cr
where cr.DATA_PGTO BETWEEN :p_inicio AND :p_fim order by cr.num_pedido

Att.

Anderson.
Responder

Gostei + 0

12/08/2016

Ederson Rodrigues

Anderson obrigado pelas dicas, mas dessa forma não pode ser porque o lucro não vai ser zero vai ser o valor do cr.custoparcela negativo

para no final do relatório ter o lucro mesmo....

cara isso é coisa de doido o firebird aceita 0-1 por exemplo, mas não aceita 0-cr.CUSTOPARCELA
Responder

Gostei + 0

12/08/2016

Anderson

Ok, vamos de novo (uma hora vamos achar a solução):

select cr.DATA_PGTO,cr.NUM_PEDIDO,cr.CLIENTE,cr.VALOR_PAGO,
cr.CUSTOPARCELA,cr.QTDE_PARC,cr.NUM_PARC,
(case when cr.VALOR_PAGO is 0 then (cr.CUSTOPARCELA*-1) else (cr.VALOR_PAGO-cr.CUSTOPARCELA) end) as LUCRO
from conta_receber cr
where cr.DATA_PGTO BETWEEN :p_inicio AND :p_fim order by cr.num_pedido

Se possível, testa o código em uma ferramenta SQL (ex.: flamerobin, ibexpert) para visualizar os dados e ver se tudo ok (e só depois ir codificar no Delphi).

Att.

Anderson.
Responder

Gostei + 0

13/08/2016

Eduardo Silva.

Acredito que o erro seja causado pela incompatibilidade do Firebird 2.5 com o Delphi 7.

O Delphi 7 foi originalmente lançado em 2002 e não tem drive nativo para o Firebird.

O que se utiliza é o drive do Interbase mas não é 100% compatível, principalmente se você está utilizando a versão 2.5 do Firebird que foi lançado em 2010.

Se você está utilizando o DBEXpress aconselho a utilizar um drive ou um componente de terceiros. Outra alternativa é uma versão mais recente do Delphi.

O drive nativo do Firebird foi lançado a partir do Delphi 2010.


Eduardo Belo
Responder

Gostei + 0

15/08/2016

Ederson Rodrigues

Bom dia e obrigado Anderson e Eduardo pelas dicas...

Com as dicas do Anderson, e executando no ibexpert pude notar que o valor do custo estava vindo como zero, por um erro da minha aplicação na hora de gravar, preenchi manualmente o valor no banco e todos os selects postados aqui funcionaram.
E como o Eduardo disse acima acredito que seja algo de incompatibilidade mesmo ou erro no firebird 2.5 pois como eu citei ele aceita "0-0" mas não aceita " 0-cr.CUSTOPARCELA" se o valor do custo for zero, alias qualquer operação como a sugerida pelo nosso amigo Anderson (cr.CUSTOPARCELA*-1)...
Para que isso funcione somente usando cast e ai caímos no problema do estouro de capacidade do Delphi....
Responder

Gostei + 0

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

Aceitar