domingo, 2 de setembro de 2012

Genexus SDT - Criação de Log da Aplicação

Genexus Curso
Bem-vindos a mais um tutorial sobre SDTs no Genexus Developers Blog! Neste tutorial iremos começar a criar um Log para as nossas aplicações a partir de objetos SDTs e Data Providers. Neste Log iremos gravar a inserção/alteração/exclusão realizada na sua respectiva Data/Hora e por qual Usuário e IP.

A Parte I - criação deste tipo de dado, e a Parte II - inserção de valores nos darão a base para esta continuidade.

Antes de começarmos precisamos entender o que é e para que serve este objeto Data Provider. Este objeto não é capaz de realizar modificações na nossa base de dados, ele serve resumidamente para processar dados de forma estruturada (SDT), ou seja, povoar a nossa variável SDT sem precisarmos de todas aqueles comandos (for each, Add, new()).

Neste tutorial irei realizar o seguinte:
  1. Explicar a criação do Objeto Data Provider com case em um SDT;
  2. Explicar os atributos necessários para gravar um histórico;
  3. Explicar a criação da árvore de eventos necessário para a gravação dos logs. 
Através destes conhecimentos, será possível realizar Logs de históricos de dados para as suas aplicações de maneira bem simples.

OK vamos ao trabalho..

Primeiro Passo - Criação das Transações (Cliente, Log)

Para a gravação dos Logs irei utilizar a seguinte estrutura:
Genexus Transação

Onde:
  • Id = Numeric(4)  - AutoIncrement;
  • IP = Character(15);
  • Atividade = Character(1) - Enum Values: C (Cliente);
  • Operação = Character(3) - Enum Values: INS (Inserção); UPD (Alteração); DLT (Exclusão);
  • Historico = LongVarChar;
  • UsuarioLogin = Usuário que realizou a operação.

Já a transação de exemplo terá a seguinte estrutura:
Genexus Curso

Segundo Passo - Criação do SDT e Data Provider (Cliente, Log)

Para cada transação onde será aplicado o o log será necessário criar 1 objeto SDT e 1 objeto Data Provider.

Logo para a Transação Cliente, criamos o objeto SDT_Cliente e arrastamos a transação para dentro, entaão este objeto terá a seguinte estrutura:
Genexus Curso

Após, criamos o objeto DP_Cliente (Data Provider), e arrastamos para dentro de Source o SDT que criamos (SDT_Cliente). Após será necessário incluir a condição where, onde as chaves primárias da transação serão iguais as suas variáveis recebidas como parâmetro:

parm(in:&ClienteCod);
SourceRules

Terceiro Passo - Criação da Procedure de Gravação do Log

Assim que os passos anteriores forem efetuados, podemos criar a nossa Procedure que irá realizar a gravação dos logs. Esta procedure irá receber os parâmetros:
parm(inout:&Atividade, in:&Operacao, in:&LogHistorico, in:&LogAtividadeId);

E o seguinte código (source):

//=====Captura o Usuário que efetuou a operação=====
&UsuarioLogin.FromString(&WebSession.Get('UsuarioLogin'))

//=====Captura o IP=====
&LogIP = RemoteAddr()

//=====Insere novo Log=====
new
 LogDataHora = ServerNow()
 LogHistorico = &LogHistorico 
 LogAtividade = &Atividade
 LogOperacao = &Operacao
 UsuarioLogin = &UsuarioLogin
 LogIp = &LogIP
 LogAtividadeId = &LogAtividadeId
endnew

Quarto Passo - Inserção na Transação das Regras de Inserção

Na transação Cliente, deve adicionar o seguinte código em "Rules":
//=====Adiciona o Tipo de Atividade=====
&Atividade = Atividade.Cliente;

/*
Gravação dos dados no SDT
Se inserção: grava os campos antes do COMMIT
Se alteração ou exclusão: grava os campos antes de se realizar alguma alteração
*/
&SDT_Cliente = DP_Cliente.Udp(ClienteCod) 
 if insert on beforecomplete;
&SDT_Cliente = DP_Cliente.Udp(ClienteCod) 
 if delete or update;
 
/*
Chamar a Procedure de inserção do Log
A Procedure é chamada assim que se realizar o COMMIT
Se alteração: só irá chamar se ocorrer alguma modificação
*/
&LogAtividadeId = ClienteCod.ToString.Trim();

InserirLog.Call(&Atividade, &Mode, &SDT_Cliente.ToXml(), &LogAtividadeId) 
 if insert or delete on aftercomplete;
InserirLog.Call(&Atividade, &Mode, &SDT_Cliente.ToXml(), &LogAtividadeId) 
 if update and Modified() on aftercomplete;

Agora é só homologarmos! Para testar podemos inserir, alterar ou excluir registros através da transação Cliente, teremos um resultado semelhante a este:
Genexus Curso

2 comentários:

  1. tenho uma dúvida: pelo que percebi para gravar o log de dentro da transação (que contém todos os valores já carregados) o Data Provider faz mais um select na tabela para buscar os valores.
    Não seria mais performático popular um sdt com os valores que já estão na transação?

    ResponderExcluir
    Respostas
    1. Oi Leonardo, esta correto! Caso popule os valores através de comandos na transação, não será necessário percorrer a tabela em busca destes valores. Isto seria importante em tabelas de muitos registros, nas demais, esta performance não é reparada em virtude de todas as consultas utilizarem o index da chave primária. A utilização de Data Providers também facilita a digitação dos códigos. Mas sua sacada foi bem pertinente. Abraço

      Excluir