Criação de Log customizado no Protheus

Olá pessoal…

Hoje vou mostrar como criar um log customizado no Protheus, que grava o conteúdo antigo e novo de campos.


O intuito da rotina, é gravar logs em poucos campos, como por exemplo, o bloqueio de produtos (por exemplo, qual usuário bloqueou e quando).

Primeiramente, deverá ser criado a tabela ZD0 de Log de Campos (eu demonstrei como criá-la na função zTstTab, na postagem Criando tabelas, campos e índices “a quente” no Protheus, após criar, será necessário criar a função zCriaLog.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zCriaLog
Função parar criação de logs
@author Atilio
@since 04/05/2015
@version 1.0
	@param cDescri, Caracter, Descrição do Log
	@param cTab, Caracter, Tabela do Log
	@param cCampo, Caracter, Campo do Log
	@param cAntigo, Caracter, Conteúdo antigo do campo do Log
	@param cNovo, Caracter, Conteúdo novo do campo do Log
	@param cChave, Caracter, Chave da tabela do Log
	@param cCont, Caracter, Conteúdo da Chave do Log
	@param nRec, Numérico, RecNO da tabela do Log
	@example
	u_zCriaLog("Alteração campo bloqueio", "SB1", "B1_MSBLQL", "2", "1", "B1_COD", "000001", 5000)
/*/

User Function zCriaLog(cDescri, cTab, cCampo, cAntigo, cNovo, cChave, cCont, nRec)
	Local aArea		:= GetArea()
	Local cSeq			:= ""
	Default cDescri	:= ""
	Default cTab		:= ""
	Default cCampo	:= ""
	Default cAntigo	:= ""
	Default cNovo		:= ""
	Default cChave	:= ""
	Default cCont		:= ""
	Default nRec		:= 0
	
	//Se tiver descrição
	If !Empty(cDescri) 
		//Pegando a próxima sequência
		cSeq := GetSXENum('ZD0', 'ZD0_SEQ')
		
		//Salvando o log
		RecLock("ZD0", .T.)
			ZD0_SEQ		:= cSeq
			ZD0_USRCOD		:= RetCodUsr()
			ZD0_USRNOM		:= UsrRetName(RetCodUsr())
			ZD0_DATA		:= dDataBase
			ZD0_HORA		:= Time()
			ZD0_DESCRI		:= cDescri
			ZD0_FUNC		:= FunName()
			ZD0_FILORI		:= cFilAnt
			ZD0_AMB		:= GetEnvServer()
			ZD0_TAB		:= cTab
			ZD0_CAMPO		:= cCampo
			ZD0_CONANT		:= cAntigo
			ZD0_CONNOV		:= cNovo
			ZD0_CHAVE		:= cChave
			ZD0_CONCHA		:= cCont
			ZD0_REC		:= nRec
		ZD0->(MsUnlock())
		ConfirmSX8()
	EndIf
	
	RestArea(aArea)
Return

Agora basta fazer a chamada da rotina em qualquer ponto de entrada ou função customizada. Será gravado o código do usuário, o nome, a data, a hora, a descrição, a função principal, a filial de origem, o ambiente, a tabela, o campo, o conteúdo antigo, o conteúdo novo, a chave do índice, o conteúdo da chave, e o recno da tabela. Abaixo um exemplo (trecho) de como chamar o log, dentro do ponto de entrada A010TOK (confirmação do cadastro de produtos).

...
	//Se for alteração
	If ALTERA
		MsgInfo("Estou em uma <b>alteração</b>!", ";Atenção")
		
		//Se o produto sofreu alteração no campo de bloqueio
		If SB1->B1_MSBLQL != M->B1_MSBLQL
			//Gera o log
			u_zCriaLog(	"Bloqueio / Desbloqueio de Produto",;			//Descrição
							"SB1",;											//Tabela
							"B1_MSBLQL",;										//Campo
							SB1->B1_MSBLQL,;									//Conteúdo Antigo
							M->B1_MSBLQL,;									//Conteúdo Novo
							"B1_COD",;											//Chave da tabela
							SB1->B1_COD,;										//Conteúdo da chave
							SB1->(RecNo()))									//RecNo
		EndIf
	EndIf
...

Abaixo um print de dois logs gerados:

Exemplo de Log customizado

Exemplo de Log customizado

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação