ALV com Evento – Usando a classe CL_SALV_TABLE
Problema
Criar uma cópia do relatório ZSALV_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_sflight TYPE TABLE OF ty_flight,
wa_sflight LIKE LINE OF it_sflight.INCLUDE zsalv_alv_event_incl.
DATA: r_event_handler TYPE REF TO lcl_event_handler.
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 do tipo include:
Passo 2: Criar uma classe local para receber e manipular o evento double_click do ALV:
*----------------------------------------------------------------------* * CLASS lcl_event_handler DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: on_user_command FOR EVENT double_click OF cl_salv_events_table IMPORTING row column. ENDCLASS. "lcl_event_handler DEFINITION *----------------------------------------------------------------------* * CLASS lcl_event_handler IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_event_handler IMPLEMENTATION. METHOD on_user_command. MESSAGE i001(00) WITH 'Você deu duplo clique na coluna' column 'e linha ' row. ENDMETHOD. "on_user_command ENDCLASS. "lcl_event_handler IMPLEMENTATION</font>
Passo 3: Criar um objeto e registrar o evento:
…
* Set event handling
r_events = r_table->get_event( ).
CREATE OBJECT r_event_handler.
SET HANDLER r_event_handler->on_user_command FOR r_events.
…
Agora você pode ativar o seu programa e testar.
Execução e Teste
Para executar e testar o programa, apenas pressione F8 ou :


Discussão
Os eventos para a CL_SALV_TABLE são um puco diferentes da CL_GUI_ALV_GRID. Já comentei que a classe CL_SALV_TABLE encapsula as funcionalidades do CL_GUI_ALV_GRID, incluindo os eventos.
Quando trabalhamos com eventos com a técnica “pura”, temos que registrar os eventos e implementar os métodos para tratar esses eventos diretamente da CL_GUI_ALV_GRID. Com as classes “salv” temos uma classe que encapsula os eventos do grid, chamada CL_SALV_EVENTS_TABLE.
O evento que uso nesse problema é o DOUBLE_CLICK que é disparado da classe CL_SALV_EVENTS_TABLE. Veja que no evento DOUBLE_CLICK temos os parâmetros COLUMN, nome da coluna onde ocorreu o evento e ROW, que é o número da linha onde ocorreu o evento evento. Com esses dois parêmetros conseguimos identificar a coluna e a linha em que o usuário deu o duplo clique (usando o READ TABLE … index ROW na tabela de dados do ALV).
Anexos
ZSALV_ALV_EVENT.txt
ZSALV_ALV_EVENT_INCL.txt
Veja Também
ABAP Control Exemples
ALV at SAP Help
Introdução ao ALV – Série Especial
ALV com Evento – Usando a Técnica “Pura”
