Em ambientes corporativos, a rastreabilidade das operações é um fator essencial para garantir segurança, transparência e confiabilidade nos processos.
No ERP Protheus, a função GravaCV8 desempenha papel fundamental nesse contexto, permitindo o registro estruturado de logs diretamente na tabela CV8.
Por meio dela, é possível documentar eventos relevantes, como alteração de parâmetros, execução de rotinas ou ocorrências de erros, assegurando que cada ação fique devidamente registrada para futuras consultas ou auditorias.
Essa funcionalidade contribui não apenas para o controle interno, mais também para a melhoria contínua de processos, oferecendo aos usuários uma ferramenta prática e eficiente para acompanhamento das atividades realizadas no sistema.
Para exemplificação da gravação dos logs, criamos um fonte de alteração de parâmetro utilizando a função gravaCV8 para demonstrarmos sua funcionalidade.
#Include "TOTVS.ch"
/*/{Protheus.doc} zBloqDat
Rotina para edição de parâmetros de bloqueio com layout.
Atualiza os parâmetros MV_DATAFIN, MV_DATAFIS, MV_DBLQMOV e MV_ULMES,
registrando log na tabela CV8.
@author Gabriel Dahm
@since 09/07/2025
@version 1.0
@example U_ZBLOQDAT()
*/
User Function zBloqDat()
Local aArea := FWGetArea()
// Declaração de variáveis
Local dDataFin := GetMV("MV_DATAFIN")
Local dDataFis := GetMV("MV_DATAFIS")
Local dDataMov := GetMV("MV_DBLQMOV")
Local dDataEst := GetMV("MV_ULMES")
Local dOldFin, dOldFis, dOldMov, dOldEst
Local cDetalhe := ""
Local aPergs := {}
Local cType := "SX6"
Local cBatchProc := "zBloqDat"
Local cMsg := "Alteração de parâmetros"
Local cSubProc := ""
Local cMsgSubProc := ""
Local lCabec := .T.
// Array com perguntas para o ParamBox
aAdd(aPergs, {1, "Dt. Bloqueio Financeiro", dDataFin, "", ".T.", "", ".T.", 80, .F.})
aAdd(aPergs, {1, "Dt. Bloqueio Fiscal", dDataFis, "", ".T.", "", ".T.", 80, .F.})
aAdd(aPergs, {1, "Dt. Bloqueio Movimentos", dDataMov, "", ".T.", "", ".T.", 80, .F.})
aAdd(aPergs, {1, "Dt. Bloqueio Estoque", dDataEst, "", ".T.", "", ".T.", 80, .F.})
// Exibe ParamBox
If ParamBox(aPergs, "Informe os Parâmetros de Bloqueio")
// Guarda os valores anteriores
dOldFin := dDataFin
dOldFis := dDataFis
dOldMov := dDataMov
dOldEst := dDataEst
// Captura os novos valores inseridos
dDataFin := MV_PAR01
dDataFis := MV_PAR02
dDataMov := MV_PAR03
dDataEst := MV_PAR04
// Atualiza os parâmetros de ambiente
PutMV("MV_DATAFIN", dDataFin)
PutMV("MV_DATAFIS", dDataFis)
PutMV("MV_DBLQMOV", dDataMov)
PutMV("MV_ULMES", dDataEst)
// Monta descrição detalhada para o log
cDetalhe := "MV_DATAFIN estava como [" + DToC(dOldFin) + "] e foi para [" + DToC(dDataFin) + "], " + ;
"MV_DATAFIS estava como [" + DToC(dOldFis) + "] e foi para [" + DToC(dDataFis) + "], " + ;
"MV_DBLQMOV estava como [" + DToC(dOldMov) + "] e foi para [" + DToC(dDataMov) + "], " + ;
"MV_ULMES estava como [" + DToC(dOldEst) + "] e foi para [" + DToC(dDataEst) + "]"
// Grava log na tabela CV8
GravaCV8(cType, cBatchProc, cMsg, cDetalhe, cSubProc, cMsgSubProc, lCabec)
// Mensagem de sucesso
FWAlertSuccess("Parâmetros atualizados com sucesso!", "Confirmação")
EndIf
FWRestArea(aArea)
Return
Abaixo o passo a passo necessário.
1. Definir o contexto do log
Identifique o tipo de evento que será registrado: informação erro ou aviso, determine o processo principal e, se necessário o subprocesso envolvido.
2. Preparar os parâmetros da função.
Configure os valores que serão passados nas funções.
Função: GravaCV8(cType, cBatchProc, cMsg, cDetalhe, cSubProc, cMsgSubProc, lCabec)
- Tipo (cType)
Tipo de log. No exemplo citado utilizamos a tabela”SX6″ para indicar que o log está relacionado a parâmetros da tabela SX6 (tabela de parâmetros do Protheus).
- Processo principal (cBatchProc)
Nome do processo principal ou rotina que está sendo executada. Serve para identificar de onde veio o log.
- Mensagem principal (cMsg)
Mensagem principal registrada. É o título ou resumo do evento que ocorreu.
- Detalhes adicionais (cDetalhe)
Detalhes adicionais. Aqui você construiu uma string mostrando os valores anteriores e os novos de MV_DATAFIN, MV_DATAFIS, MV_DBLQMOV e MV_ULMES (Exemplo).
- Subprocesso (cSubProc)
Nome do subprocesso relacionado.
- Mensagem do subprocesso (cMsgSubProc)
Mensagem específica do subprocesso.
- Cabeçalho (lCabec)
Indica se deve gravar cabeçalho. Como está .T., o log será registrado com cabeçalho inicial.
3. Validar o Registro na tabela CV8.
Após a execução, consulte a tabela CV8 para confirmar que o log foi gravado corretamente, verifique se todos os campos foram preenchidos corretamente de acordo com os parâmetros informados.

4. Utilizar os logs para auditoria e suporte.
Use os registros para acompanhar alterações, identificar falhas e fornecer informações detalhadas em processos de auditoria ou manutenção.
Espero que tenham gostado do conteúdo pessoal.
Um forte abraço.
Artigo redigido por Gabriel Dahm ( LinkedIn ).