Converter de String para Numérico

Firebird

29/09/2003

Preciso somar 4 notas sendo que as mesmas são do tipo string:

Select n1,n2,n3,n4, n1+n2+n3+n4 as Total from notas

o campo total passa ser do tipo float.

Quando eu executo apresenta um erro de conversão....

existe alguma função que converta de string para numérico?

Desde já agradeço!

Fabíola


Fea

Fea

Curtidas 0

Respostas

Afarias

Afarias

29/09/2003

bom -- se notas são números, a melhor coisa q vc podia fazer para seu sistema é criar os campos como número!

agora, para converter dados, vc pode usar a função CAST, ex::

select CAST(campo_tal as NUMERIC(8,2)) from tabela


mas os números deverão ter como separador de decimais o ´.´ (ponto) ou então não vai sair ´muito correto´.


T+


GOSTEI 0
Bruno Belchior

Bruno Belchior

29/09/2003

Estou exatamente com esse mesmo problema... Só que as notas são gravadas com ´,´ e como o colega afarias falou não está resolvendo meu problema...


GOSTEI 0
Martins

Martins

29/09/2003

bom -- se notas são números, a melhor coisa q vc podia fazer para seu sistema é criar os campos como número! agora, para converter dados, vc pode usar a função CAST, ex:: select CAST(campo_tal as NUMERIC(8,2)) from tabela mas os números deverão ter como separador de decimais o ´.´ (ponto) ou então não vai sair ´muito correto´. T+


E no caso do separador decimal igual a ´,´ como contornar essa dor de cabeça?

Aguardo retorno.


GOSTEI 0
Alexandre_torres

Alexandre_torres

29/09/2003

Olá pessoal,

Desculpem minha ingnorância mas alguém poderia me explicar nesta expresão select CAST(campo_tal as NUMERIC(8,2)) from tabela que o nosso afarias colocou.

qual a função do CAST?

thakiou.


GOSTEI 0
Bruno Belchior

Bruno Belchior

29/09/2003

O cast tem a função de converter dados de um tipo para outro, um campo com a string ´1´ pode virar um integer 1 fazendo:
cast(campo as integer)



GOSTEI 0
Martins

Martins

29/09/2003

[quote:23f16358d2=´Bruno Belchior´]O cast tem a função de converter dados de um tipo para outro, um campo com a string ´1´ pode virar um integer 1 fazendo:
cast(campo as integer)
[/quote:23f16358d2]

No SQL Server vc tem ainda [b:23f16358d2]Convert[/b:23f16358d2]


GOSTEI 0
Lorde_morte.

Lorde_morte.

29/09/2003

Quando o campo é null o CAST retorna null.

Como converter um campo para integer, mas quando for null retornar 0?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

use coalesce()

cast(coalesce(campo,´0´) as integer)

funciona a partir do FB 1.5


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

ou

coalesce(cast(campo as integer),0)


GOSTEI 0
Lorde_morte.

Lorde_morte.

29/09/2003

Erro:
Dynamic SQL Error
SQL error code = -804
Function unknown
COALESCE
Statement: select coalesce(sum(Quantidadeentrada),0)-(sum(QUANTIDADESAIDASINCAL)+ sum(QUANTIDADESAIDAROTATIVO)) from movimentacao,guias
where
codigoidentificador=identificador and
codigoitem=´6515.03.075-80´ and
data<=cast(´02/01/2006´ as date)
order by data,idmovimentacao


Eu fiz algo errado?
Estou usando o interbase 6.5

Desde já obrigado.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

essa função não existe no Interbase.
somente no Firebird, a partir da versão 1.5.


GOSTEI 0
Lorde_morte.

Lorde_morte.

29/09/2003

emerson.en, muito obrido pela atenção.

Mas infelizmente o meu problema continua. :cry:

select sum(Quantidadeentrada)-(sum(QUANTIDADESAIDASINCAL)+ sum(QUANTIDADESAIDAROTATIVO)) from movimentacao,guias


Eu preciso fazer essa soma funcionar mesmo que um dos três parâmetros seja null.

Alguem tem alguma solução?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

no IB 6.5 tem o comando case?


GOSTEI 0
Lorde_morte.

Lorde_morte.

29/09/2003

Mais erro:

Dynamic SQL Error SQL error code = -104 Token unknown - line 3, char 2 WHEN Statement: select sum(Quantidadeentrada),sum(QUANTIDADESAIDASINCAL), sum(QUANTIDADESAIDAROTATIVO), CASE WHEN (sum(Quantidadeentrada)) IS NULL THEN ´0´ END AS TESTE from movimentacao,guias where codigoidentificador=identificador and codigoitem=´6515.03.075-80´ and data<=cast(´02/01/2006´ as date) order by data,idmovimentacao



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

não conheço a sintaxe no IB, mas tente assim:
select
  sum(Quantidadeentrada),
  sum(QUANTIDADESAIDASINCAL),
  sum(QUANTIDADESAIDAROTATIVO),
  (CASE WHEN sum(Quantidadeentrada) IS NULL
      THEN 0
      ELSE sum(Quantidadeentrada)
   END) AS TESTE 
from
  movimentacao
inner join
  guias on (guias.identificador = movimentacao.codigoidentificador)
where 
  codigoitem=´6515.03.075-80´
  and data<=cast(´02/01/2006´ as date)
order by
  data, idmovimentacao

ou
select
  sum(Quantidadeentrada),
  sum(QUANTIDADESAIDASINCAL),
  sum(QUANTIDADESAIDAROTATIVO),
  (CASE sum(Quantidadeentrada) IS NULL
      THEN 0
      ELSE sum(Quantidadeentrada)
   END) AS TESTE 
from
  movimentacao
inner join
  guias on (guias.identificador = movimentacao.codigoidentificador)
where 
  codigoitem=´6515.03.075-80´
  and data<=cast(´02/01/2006´ as date)
order by
  data, idmovimentacao



GOSTEI 0
Lorde_morte.

Lorde_morte.

29/09/2003

:(

Nada.

Veja oque este site fala sobre o case e interbase:
[url]http://www.sqlmagazine.com.br/Colunistas/lanusse/09_funcoesinterbase.asp[/url]
http://www.sqlmagazine.com.br/Colunistas/lanusse/09_funcoesinterbase.asp

De qualquer forma valeu!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

só na versão 7.5?

você pode atualizar para essa versão ou passar a usar o Firebird...


GOSTEI 0
Adrianaalar

Adrianaalar

29/09/2003

Está dando problema de conversão na minha query, porém o resultado aparece. Mas quando vou rodar o programa dá erro..
O que eu faço???

Select A.CD_INTE_PESS, A.NIP, A.CD_GRAD, A.CD_QUAD, A.NM_PESS, A.NM_GUER_PESS,
A.CD_SUPE, A.CD_DEPT, A.CD_DIV_ESCO,
B.CD_GRAD, SUM((CAST(B.NR_ANO as NUMERIC)*365)+(CAST(B.NR_MES as NUMERIC)*30)+(CAST(B.NR_DIAS as NUMERIC))) DIAS,
B.CD_OM, ´A´ ORDEM
from TB001 A inner join TB002 B on (A.CD_INTE_PESS = B.CD_INTE_PESS)
where
(A.CD_GRAD = ´CB´) and
((A.CD_SITU IS NOT NULL AND A.CD_SITU<>´00´ AND A.CD_SITU<>´LSAM´) OR (A.CD_SITU IS NULL))
Group by A.CD_INTE_PESS, B.CD_OM, A.NIP, A.CD_GRAD, A.CD_QUAD, A.NM_PESS,
A.NM_GUER_PESS, A.CD_SUPE, A.CD_DEPT, A.CD_DIV_ESCO,B.CD_GRAD


GOSTEI 0
Adrianaalar

Adrianaalar

29/09/2003

Está dando problema de conversão na minha query, porém o resultado aparece. Mas quando vou rodar o programa dá erro..
O que eu faço??? AHH...o B.NR_ANO,B.NR_MES E B.NR_DIAS é VARCHAR

Select A.CD_INTE_PESS, A.NIP, A.CD_GRAD, A.CD_QUAD, A.NM_PESS, A.NM_GUER_PESS,
A.CD_SUPE, A.CD_DEPT, A.CD_DIV_ESCO,
B.CD_GRAD, SUM((CAST(B.NR_ANO as NUMERIC)*365)+(CAST(B.NR_MES as NUMERIC)*30)+(CAST(B.NR_DIAS as NUMERIC))) DIAS,
B.CD_OM, ´A´ ORDEM
from TB001 A inner join TB002 B on (A.CD_INTE_PESS = B.CD_INTE_PESS)
where
(A.CD_GRAD = ´CB´) and
((A.CD_SITU IS NOT NULL AND A.CD_SITU<>´00´ AND A.CD_SITU<>´LSAM´) OR (A.CD_SITU IS NULL))
Group by A.CD_INTE_PESS, B.CD_OM, A.NIP, A.CD_GRAD, A.CD_QUAD, A.NM_PESS,
A.NM_GUER_PESS, A.CD_SUPE, A.CD_DEPT, A.CD_DIV_ESCO,B.CD_GRAD


GOSTEI 0
Larry

Larry

29/09/2003

Faça o seguinte:

cast(´0´||+
case when substrlen(codigo,1,1) between ´0´ and ´9´ then cast((substrlen(codigo,1,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,2,1) between ´0´ and ´9´ then cast((substrlen(codigo,2,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,3,1) between ´0´ and ´9´ then cast((substrlen(codigo,3,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,4,1) between ´0´ and ´9´ then cast((substrlen(codigo,4,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,5,1) between ´0´ and ´9´ then cast((substrlen(codigo,5,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,6,1) between ´0´ and ´9´ then cast((substrlen(codigo,6,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,7,1) between ´0´ and ´9´ then cast((substrlen(codigo,7,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,8,1) between ´0´ and ´9´ then cast((substrlen(codigo,8,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,9,1) between ´0´ and ´9´ then cast((substrlen(codigo,9,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,10,1) between ´0´ and ´9´ then cast((substrlen(codigo,10,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,11,1) between ´0´ and ´9´ then cast((substrlen(codigo,11,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,12,1) between ´0´ and ´9´ then cast((substrlen(codigo,12,1)) as varchar(1)) else ´´ end||
case when substrlen(codigo,13,1) between ´0´ and ´9´ then cast((substrlen(codigo,13,1)) as varchar(1)) else ´´ end as bigint)

Onde ´codigo´ é um campo varchar de no maximo 13 digitos.
Ante de tudo voce deve declarar a funçao substrlen com:
declare external function substrlen cstring(80), smallint, smallint returns cstring(80) free_it entry_point ´IB_UDF_substrlen´ module_name ´ib_udf´

Desenvolvi enta função pois o cast da problema quando o campo tem null ou letras.


GOSTEI 0
Vitor

Vitor

29/09/2003

select sum(isnull(Quantidadeentrada,0))-(sum(isnull(QUANTIDADESAIDASINCAL,0))+ sum(isnull(QUANTIDADESAIDAROTATIVO,0))) from movimentacao,guias
GOSTEI 0
POSTAR