ALV com Evento – Usando a Técnica “Pura”

Problema

Alterar o relatório ZPURE_ALV_FIELDCAT implementado nesse post, para que seja monstrado uma mensagem quando o usuário der um duplo clique.

Nessa mensagem, deve ser apresentado “Você deu duplo clique na coluna & e linha &.”, onde & deverá ser substituído pelo nome da coluna e linha onde ocorreu o duplo clique.

Solução

Passo 1: Criar um novo include no programa principal. Para isso, colocar a instrução INCLUDE na seguinte posição:

 

 

 

 

 

Dar um duplo clique no nome do include e confirmar a criação do novo objeto. Garanta que o novo objeto seja to tipo include:

Passo 2: Criar uma classe local para receber e manipular o evento double_click do ALV:

Passo 3: Criar um objeto e registrar o evento no module PBO:


Agora você pode ativar o seu programa e testar.

Execução e Teste

Para executar e testar o programa, apenas pressione F8 ou :

Dar um duplo clique em qualque linha e aí uma mensagem deverá ser apresentada:

 

Discussão

Introdução a Eventos

Para eventos sempre temos dois objetos envolvidos, um sender e outro handler. Ou seja, um objeto que dispara o evento e outro que recebe o evento.

A principal característica é que o objeto que envia/dispara o evento não sabe quem é que receberá esse evento. Essa é a grande diferênça entre eventos e chamada de métodos. Quando chamamos um método temos que necessariamente saber de qual objeto estamos invocando aquele método.

Um bom exemplo do conceito de eventos é o caso dos passageiros no avião. No avião temos um botão em nossa poltrona que chama o comissário ou comissária para nos atender em alguma solicitação.

Quando apertamos o botão (disparamos um evento) um aviso é dado na “sala de comissários”, e um dos deles virá lhe atender. Repare que você não sabe qual comissário (classe) irá lhe atender, até que o comissário apareça (objeto).

Implementando Eventos

Para implementar um evento, precisamos de 4 passos:

Na classe Sender:

i – Declarar o nome do evento, usando a declaração EVENTS na DEFINITION da classe sender.
ii – Disparar o evento no método onde o evento deve ser disparado, usando o comando RAISE EVENT .

Na classe Handler:

iii – Definir qual método irá responder ao evento, adicionando a cláusula … FOR EVENT FOR .
iv – Registrar o evento, com o comando SET HANDLER.

O registro do evento é responsável por ativar e desativar o evento em tempo de execução (run time).

Voltando ao nosso exemplo do avião, há determinados momentos que os comissários não atenderão a nenhuma solicitação, como por exemplo nas decolagens e aterrisagens. Ou seja, o evento continua sendo disparado (passageiro apertando o botão de chamado) e o sinal continua sendo tocado na “sala de comissários”. No entanto, os comissários não lhe atenderão.

O registro de um evento também pode ser seletivo quando a qual objeto o evento será registrado. Por isso temos FOR ALL INSTANCES no comando SET HANDLER. Nesse ponto, podemos definir para qual objeto queremos registrar o evento.

Isso é vital para os casos que temos mais de um grid na tela e queremos responder ao evento de apenas um deles.

Implementando o Evento no ALV

No programa implementado acima, os passos i e ii já foram implementados pela classe standard CL_GUI_ALV_GRID e não precisamos nos preocupar com isso.

Precisamos apenas definir qual classe e método irá responder ao evento. Além disso devemos registrar o evento.

Para isso, devemos identificar o evento e parâmetros que esse evento usará:

Com o evento selecionado, clicar em para acessar os parâmetros do evento:

Veja que no evento DOUBLE_CLICK temos alguns parâmetros, dentre eles o campo E_COLUMN, nome da coluna onde ocorreu o evento e a estrutura ES_ROW_NO, que contém o campo ROW_ID que é o número da linha onde ocorreu o evento evento.

 

Anexos

NUGG_ZPURE_ALV_EVENT.nugg

Veja Também

ALV at SAP Help
Introdução ao ALV – Série Especial
ALV Simples – Usando a Técnica “Pura”
ALV com Field Catalog – Usando a Técnica “Pura”

 

1 Resultado

  1. Ótimo post!!!

    Bom ver dicas orientadas a objeto.

    Eu costumo registrar um FORM que recebe o evento, mas é muito limitado.
    Não sei porque mas nunca pego programas com ALV orientadas a objeto para manutenção ou expansão. Quando é um novo desenvolvimento, a especificação nunca vem citando classes, nem interfaces para implementar =[, somente módulos de funções…