Páginas filhas
  • Embedded Audit Trail - API de consulta

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.

 

CampoDescrição
TMP_FIELDNome do campo
TMP_COLDConteúdo antes da atualização
TMP_CNEWConteúdo depois da atualização
TMP_TYPETipo de dado    
TMP_RECNONúmero de registro
TMP_USERUsuário no Protheus
TMP_UDBUsuário do banco de dados 
TMP_HOSTNAMIP do Servidor do Protheus
TMP_PROGRAMNome da rotina principal a partir do menu do Protheus   
TMP_OPERATIOperação no banco de dados (inclusão, alteração, exclusão)
TMP_DTIMECampo composto de data e hora
TMP_UNQChave única do registro                 
TMP_OKindica 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 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.

 

 
// 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

 

Static Function PrintReport(oReport,cPerg,cAlias)

Local aTabelas  := {}
Local aOrdem    := {}

Local cFilter   := ""
Local cOrdem    := ""
Local cOpIn     := ""
Local cAftFilter:= ""

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 !Empty(MV_PAR04)
       if !Empty(cFilter)
             cFilter += " AND "
       end
       cFilter += MV_PAR04 // String de filtro em sintaxe SQL

End

If !Empty(MV_PAR05)
       if !Empty(cFilter)
             cFilter += " AND "
       end
       cFilter += Upper( MV_PAR05 ) // String de filtro em sintaxe SQL

End


// Filtro de operação (inclusão, alteração e exclusão)

cOpIn := ""
if !Empty(cFilter)
       cFilter += " AND "
end

If MV_PAR08 == 1 .Or. MV_PAR09 == 1 .Or. MV_PAR10 == 1
       cOpIn := "( "
Else
       cOpIn := "( OPERATI=' ' "
EndIf

If MV_PAR08 == 1

       If "OPERATI" $ cOpIn
             cOpIn += " OR "
       EndIf

       cOpIn += " OPERATI='I' "
EndIf

If MV_PAR09 == 1

       If "OPERATI" $ cOpIn
             cOpIn += " OR "
       EndIf
       cOpIn += " OPERATI='U' "
EndIf

If MV_PAR10 == 1

       If "OPERATI" $ cOpIn
             cOpIn += " OR "
       EndIf

       cOpIn += " OPERATI='X' OR OPERATI='D' "
EndIf

If !Empty( cOpIn )
       cOpIn += " ) "
EndIf

cFilter += cOpIn


If !Empty( MV_PAR11 )
       if !Empty(cFilter)
             cFilter += " AND "
       end

       cFilter += MV_PAR11
EndIf

If MV_PAR12 == 2
       cAftFilter += "TMP_OK<>'2' "
ElseIf MV_PAR12 == 3
       cAftFilter += "TMP_OK='2' "
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

 

 

Status do documentoConcluído
Data16/01/2015
Versão1.0
Versão anterior1.0
Autores

Sergio Luis De Alcantara Silveira

  • Sem rótulos