Gerar o codigo MD5 a partir de uma STRing

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

Moderador: Moderadores

LDOSISTEMAS
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 01 Set 2014 17:04
Localização: CLAUDIO/MG
Contato:

Gerar o codigo MD5 a partir de uma STRing

Mensagem por LDOSISTEMAS »

Bom dia, estou criando uma aplicação para emissão da NF 21 de telecomunicações, um dos requisitos é a geração do MD% a partir de uma string composta pelo CNPJ,numero da NF,valor total ,base calculo do ICMS e valor do ICMS, busquei aqui no site e encontrei citações do HB_MD5 para fazer isso, mas ao utilizar no codigo o programa gerar normalemnte não acusando que a função HB_MD5 não existe, mas ao entrar no rotina onde ele é chamado retorna erro base 1001 , com o nome da HB_MD5, nos posts que encontrei a função eram apenas partes, não vi se necessita algum request ou include para a mesma funcionar.
Gostaria da ajuda de vocês com exemplos ou algum material com detalhes de como usar.
Estou usando o harbour 3.2 compilando em modo texto.
Desde já agradeço
LAURO DE OLIVEIRA
Analista/Diretor
(37) 3381 32 11
www.ldosistemas.com.br
Imagem
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Gerar o codigo MD5 a partir de uma STRing

Mensagem por ANDRIL »

Não precisa de nenhuma configuração extra, o HB_MD5() faz parte do núcleo do Harbor 3.2.
Veja se esta passando uma string para a função. Quando falta a função devido algum include nem chega a compilar.
Na dúvida posta seu código.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
LDOSISTEMAS
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 01 Set 2014 17:04
Localização: CLAUDIO/MG
Contato:

Gerar o codigo MD5 a partir de uma STRing

Mensagem por LDOSISTEMAS »

aqui esta o trecho onde estou chamando a função

Código: Selecionar todos

AADD(sistema[015,O_FORMULA],{;          // NF21 - Base Icms
     /* form mostrar  */    "LEFT(TRAN(baseicms,[@E 999,999,999.99]),14)",;
     /* lin da formula*/    7,;
     /* col da formula*/    18;
                         };
)
AADD(sistema[015,O_FORMULA],{;          // NF21 - Total Icms
     /* form mostrar  */    "LEFT(TRAN(totalicms,[@E 999,999,999.99]),14)",;
     /* lin da formula*/    8,;
     /* col da formula*/    18;
                         };
)
AADD(sistema[015,O_FORMULA],{;          // NF21 - MD5
     /* form mostrar  */    "LEFT(TRAN(HB_MD5(M->CNPJ_emp+numnota+STR(valortotal,12,2)+STR(baseicms,12,2)+STR(totalicms,12,2)),[]),32)",;
     /* lin da formula*/    7,;
     /* col da formula*/    33;
                         };
Os campos CNPJ e numnota são string por isso não tratei
LAURO DE OLIVEIRA
Analista/Diretor
(37) 3381 32 11
www.ldosistemas.com.br
Imagem
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Gerar o codigo MD5 a partir de uma STRing

Mensagem por ANDRIL »

Fiz um teste aqui simulando o conteúdo da linha
"LEFT(TRAN(HB_MD5(M->CNPJ_emp+numnota+STR(valortotal,12,2)+STR(baseicms,12,2)+STR(totalicms,12,2)),[]),32)"
e não acusou erro.
O erro acusa ai nessa chamada ou em outro local onde se executa a linha propriamente dita contida no array. De mais detalhes do erro.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar o codigo MD5 a partir de uma STRing

Mensagem por JoséQuintas »

Estou usando o harbour 3.2 compilando em modo texto.
Nem todo mundo costuma ficar atualizando o Harbour.
Convém lembrar que faz muitos anos que o Harbour não altera o número de versão, desde antes de existir o hb_Md5.
Melhor confirmar o mês/ano
Harbour 3.4.0dev (0e93b09f53) (2017-05-31 23:04)
Copyright ( c ) 1999-2017, https://github.com/vszakats/harbour-core/
Em todo caso, pra confirmar se existe, use o HBMK2.

hBMK2 -find md5
md5.png
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar o codigo MD5 a partir de uma STRing

Mensagem por JoséQuintas »

Mas pera aí....

Código: Selecionar todos

"LEFT(TRAN(HB_MD5(M->CNPJ_emp+numnota+STR(valortotal,12,2)+STR(baseicms,12,2)+STR(totalicms,12,2)),[]),32)"
Isso é uma string, provavelmente deve estar usando macro depois.
Pra macro funcionar, vai depender de existirem as variáveis/campos no momento da execução.
E se forem campos de arquivo, vai depender de estar posicionado no DBF correto.

M->CNPJ_emp
NumNota
ValorTotal
BaseIcms
TotalIcms

É por isso que seria preferível usar Codeblock e não string/macro, porque tem validação de tudo, e mensagem de erro mais detalhada.
Não faça o mesmo que a minigui fez, de esquecer do codeblock.

Em último caso, teste assim:

Código: Selecionar todos

"CalculaMd5()"
...
FUNCTION CalculaMD5()
RETURN LEFT(TRAN(HB_MD5(M->CNPJ_emp+numnota+STR(valortotal,12,2)+STR(baseicms,12,2)+STR(totalicms,12,2)),[]),32)
Pelo menos vai poder ver melhor que erro está acontecendo.
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/
LDOSISTEMAS
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 01 Set 2014 17:04
Localização: CLAUDIO/MG
Contato:

Gerar o codigo MD5 a partir de uma STRing

Mensagem por LDOSISTEMAS »

eu chequei com - find e existe o hb_md5, vou fazer como você indicou.
LAURO DE OLIVEIRA
Analista/Diretor
(37) 3381 32 11
www.ldosistemas.com.br
Imagem
LDOSISTEMAS
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 01 Set 2014 17:04
Localização: CLAUDIO/MG
Contato:

Gerar o codigo MD5 a partir de uma STRing

Mensagem por LDOSISTEMAS »

José M. C. Quintas, realmente fazendo como indicou passou, já havia usado , não com essa função mas com outras, dessa maneira e sempre funcionou, mas enfim, criando o calcmd5() como indicou ele retornou. Eu utilizo o gaspro40 para gerar o codigo e depois faço as alterações para compilar no harbour , imagino que deva ser alguma forma que o codigo fica gerado, mas agradeço muito a ajuda, vou atentar sempre a seguir dessa forma.
LAURO DE OLIVEIRA
Analista/Diretor
(37) 3381 32 11
www.ldosistemas.com.br
Imagem
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar o codigo MD5 a partir de uma STRing

Mensagem por JoséQuintas »

"Talvez" tenha que indicar o ALIAS nos campos, pra macro saber que se trata de campo de dbf.

Em último caso, se realmente for de DBF e não puder definir alias: field->BaseIcms, field->TotalIcms, field->ValorTotal

O ideal mesmo seria poder usar codeblock.

Mais uma coisa: não sei se TRANS( é interpretado pela macro por Transform(, talvez seja o pré-compilador que traduza isso na compilação.

Código: Selecionar todos

 bCode := { || ;
   Left( Transform( ;
   HB_MD5( ;
      M->CNPJ_emp + field->numnota + STR( field->valortotal, 12, 2 ) + ;
      STR( field->baseicms, 12, 2 ) + STR( field->totalicms, 12, 2 ) ;
      ), "" ), 32 ) }
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar o codigo MD5 a partir de uma STRing

Mensagem por JoséQuintas »

Confirmado. Tem a ver com hb_MD5 que só é linqueditado se for usado explicitamente.
Só funcionou depois de acrescentar EXTERNAL hb_Md5 (e definir variáveis como PRIVATE)

Código: Selecionar todos

MEMVAR Cnpj_Emp, NumNota, ValorTotal, BaseIcms, TotalIcms, x

EXTERNAL hb_Md5 // <<=============

PROCEDURE Main

   PRIVATE x
   PRIVATE Cnpj_Emp := ""
   PRIVATE NumNota := ""
   PRIVATE ValorTotal := 0
   PRIVATE BaseIcms := 0
   PRIVATE TotalIcms := 0

   x := &( "cnpj_Emp" )
   x += &( "Str( ValorTotal, 12, 2 )" )
   x += &( "Str( BaseIcms, 12, 2 )" )
   x += &( "Str( TotalIcms, 12, 2 )" )
   x := &( "hb_Md5( x )" )
   x := &( "Transform( x, [] )" )
   x := &( "Left( x, 32 )" )
   ? x

   RETURN
Sem a declaração EXTERNAL
d:\temp>test

Error BASE/1001 Undefined function: HB_MD5
Called from HB_MD5(0)
Called from MAIN(17)
Mais um motivo pra sempre que possível usar codeblock..... rs

Nota: do jeito que mostrei, em função separada, acabou linqueditando a hb_md5(), por isso funcionou.
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/
LDOSISTEMAS
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 01 Set 2014 17:04
Localização: CLAUDIO/MG
Contato:

Gerar o codigo MD5 a partir de uma STRing

Mensagem por LDOSISTEMAS »

Obrigado mais um conhecimento adquirido, realmente as outras funções que já usei sempre estavam implícitas em outras partes do fonte, por isso funcionavam.
Valeu mesmo, declarando com external ou através do codeblock funcionou perfeito.
LAURO DE OLIVEIRA
Analista/Diretor
(37) 3381 32 11
www.ldosistemas.com.br
Imagem
Responder