Hi!
In ALV OO model it is pretty simple.
Here is an example. It is not suitable for copy and paste, but it is good for understanding.
CLASS lcl_app DEFINITION CREATE PRIVATE FINAL.
PUBLIC SECTION.
PRIVATE SECTION.
CONSTANTS: btn_delete TYPE salv_de_function VALUE 'BTN_DELETE'.
DATA: salv_table TYPE REF TO cl_salv_table.
METHODS:
METHODS:
handle_added_function FOR EVENT added_function OF cl_salv_events_table
IMPORTING
e_salv_function.
METHODS:
handle_btn_delete.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
METHOD display_report.
DATA: lr_events TYPE REF TO cl_salv_events_table.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = me->salv_table
CHANGING
t_table = me->report_data ).
CATCH cx_salv_msg .
ENDTRY.
* Event handling
lr_events = me->salv_table->get_event( ).
SET HANDLER me->handle_added_function FOR lr_events.
me->salv_table->display( ).
ENDMETHOD.
METHOD handle_added_function.
CASE e_salv_function.
WHEN btn_delete.
me->handle_btn_delete( ).
ENDCASE.
ENDMETHOD.
METHOD handle_btn_delete.
DATA: lr_selections TYPE REF TO cl_salv_selections,
lt_sel_rows TYPE salv_t_row,
lv_sel_row LIKE LINE OF lt_sel_rows,
lv_n_rows TYPE i,
lv_answer TYPE c LENGTH 1.
lr_selections = me->salv_table->get_selections( ).
lt_sel_rows = lr_selections->get_selected_rows( ).
lv_n_rows = lines( lt_sel_rows ).
CASE lv_n_rows.
WHEN 1. " ok
WHEN OTHERS.
MESSAGE ... " Please select exactly 1 row!
ENDCASE.
* Get the record to delete
READ TABLE lt_sel_rows INTO lv_sel_row INDEX 1.
IF sy-subrc <> 0.
MESSAGE " something goes wrong!
ENDIF.
READ TABLE me->report_data INTO ls_del_rpt_rec INDEX lv_sel_row.
IF sy-subrc <> 0.
MESSAGE ... " something is wrong!
ENDIF.
* Delete record from the table
delete me->report_data index lv_sel_row.
* Refresh ALV
me->salv_table->refresh( refresh_mode = if_salv_c_refresh=>full ).
ENDMETHOD.
ENDCLASS.