Página 1 de 1

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Enviado: 08 Ago 2023 08:26
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.

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Enviado: 08 Ago 2023 09:26
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.

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Enviado: 08 Ago 2023 09:50
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.

LEFT ou SUBSTR está omitindo/sumindo 4 caracteres

Enviado: 08 Ago 2023 10:37
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.