Converter caracter em número

Fórum sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (NFe, NFCe, NFSe, SPEED, Projeto ACBr, TEF, ECD, EFD, etc.)

Moderador: Moderadores

JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

Converter caracter em número

Mensagem 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.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Converter caracter em número

Mensagem 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 )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

Converter caracter em número

Mensagem por JUDIVAN CONTABIL »

Olá Jairo Maia

Fiz como você orientou, mas apareceu o erro: 1098 - Argument error VAL
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Converter caracter em número

Mensagem 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".
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

Converter caracter em número

Mensagem por JUDIVAN CONTABIL »

Olá Jairo Maia

Acrescentei seu código, apareceu o seguinte: ERRO! WQUANT com tipo: N
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Converter caracter em número

Mensagem 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 )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Converter caracter em número

Mensagem 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!
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

Converter caracter em número

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Converter caracter em número

Mensagem 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().
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Converter caracter em número

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Converter caracter em número

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder