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.
O RESULT SET é retornado através da chamada da função FwATTViewLog. Abaixo descrevemos os parâmetros dessa função.
Exemplo de uso
O trecho abaixo foi retirado do relatório padrão do Embedded Audit Trail (CFGR700). Nesse exemplo é definido o range 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.
// 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:
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:
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 aTabelas := {} |
Local aOrdem := {} |
Local cFilter := "" |
Local cOrdem := "" |
Local cOpIn := "" |
Local cAftFilter:= "" |
Local nOrder
Local nOrder := 0 |
Local oSection |
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" ) |
MakeSqlExp(cPerg) |
// Filtro de tabelas |
aTabelas := { Upper( MV_PAR01 ), Upper( MV_PAR02 ) } |
If !Empty(MV_PAR03) |
cFilter += MV_PAR03 // String de filtro em sintaxe SQL |
End
If
End If !Empty(MV_PAR04) |
if !Empty(cFilter) |
cFilter += " AND " |
end |
cFilter += MV_PAR04 // String de filtro em sintaxe SQL |
End
If
End If !Empty(MV_PAR05) |
if !Empty(cFilter) |
cFilter += " AND " |
end |
cFilter += Upper( MV_PAR05 ) // String de filtro em sintaxe SQL |
End
End // Filtro de operação (inclusão, alteração e exclusão) |
cOpIn := "" |
if !Empty(cFilter) |
cFilter += " AND " |
end
If
end If MV_PAR08 == 1 .Or. MV_PAR09 == 1 .Or. MV_PAR10 == 1 |
cOpIn := "( " |
Else |
cOpIn := "( OPERATI=' ' " |
EndIf
If
EndIf If MV_PAR08 == 1 |
If "OPERATI" $ cOpIn |
cOpIn += " OR " |
EndIf |
cOpIn += " OPERATI='I' " |
EndIf
If
EndIf If MV_PAR09 == 1 |
If "OPERATI" $ cOpIn |
cOpIn += " OR " |
EndIf |
cOpIn += " OPERATI='U' " |
EndIf
If
EndIf If MV_PAR10 == 1 |
If "OPERATI" $ cOpIn |
cOpIn += " OR " |
EndIf |
cOpIn += " OPERATI='X' OR OPERATI='D' " |
EndIf
If
EndIf If !Empty( cOpIn ) |
cOpIn += " ) " |
EndIf
cFilter
EndIf cFilter += |
If
cOpIn If !Empty( MV_PAR11 ) |
if !Empty(cFilter) |
cFilter += " AND " |
end |
cFilter += MV_PAR11 |
EndIf
If
EndIf If MV_PAR12 == 2 |
cAftFilter += "TMP_OK<>'2' " |
ElseIf MV_PAR12 == 3 |
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 ] |
oSection:nOrder := 0 |
// 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..." |
oReport:Section(1):cAlias := cAlias |
oReport:Section(1):Print() Return |
Return
Status do documento | Concluído |
---|---|
Data | 16/01/2015 |
Versão | 1.0 |
Versão anterior | 1.0 |
Autores |