[firebase-br] Cast incorreto

Maiki P. maiki em codificando.com.br
Qua Fev 25 18:07:09 -03 2009


Eduardo Bahiense escreveu:
> Olá
> 
> O FB não se confunde, para ele a regra é clara: separador de milhar é 
> ',' e separador decimal é '.'
> 
> Se no seu BD é *sempre* ao contrário, ou seja, no formato brasileiro, e 
> se o fb 2.0, de alguma forma, aceita a conversão (no meu FB 2.1 não 
> aceita), trabalhe o valor convertido, no caso do seu exemplo, 
> multiplicando por 10.
> 
> O ideal mesmo é que, se você precisa gravar isso como string e que usar 
> a conversão para numeric, grave em um formato em que *qualquer* SGDB 
> entenda.
> 
> Se você não pode trocar para o 2.1, considere escrever uma UDF ou 
> procedure que te dê a mesma funcionalidade da função REPLACE, ou tratar 
> essa conversão no lado cliente, ou seja, no seu aplicativo.
> 
> Existe tbm uma forma de tentar normalizar as coisas, de forma a se saber 
> em que posição estará a vírgula e trocá-la pela função substring, como o 
> campo é VARCHAR(8) não fica tão extenso assim:
> 
> SELECT
> CAST(   
>   CASE
>   WHEN SUBSTRING VALOR FROM 2 FOR 1 = ',' THEN
>     SUBSTRING(VALOR FROM 1 FOR 1)||'.'||SUBSTRING(VALOR FROM 3 FOR 6)
>   WHEN SUBSTRING VALOR FROM 3 FOR 1 = ',' THEN
>     SUBSTRING(VALOR FROM 1 FOR 2)||'.'||SUBSTRING(VALOR FROM 4 FOR 5)
>   WHEN SUBSTRING VALOR FROM 4 FOR 1 = ',' THEN
>     SUBSTRING(VALOR FROM 1 FOR 3)||'.'||SUBSTRING(VALOR FROM 5 FOR 4)
>   WHEN SUBSTRING VALOR FROM 5 FOR 1 = ',' THEN
>     SUBSTRING(VALOR FROM 1 FOR 4)||'.'||SUBSTRING(VALOR FROM 6 FOR 3)
>   WHEN SUBSTRING VALOR FROM 6 FOR 1 = ',' THEN
>     SUBSTRING(VALOR FROM 1 FOR 5)||'.'||SUBSTRING(VALOR FROM 7 FOR 2)
>   WHEN SUBSTRING VALOR FROM 7 FOR 1 = ',' THEN
>     SUBSTRING(VALOR FROM 1 FOR 6)||'.'||SUBSTRING(VALOR FROM 8 FOR 1)
>   ELSE
>     VALOR
>   END
> AS NUMERIC(9,2))/100
> 
> Eduardo
> 
> 
> Maiki P. escreveu:
>> Caros,
>>
>> estou realizando um cast, desta forma:
>>
>> cast(valor as numeric(9,2))/100, onde a variável valor é do
>> tipo varchar(8), o problema ocorre quando o valor do campo
>> contém ",", por ex.: 2,3 - o firebird retorna 0,23 - quando
>> deveria ser 0,023. Sei q o firebird (2.0, versão q estou
>> utilizando) se confunde no caso do separador, onde o mesmo
>> utliza o padrão americano ".", como posso no meu caso,
>> efetuar o cast corretamente, tb sei q a versão 2.1 tem a
>> função REPLACE, mas na 2.0 não.
>>
>> Att, Maiki Perin.
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use: 
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
> 
> 
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: 
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> 

ok, testarei a solução proposta.

Obs.: o se "confunde", foi apenas no sentido de denotar um padrão 
diferente do "pt-br", pois se q o mesmo segue o padrão americano, nos
quais vários SGBDR's do mercado tb fazem uso.

obrigado.





Mais detalhes sobre a lista de discussão lista