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.
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:
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
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 |