Página 1 de 1

Converter caracter em número

Enviado: 18 Jan 2015 18:18
por JUDIVAN CONTABIL
olá
Pessoal

Gostaria de ajuda para converter caracter em numero:

Código: Selecionar todos

FUNCTION GERAINVENT( )
AARQ(74,.F.)
   SELECT CADASTRO
   ZAP //limpa o arquivo
*Index on PERIODO+DATA to (M->CAMINHO+"\"+M->CODIGO+"\LANCA1")
AARQ(73,.F.)
SELECT ARQIMP
*INDEX ON PERIODO+DATA TO ENTRADA1
*SET INDEX TO ENTRADA1
************************
Select ARQIMP
       Goto top
             Do while .not. eof()
*set Filter to  PERIODO=M->REF_NUM   
*If COD_PLANO<>0    
   WCODIGO=SUBSTR(CAMPO,1,6)  // pega o código
   WDESCRICAO=SUBSTR(CAMPO,7,40)  // pega o nome
   WQUANT=VAL(SUBSTR(CAMPO, 47,50))  // pega o endereço
   WUNID=SUBSTR(CAMPO,55,60)  // pega a cidade
   WUNIT=SUBSTR(CAMPO,65,72)  // pega a cidade
   WTOTAL=SUBSTR(CAMPO,75,82)  // pega a cidade
   Select CADASTRO
   *DBSEEK(WCODIGO)

 APPEND BLANK
      Replace cadastro->CODIGO with WCODIGO
      Replace cadastro->DESCRICAO with WDESCRICAO
      Replace cadastro->QUANT with WQUANT
      Replace cadastro->UNID with WUNID
      *Replace cadastro->UNIT with WUNIT
      *Replace cadastro->TOTAL with WTOTAL
Select ARQIMP
   SKIP
ENDDO
RETURN NIL     
********	
onde tem quant, valor unit, valor total dar erro: 1020 - data type error.

Converter caracter em número

Enviado: 19 Jan 2015 00:34
por Jairo Maia
Olá Judivan,

Use a função Val() para alterar caracteres (numéricos) para número. Altere dessa forma:

Código: Selecionar todos

Replace cadastro->QUANT with Val( WQUANT )
Replace cadastro->UNID with Val( WUNID )
Replace cadastro->TOTAL with Val( WTOTAL )

Converter caracter em número

Enviado: 19 Jan 2015 11:29
por JUDIVAN CONTABIL
Olá Jairo Maia

Fiz como você orientou, mas apareceu o erro: 1098 - Argument error VAL

Converter caracter em número

Enviado: 19 Jan 2015 12:30
por Jairo Maia
Olá Judivan,

Com base em seu código postado no primeiro post, acima da linha APPEND BLANK coloque:

Código: Selecionar todos

If ValType( WQUANT ) != "C"
 Alert( "Erro! WQUANT com tipo: "+ValType( WQUANT ) )
ElseIf ValType( WUNID ) != "C"
 Alert( "Erro! WUNID com tipo: "+ValType( WUNID ) )
ElseIf ValType( WTOTAL ) != "C"
 Alert( "Erro! WTOTAL com tipo: "+ValType( WTOTAL ) )
EndIf
Isso vai mostrar qual variável está chegando com tipo inválido para a função Val(). Precisa ser String, ou seja, tipo = "C".

Converter caracter em número

Enviado: 19 Jan 2015 14:45
por JUDIVAN CONTABIL
Olá Jairo Maia

Acrescentei seu código, apareceu o seguinte: ERRO! WQUANT com tipo: N

Converter caracter em número

Enviado: 19 Jan 2015 14:58
por Jairo Maia
Josivan, então em seu arquivo CADASTRO os campos QUANT, UNID e TOTAL provavelmente estão com tipo Caractere. Vamos inverter o raciocínio usando agora a função STR() que transforma números em string. Tente desta forma e veja se funciona:

Código: Selecionar todos

Replace cadastro->QUANT with Str( WQUANT )
Replace cadastro->UNID with Str( WUNID )
Replace cadastro->TOTAL with Str( WTOTAL )

Converter caracter em número

Enviado: 19 Jan 2015 16:21
por ANDRIL
WQUANT=VAL(SUBSTR(CAMPO, 47,50)) // pega o endereço
WUNID=SUBSTR(CAMPO,55,60) // pega a cidade
WUNIT=SUBSTR(CAMPO,65,72) // pega a cidade
WTOTAL=SUBSTR(CAMPO,75,82)
No laço do Do While as variaveis estao como "C". Como Jairo havia passado o uso de VAL() resolve-se a conversão para colocação nos campos do DBF.
JUDIVAN CONTABIL escreveu:mas apareceu o erro: 1098 - Argument error VAL
Neste caso, o problema esta no que esta sendo passado para a função VAL(), veja antes o conteúdo das variaveis, veja se esta apresentado como NIL o que pode dar este tipo de aviso.

Tente assim,

Código: Selecionar todos

Replace cadastro->QUANT with Val( memvar->WQUANT ) 
Replace cadastro->UNID with Val( memvar->WUNID ) 
Replace cadastro->TOTAL with Val( memvar->WTOTAL ) 
Verifique se estas variáveis não estão sendo criadas antes da chamada desse módulo, crie variáveis locais
para evitar conflitos.

Código: Selecionar todos

LOCAL wQuant, wUnid, wTotal
Boa sorte!

Converter caracter em número

Enviado: 19 Jan 2015 17:47
por JUDIVAN CONTABIL
Não deu certo,
Será que tem outra maneira de importar o txt para o dbf de origem, sem passar por outro dbf.

Converter caracter em número

Enviado: 19 Jan 2015 19:30
por alxsts
Olá!

A função Val() espera um parâmetro do tipo Character. Se passar um número para ela, gera erro mesmo. Provavelmente é o que está acontecendo. Tente assim:

Código: Selecionar todos

1	Replace cadastro->QUANT with WQUANT
2	Replace cadastro->UNID with WUNID
3	Replace cadastro->TOTAL with WTOTAL 
JUDIVAN CONTABIL escreveu:Será que tem outra maneira de importar o txt para o dbf de origem, sem passar por outro dbf.
Claro! Utilize as funções de baixo nível: FOpen(), FRead() e FClose().

Converter caracter em número

Enviado: 19 Jan 2015 19:45
por alxsts
Olá!

Olhando melhor os nomes de campo, o problema está logo no começo do código:

Código: Selecionar todos

*If COD_PLANO<>0    
   WCODIGO=SUBSTR(CAMPO,1,6)  // pega o código
   WDESCRICAO=SUBSTR(CAMPO,7,40)  // pega o nome
   WQUANT=VAL(SUBSTR(CAMPO, 47,50))  // pega a quantidade ********
   WUNID=SUBSTR(CAMPO,55,60)  // pega a cidade ****** UNIDADE
   WUNIT=Val( SUBSTR(CAMPO,65,72) )  // pega o Valor Unitário **********
   WTOTAL=Val( SUBSTR(CAMPO,75,82) )  // pega o Valor Total   ********

   Select CADASTRO
   *DBSEEK(WCODIGO)

    APPEND BLANK
      Replace cadastro->CODIGO with WCODIGO
      Replace cadastro->DESCRICAO with WDESCRICAO
      Replace cadastro->QUANT with WQUANT
      Replace cadastro->UNID with WUNID
      *Replace cadastro->UNIT with WUNIT
      *Replace cadastro->TOTAL with WTOTAL
Select ARQIMP
   SKIP
ENDDO
RETURN NIL  
Se no DBF os campos numéricos tiverem casas decimais, converta já com as casas decimais:

Código: Selecionar todos

   WQUANT=VAL(SUBSTR(CAMPO, 47,50)) / 100 // ou 1000, dependendo da quantidade de casas
   WUNIT=Val( SUBSTR(CAMPO,65,72) ) / 100
   WTOTAL=Val( SUBSTR(CAMPO,75,82) ) / 100

Converter caracter em número

Enviado: 23 Jan 2015 16:36
por JoséQuintas
Explicando o que já explicaram....
Val() transforma de string pra número.

Se está pegando o campo do txt já usando Val(), não precisa dele no replace.
E confira se criou a estrutura como numérico.

A coisa é simples:
OLHE na tela a linha que deu erro.
Como é um replace pra cada campo/variável, vai saber exatamente qual deles precisa ajuste.
Só olhar se o campo realmente é numérico no arquivo, e se o valor a ser gravado é numérico.


Voltando ao Val():

ou usa na hora de ler o txt:

Código: Selecionar todos

nValor := Val( Substr( Campo, 10, 10 ) )
REPLACE arquivo->Algum WITH nValor
ou usa na hora de gravar no arquivo:

Código: Selecionar todos

cValor := Substr( Campo, 10, 10 )
REPLACE arquivo->Algum WITH Val( cValor )
Se usar nos dois, com certeza vai dar erro, porque já foi convertido antes.

E se mesmo assim der erro, então provavelmente o campo do arquivo destino não é numérico.

Só não esqueça de verificar também se o arquivo txt está usando ponto ou vírgula pra separar a decimal, porque faz diferença no resultado.


Nota: o post não tem a ver com legislação.