[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