[firebase-br] Cast incorreto
Eduardo Bahiense
eduardo em icontroller.com.br
Qua Fev 25 17:47:09 -03 2009
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
>
Mais detalhes sobre a lista de discussão lista