We can use usercommand in alv reports.
The main important steps to follows:
1. Create required buttons using menu painter se41.
Call that in your program screen as follows:
form pf_status using rt_extab type slis_t_extab.
   set pf-status 'LIST'.
endform. "PF_STATUS
Here LIST is the menu name.
PF_STATUS  is the form name.
2. Create event using the following function module REUSE_ALV_EVENTS_GET
form event_get_det1.
  call function 'REUSE_ALV_EVENTS_GET'
    exporting
      i_list_type     = 0
    importing
      et_events       = gt_event_d
    exceptions
      list_type_wrong = 1
      others          = 2.
  if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY 
    NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 
    SY-MSGV4.
  endif.
  data:begin of it_event,
  name(30),
  form(30),
  end of it_event.
  it_event-form = 'USER_COMMAND'.
  read table gt_event with key name = 'USER_COMMAND' transporting no fields.
  modify gt_event_d from it_event index sy-tabix 
  transporting form.
endform.                    "event_get_det1
 gt_event_d is the event name.
 USERCOMMAND must be in caps
3. Write the coding for USERCOMMAND
form user_command using r_ucomm like sy-ucomm
rs_selfield type slis_selfield.
when 'FEED'.
      clear sy-ucomm.
      clear t_fieldalv_uc1[].
      refresh t_fieldalv_uc1[].
      clear i_prps89.
      refresh i_prps89[].
      loop at i_prps87.
        move-corresponding i_prps87 to i_prps89.
        append i_prps89.
        clear i_prps89.
  endloop.
delete i_prps89 where wbs7 <> '80-417' and
wbs7 <> '80-420' and
wbs7 <> '80-421' and
wbs7 <> '80-423' and
wbs7 <> '80-424' and
wbs7 <> '80-425'.
if i_prps89[] is not initial.
perform initial_alv_fieldcat changing t_fieldalv_uc1[].
perform alv-display_uc1.
else.
message 'NO DATA FOUND' type 'I'.
endif.
endcase.
endform.
4. In the main alv display add assign pf-status, usercommane and event
form alv-display .
  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'PF_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout                = layout
      it_fieldcat              = t_fieldalv[]
      it_events                = gt_event_d
      i_save                   = 'A'
    tables
      t_outtab                 = i_prps87.
  if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY 
     NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 
     SY-MSGV4.
  endif.
endform.                    " alv-display
5. Create field catalog for that alv _display  in this initial_alv_fieldcat
6. Call alv_grid isplay function
form alv-display_uc1.
   call function 'REUSE_ALV_GRID_DISPLAY'
   exporting
      i_callback_program = sy-repid
      is_layout = layout
      it_fieldcat = t_fieldalv_uc1[]
      i_save = 'A'
   tables
      t_outtab = i_prps89.
      if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      endif.
endform. "alv-display_uc2


Serkan AKKAVAK
Computer Engineer
ABAP Developer & SAP MM SD Consultant
Contact : serkurumsal@yandex.com