[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