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

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

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.

 

Listamos abaixo os campos retornados pelo RESULT SET. Todos os campos são retornados em formato caractere.

                    

  • TMP_FIELD - Nome do campo
  • TMP_COLD - Conteúdo antes da atualização
  • TMP_CNEW - Conteúdo depois da atualização
  • TMP_TYPE - Tipo de dado                     
  • TMP_RECNO - Número de registro
  • TMP_USER - Usuário no Protheus
  • TMP_UDB - Usuário do banco de dados                           
  • TMP_HOSTNAM - IP do Servidor do Protheus
  • TMP_PROGRAM - Nome da rotina principal a partir do menu do Protheus            
  • TMP_OPERATI - 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 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)

 

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