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.
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.
- 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)
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 documento | Concluído |
---|---|
Data | 16/01/2015 |
Versão | 1.0 |
Versão anterior | 1.0 |
Autores |