[firebase-br] Procedure com decimal (18,18)

Elton da Motta Barbosa embarbosa em gmail.com
Seg Ago 2 12:25:26 -03 2010


2010/8/2 Elton da Motta Barbosa <embarbosa em gmail.com>:
>>Magnun, vc pode até criar um campo com esta precisão, porém salvo
>>engano o Firebird só comporta no máximo 16 casas decimais.
>>...
>
> Não necessariamente...
>
> SET TERM ^ ;
>
> CREATE OR ALTER PROCEDURE NEW_PROCEDURE
> returns (
>    valor decimal(18,17))
> as
> begin
>  valor = cast((65.000000000/12.00000000) as decimal(18,17));
>  suspend;
> end
> ^
>
> SET TERM ; ^
>
> Ele só armazenou 16 casas no seu exemplo pois o seu resultado já havia
> tomado duas casas na parte inteira.
> O Firebird não vai conseguir armazenar 18 com 18 de precisão pois
> sempre vai precisar de pelo menos uma casa para a parte inteira, mesmo
> que seja pra mostrar zero.
> Então o máximo é 17. A menos que alguém me corrija com alguma documentação.
>

hmm... me ative apenas a resposta do e acabei me equivocando... veja:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE NEW_PROCEDURE
returns (
    valor decimal(18,18))
as
begin
  valor = 0.000029151544303061;
  suspend;
end
^

SET TERM ; ^

SELECT * FROM NEW_PROCEDURE;

continua resultando em uma conta possível. Me desculpem

Eu tentei simular a sua procedure simplificando-a, veja abaixo:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE TESTEMGN
returns (
    valor decimal(18,18))
as
declare variable durabilidade_cm2 decimal(10,2);
declare variable custo_cm2 decimal(18,18);
BEGIN
  DURABILIDADE_CM2 = (5500 * 5 * 29.7 * 21);
  CUSTO_CM2 = 500 /:durabilidade_cm2;
  VALOR = CUSTO_CM2;
  SUSPEND;
END^

SET TERM ; ^

O resultado é 0,0000000000
No entanto trocando a linha

CUSTO_CM2 = 500 /:durabilidade_cm2;

por

  CUSTO_CM2 = 500.0000000000000000 /:durabilidade_cm2;

Você pode ver que o resultado se aproxima. Acho que você precisa de um
tratamento na entrada ali do campo VALOR e aumentar o número de casas
da variável DURABILIDADE_CM2 de forma que o número de casas decimais
da variável DURABILIDADE_CM2 somadas as casas decimais do campo VALOR
deêm 18.

No entanto, você disse que o resultado ficou NULL e não zerado. Não
consegui reproduzir isso aqui...




Mais detalhes sobre a lista de discussão lista