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.
Campo |
---|
Descrição |
---|
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 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.
Bloco de código | ||||
---|---|---|---|---|
| ||||
// 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:
Bloco de código | ||||
---|---|---|---|---|
| ||||
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:
Bloco de código | ||||
---|---|---|---|---|
| ||||
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 := 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" ) //Para criar a ordem por Operação ou Deleção, deve ser usado os campo OPERATI ou DELETE //AAdd( aOrdem, "OPERATI, DELETE" ) 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 |