ABAP 101

ABAP | Ruby on Rails | Programação

ABAP 101 header image 2

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

August 26th, 2009 · 1 Comment

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:


DATA: it_fcat TYPE lvc_t_fcat,
wa_fcat LIKE LINE OF it_fcat.

INCLUDE zpure_alv_fieldcat_handle.

START-OF-SELECTION.

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:

CLASS lcl_event_handler DEFINITION.

PUBLIC SECTION.

METHODS: on_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_column es_row_no.

ENDCLASS. “lcl_event_hanlder DEFINITION

*———————————————————————-*
* CLASS lcl_event_hanlder IMPLEMENTATION
*———————————————————————-*
*
*———————————————————————-*
CLASS lcl_event_handler IMPLEMENTATION.

METHOD on_double_click.

MESSAGE i888(sabapdocu) WITH ‘Você deu duplo clique na coluna ‘
e_column
‘ e linha ‘
es_row_no-row_id.

ENDMETHOD. “on_double_click

ENDCLASS. “lcl_event_hanlder IMPLEMENTATION

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

CREATE OBJECT r_handle.
SET HANDLER r_handle->on_double_click FOR ALL INSTANCES.

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

ZPURE_ALV_FIELDCAT_event.txt
ZPURE_ALV_FIELDCAT_HANDLE.txt
ZPURE_ALV_FIELDCAT_INCL_event.txt

Veja Também

ABAP Control Exemples
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”

Tags: ALV · Receita ABAP

1 response so far ↓

  • 1 William Antônio Siqueira // Sep 11, 2009 at 7:39 am

    Ó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…

Leave a Comment