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 :

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

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”

Você pode gostar...