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:
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:
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:
1º Passo: Criação do SDT para comparar os XML's:
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:
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:
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) EndEventE 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