Página 1 de 1
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 08:25
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
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 08:38
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.
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 09:23
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
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 09:50
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.
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 10:23
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
Em todo caso, pra confirmar se existe, use o HBMK2.
hBMK2 -find md5
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 10:37
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.
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 11:41
por LDOSISTEMAS
eu chequei com - find e existe o hb_md5, vou fazer como você indicou.
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 11:49
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.
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 12:58
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 ) }
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 13:26
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.
Gerar o codigo MD5 a partir de uma STRing
Enviado: 05 Jun 2017 13:49
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.