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.