Introdução
A API de consulta do Embedded Audit Trail permite que os desenvolvedores construam relatórios e consultas de auditoria de forma simples, rápida e segura.
Além da facilidade de uso, a API isola o desenvolvedor da consulta das tabelas reais de auditoria, impedindo o acesso direto às mesmas, o que se traduz em segurança para o Administrador do banco de dados e para o próprio desenvolvedor.
Modo de uso
O princípio básico da API é disponibilizar ao desenvolvedor um conjunto de resultados (result set) padronizado, baseado nos filtros e parâmetros disponíveis. O desenvolvedor poderá então utilizar o RESULT SET como desejar, empregando-o em relatórios ou consultas de tela. Diversos campos estão disponíveis para filtro diretamente na função de chamada, mas o desenvolvedor, de posse do RESULT SET, poderá efetuar filtros adicionais ou transformar os dados na camada ADVPL.
A API efetuará a consulta nas tabelas de auditoria do grupo de empresas do ambiente em que o usuário está "logado".
Listamos abaixo os campos retornados pelo RESULT SET. Todos os campos são retornados em formato caractere.
- - | Conteúdo antes da atualização |
TMP_CNEW |
- | Conteúdo depois da atualização |
TMP_TYPE |
- dado - | Número de registro |
TMP_USER |
- | Usuário no Protheus |
TMP_UDB |
- dados - | IP do Servidor do Protheus |
TMP_PROGRAM |
- | Nome da rotina principal a partir do menu do |
Protheus - | Operação no banco de dados (inclusão, alteração, exclusão) |
TMP_DTIME |
- | Campo composto de data e hora |
TMP_UNQ |
- | Chave única do registro |
TMP_OK |
- | indica se o registro do log é confiável ou foi adulterado |
O RESULT SET é retornado através da chamada da função FwATTViewLog. Abaixo descrevemos os parâmetros dessa função.
- aTables – Array que indica o intervalo de tabelas que serão analisadas. O elemento 1 de aTables define a tabela inicial e o elemento 2 a tabela final. Não é necessário que todas as tabelas do intervalo estejam sendo auditadas. Exemplo: {“SA1”,“SZZ”}
- cFilter – Filtro de seleção em sintaxe SQL. Podem ser utilizados todos os campos de retorno nessa string, exceto o campo TMP_OK.
- cOrdem – Instrução de ordenação em sintaxe SQL sem a cláusula ORDER BY. Podem ser utilizados todos os campos de retorno nessa string.
- cAftFilter – Filtro utilizado após a consolidação dos dados. Utilizado especificamente para filtrar o campo TMP_OK pois seu conteúdo é construído posteriormente.
- dDataDe – Filtro de data inicial. Deve ser passado parâmetro em formato Date do ADVPL
- dDataAte – Filtro de data final. Deve ser passado parâmetro em formato Date do ADVPL
Exemplo de uso
O trecho abaixo foi retirado do relatório padrão do Embedded Audit Trail (CFGR700). Nesse exemplo é definido o range o intervalo de tabelas iniciais e finais, a string de filtro baseada em parâmetros do relatório, o cAfterFilter para filtrar o campo TMP_OK e os filtros de datas iniciais e finais.
Posteriormente é chamada a função FwATTViewLog processada a consulta e recebido o nome do RESULTSET na variável cAlias.
Bloco de código |
---|
|
// Chamada da API de consulta ao Embedded Audit Trail |
FWMsgRun(,{|| cAlias := FwATTViewLog(aTabelas,cFilter,cOrdem,cAftFilter,MV_PAR06,MV_PAR07) } , , STR0035 ) // "Consultando banco de dados..." |
O RESULTSET poderia ser lido em uma estrutura do tipo While !Eof(), dbSkip(), EndDo, como se fosse o resultado de uma query tradicional disparada no Protheus. O “Alias” da query é aquele retornado pela função FWATTViewLog (variável cAlias).
Neste exemplo, no entanto, trata-se de um relatório usando a classe tReport. Nesse caso, o RESULTSET é passado ao TReport como descrito abaixo:
Bloco de código |
---|
|
oReport:Section(1):cAlias := cAlias |
Após o termino do processo ou consulta, deve-se utilizar a função FwATTDropLog passando como parâmetro o nome do resultset:
Bloco de código |
---|
|
FwATTDropLog(cAlias) |
Esta função efetua a exclusão da área de trabalho temporária.
Trecho de código, programa CFGR700
Bloco de código |
---|
|
Static Function PrintReport(oReport,cPerg,cAlias) |
Local cOpIn
Local nOrder
AAdd( aOrdem, "TMP_DTIME, TMP_FIELD, TMP_USER" ) |
AAdd( aOrdem, "TMP_FIELD, TMP_USER, TMP_DTIME" ) |
AAdd( aOrdem, "TMP_FIELD, TMP_DTIME, TMP_USER" ) |
AAdd( aOrdem, "TMP_DTIME, TMP_USER, TMP_FIELD" ) |
AAdd( aOrdem, "TMP_USER, TMP_DTIME, TMP_FIELD" ) |
AAdd( aOrdem, "TMP_USER, TMP_FIELD, TMP_DTIME" ) |
AAdd( aOrdem, "TMP_PROGRAM, TMP_FIELD, TMP_USER" ) |
AAdd( aOrdem, "TMP_HOSTNAM, TMP_USER, TMP_DTIME" |
)
)
//Para criar a ordem por Operação ou Deleção, deve ser usado os campo OPERATI ou DELETE
//AAdd( aOrdem, "OPERATI, DELETE" )
MakeSqlExp(cPerg) |
aTabelas := { Upper( MV_PAR01 ), Upper( MV_PAR02 ) } |
cFilter += MV_PAR03 // String de filtro em sintaxe SQL |
End
If
cFilter += MV_PAR04 // String de filtro em sintaxe SQL |
End
If
cFilter += Upper( MV_PAR05 ) // String de filtro em sintaxe SQL |
End
End
// Filtro de operação (inclusão, alteração e exclusão) |
end
If
end
If MV_PAR08 == 1 .Or. MV_PAR09 == 1 .Or. MV_PAR10 == 1 |
cOpIn := "( OPERATI=' ' " |
EndIf
If
EndIf
If
EndIf
If
cOpIn += " OPERATI='X' OR OPERATI='D' " |
EndIf
If EndIf
cFiltercOpIn
If cOpIn
If !Empty( MV_PAR11 ) |
EndIf
If
cAftFilter += "TMP_OK<>'2' " |
cAftFilter += "TMP_OK='2' " |
EndIf
oSection
EndIf
oSection := oReport:Section( 1 ) |
nOrder := oSection:nOrder |
// Definição da string de ordem baseado na escolha do usuário |
cOrdem := aOrdem[ nOrder ] |
// Chamada da API de consulta ao Embedded Audit Trail |
FwATTViewLog FwATTViewLog(aTabelas,cFilter,cOrdem,cAftFilter,MV_PAR06,MV_PAR07) } , , STR0035 ) // "Consultando banco de dados..." |
oReport:Section(1):cAlias := cAlias |
oReport:Section(1):Print() |
Return