LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

syslink
Usuário Nível 3
Usuário Nível 3
Mensagens: 132
Registrado em: 20 Fev 2018 13:13
Localização: joinvile/sc

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Mensagem por syslink »

Tenho o seguinte codigo q funcionava perfeita no clipper mas no harbour com HMG 3.5 esta estranho o resultado final

Código: Selecionar todos

static function SENHA_verifica (mUSUARIO , mSENHA)
	 local aSenha := 0, bSenha := 0, cSenha, mSENHADIGITADA := '';

         mSENHADIGITADA := val(mSENHA)
	 aSenha := 123456
	 bSenha := aSenha * val ( right ( dtos ( date () ) , 2) )
	 // cSenha := left ( str (bSenha), 6)
	 cSenha := str (bSenha)
	 // MsgInfo (cSenha   , 'cSenha antes len')	 
	 // if len(cSenha) > 6
		// cSenha := substr (cSenha, 1, 6)
		cSenha := substr (cSenha, 1, 10)
Se eu fizer
MsgInfo (aSenha ) / mostrará 123456
MsgInfo (bSenha ) / mostrará o resultado da multiplicacao de 123456x08 = 987648, pois o dia de hj eh 08. Mas, se fosse 31 (ultimo dia de agosto) seria: 3827123
MsgInfo (cSenha) / mostrara o resultado final de bSenha
MsgInfo (mSenhadigitada) / mostrara o q o usuario digitou na senha q devera ser comparada com cSenha

Se eu fizer um MsgInfo (len(cSenha)) / mostrara 6 se for 123456 x 8. Mas, se for 123456 x 31, LEN mostrara 7.
Então, pra não passar de 6, coloquei o substr ou left pra cortar e pegar apenas os 6 primeiros caracteres.

Neste caso,meus problemas começaram, pois se colocar left 6 ou substr 6, o compilador do harbour da hmg (pelo menos aqui comigo) está cortando e considerando apenas os 2 primeiros caracteres.

Então, para sanar o problema temporariamente, aumentei o left ou substr para 10. Somente dessa forma q pega os 6 primeiros caracteres.

Alguem já passou por esse problema?

obs.: não sei se seria nesse topico ou no da hmg, pois o problema - a meu ver, nao eh relacionado aa hmg e sim a função nativa do clipper/harbour.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Mensagem por Itamar M. Lins Jr. »

Olá!
cSenha := str (bSenha) -> use cSenha := substr(hb_ntos(bSenha),1,6)

Boas práticas:
Dica use bMinhaVar para code block
Use cMinhaVar para caractere.
Use nMinhaVar para campos numéricos.
Use aMinhaVar para campos array!
Use dMinhaVar para campos do tipo data...

A função str() deixa espaços em branco no inicio.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Mensagem por Kapiaba »

Código: Selecionar todos

// #include "FiveWin.ch"

FUNCTION Main()

   LOCAL mUSUARIO := [kapiaba], mSENHA := [123456]

   SENHA_verifica( mUSUARIO, mSENHA )

RETURN NIL

FUNCTION SENHA_verifica( mUSUARIO, mSENHA )

   LOCAL aSenha := 0, bSenha := 0, cSenha, mSENHADIGITADA := ''
   LOCAL dDia, dDate

   mSENHADIGITADA := VAL( mSENHA )

   aSenha := 123456

   dDia   := STRZERO( DAY( DATE() ), 2, 0 ) // [31] = 3827136
   dDate  := VAL( dDia )

   bSenha := aSenha * dDate

   cSenha := STR( bSenha )

   ? cSenha

   // XBROWSE( cSenha )

RETURN NIL

// FIN / END - kapiabafwh@gmail.com
Regards, saludos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Mensagem por JoséQuintas »

Str() não tem tamanho fixo definido, e pode incluir espaços em branco no início.
Por isso sempre bom definir tamanho, assim tem certeza do resultado.
Mesmo assim, iria precisar de um Ltrim() pra limpar os espaços em branco da esquerda, porque o resultado não tem tamanho fixo.

Str( codigo )

Se vier de DBF o resultado é um, se vier de variável de memória o resultado é outro, se vier de OLE o resultado é outro.
Pelo mesmo motivo não uso hb_Ntos(), tive problema com ele.

Ltrim( Str( codigo, 10 ) )

Desse jeito é mais fonte, mas sempre o resultado esperado.
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