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:
Bom pessoal, por hoje é só.
Abraços e até a próxima.
