terça-feira, 23 de outubro de 2012

Desenvolvimento - Gerenciamento de Históricos

Dando continuidade aos antigos posts, hoje iremos conhecer um modo muito interessante de gerenciar as ações de inserções, alterações e exclusões realizadas através das nossas aplicações. 

Em muitos projetos percebemos a intenção dos nossos clientes em controlar quem, quando e qual foi a ação realizada pelos usuários do sistema, isto é, qual usuário realizou uma certa inserção de um registro, quando isso foi realizado, em termos de data/hora e IP, e o mais importante, quais foram os dados informados.

A partir do post, "Genexus SDT - Criação de Log da Aplicação", iremos realizar a leituras destes XML's criados (visualizar leitura de XML a partir do post "Genexus - Leitura de XML" ), compará-los com outros históricos, ou então com a posição atual deste registro, para por último, obtermos um grid que demonstra a  comparação dos atributos em suas determinadas datas. No final teremos uma Web Form semelhante a esta:

Genexus XML

Vídeo do exemplo em ação:



obs.: utilize como apoio o post "Criação de Log da Aplicação".

1º Passo: Criação do SDT para comparar os XML's:

Genexus SDT

2º Passo: Geração de um WokWith para a Transação Log:

Nesta Web Form foi adicionado um Web Component a direita do grid principal, além disto, as propriedades deste grid principal foram setadas conforme a figura abaixo:

Genexus Propriedades

No mesmo Work With, na aba de  "Eventos" foram incluídos os códigos abaixo:
Event Grid.Load
 //=====Variaveis presente no grid de Log=====
 &aLogId = LogId
 &aLogAtividade = LogAtividade
 &aLogAtividadeId = LogAtividadeId
 
 //=====Evento Visualizar=====
 &Display.Link = Log.Link(TrnMode.Display, LogId)
EndEvent

Event TrackContext(&aLogId)
 //=====Cria Web Component ao selecionar linha do grid=====
 WebComp1.Object = WWLogComparar.Create(&aLogId,&aLogAtividade,&aLogAtividadeId)
 
 //=====Apresenta Botão de comparação com posição atual=====
 ButtonCompararAtual.Visible = 1
EndEvent
Pronto, agora ao selecionar uma linha do nosso Grid de Logs, à direita irão aparecer todos os log existentes para esta mesma atividade e mesmo Id, com exceção daquele log selecionado. Vide imagem abaixo:

Genexus Web Component

3º Passo: Comparação entre dois logs selecionados.

Bom pessoal então, ao clicar sobre uma linha da Work With, irá ser criado um Web Component que contém somente um Grid praticamente idêntico, inclusive com as mesma propriedades. Esta Web Componente contém a Regra parm:
parm(in:&aLogId,in:&aLogAtividade,in:&aLogAtividadeId);
Os eventos:
Event Grid.Load
 //=====Variavel presente no grid de Log=====
 &bLogId = LogId
EndEvent

Event TrackContext(&bLogId)
 /*
 Ao selecionar linha chama Web Panel HistoricoComparacao levando as variáveis:
 &aLogId = recebida como parâmetro
 &aLogAtividade = recebida como parâmetro
 &bLogId = linha selecionado
 */
 HistoricoComparacao.Call(&aLogId,&bLogId,&aLogAtividade)
EndEvent
E as condições (referentes ao Grid):
//=====Não mostrar o mesmo Log para seleção=====
LogId <> &aLogId;

//=====Log de mesma Atividade=====
LogAtividade = &aLogAtividade;

//=====Logs do mesmo registro (Id)=====
LogAtividadeId = &aLogAtividadeId;

4º Passo: Criação da Web Panel de Comparação entre os logs selecionados em cada Grid.

Neste quarto e último passo, vamos receber as Ids dos log selecionados, ler o XML de cada um destes e por fim, mediante o tipo de variável XMLReader, vamos incluir no nosso SDT de comparação e mostrá-lo em tela.

Pode ter ficado um pouco confuso, mas vamos devagar, primeiro - receber as Ids através da regra parm:
parm(in:&aLogId,in:&bLogId,in:&aLogAtividade);
Após, adicionar o código em eventos (contendo a busca e leitura do XML e a inserção no SDT):
Event Start
 //=====Captura Campos do 1º Histórico selecionado=====
 for each
    where LogId = &aLogId
    &LogHistorico = LogHistorico
    &aLogDataHora = LogDataHora
    &aOperacao = LogOperacao.EnumerationDescription()
    &aUsuarioNome = UsuarioNome
 endfor
 do 'LeXML'
 
 //=====Captura Campos do 2º Histórico selecionado=====
 
 //=====Se NÃO FOR Posição Atual=====
 if not &bLogId.IsEmpty()
    for each
      where LogId = &bLogId
      &LogHistorico = LogHistorico
      &bLogDataHora = LogDataHora
      &bOperacao = LogOperacao.EnumerationDescription()
      &bUsuarioNome = UsuarioNome
    endfor
    ctlHistoricoB.Title = &bOperacao.Trim()+' - '+&bLogDataHora.ToString().Trim()
 
 //=====Se FOR Posição Atual=====
 else
    do 'PreencheSDT'
    &bUsuarioNome = ''
    ctlHistoricoB.Title = 'Posição Atual'
 endif

 ctlHistoricoA.Title = &aOperacao.Trim()+' - '+&aLogDataHora.ToString().Trim()
 do 'LeXMLComparativo'
 
 //=====Adiciona Usuários de cada Histórico=====
 &SDT_CompararItem = new()
 &SDT_CompararItem.Atributo = 'Realizado por'
 &SDT_CompararItem.HistoricoA = &aUsuarioNome
 &SDT_CompararItem.HistoricoB = &bUsuarioNome
 &SDT_Comparar.Add(&SDT_CompararItem)
EndEvent

Event Grid1.Load
 //=====Se linha do Histórico A for <> de Histórico B, pinta de amarelo=====
 if &SDT_Comparar.CurrentItem.HistoricoA <> &SDT_Comparar.CurrentItem.HistoricoB
    ctlAtributo.BackColor = RGB(255,255,1)
    ctlHistoricoA.BackColor = RGB(255,255,1)
    ctlHistoricoB.BackColor = RGB(255,255,1)
 endif
EndEvent

Sub 'PreencheSDT'
 //=====Verifica a Atividade para Capturar Chave Primária=====
 do case
    case &aLogAtividade = Atividade.Cliente
      &SDT_Cliente.FromXml(&LogHistorico)
      &SDT_Cliente = DP_Cliente.Udp(&SDT_Cliente.ClienteCod) 
      &LogHistorico = &SDT_Cliente.ToXml()
 endcase
EndSub

Sub 'LeXML'
 //=====Abre o documento XML de um atributo/variavel interna=====
 &XMLReader.OpenFromString(&LogHistorico)
 
 //=====Realizar a seguinte rotina enquanto não atingir o fim=====
 do while &XMLReader.EOF <> true
   &i += 1
  
   //=====Ler a próxima Tag=====
   &XMLReader.Read()
  
   //=====Captura o Nome do Elemento=====
   &ElementName = &XMLReader.Name
  
   //=====Captura o Valor do Elemento=====
   &ElementValue = &XMLReader.Value
  
   //=====Se não for as Tags de abertura/fechamento do SDT=====
   if not &ElementName like 'SDT_%'
   
     //=====Adiciona ao SDT - Grid=====
     &SDT_CompararItem = new()
     &SDT_CompararItem.Atributo = &ElementName
     &SDT_CompararItem.HistoricoA = &ElementValue
     &SDT_Comparar.Add(&SDT_CompararItem)
   endif
 enddo
 
 //=====Fecha a leitura do XML=====
 &XMLReader.Close()
EndSub

Sub 'LeXMLComparativo'
 //=====Abre o documento XML de um atributo/variavel interna=====
 &XMLReader.OpenFromString(&LogHistorico)
 
 //=====Realizar a seguinte rotina enquanto não atingir o fim=====
 do while &XMLReader.EOF <> true
   &i += 1
  
   //=====Ler a próxima Tag=====
   &XMLReader.Read()
  
   //=====Captura o Nome do Elemento=====
   &ElementName = &XMLReader.Name
  
   //=====Captura o Valor do Elemento=====
   &ElementValue = &XMLReader.Value
  
   //=====Se não for as Tags de abertura/fechamento do SDT=====
   if not &ElementName like 'SDT_%'
   
     //=====Adiciona ao SDT - Grid=====
     for &SDT_CompararItem in &SDT_Comparar
       if &SDT_CompararItem.Atributo = &ElementName
         &SDT_CompararItem.HistoricoB = &ElementValue
       endif
     endfor
   endif
 enddo
 
 //=====Fecha a leitura do XML=====
 &XMLReader.Close()
EndSub


Nenhum comentário:

Postar um comentário