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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 1309
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: 3109
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: 3109
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: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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