This sample show how we use cl_gui_alv_grid protected events... When you execute this example
you can sort your data when you single click on column header...

P.S. Please refer this site when you are using my examples. Thanks


*&---------------------------------------------------------------------*
*& Report  ZUS_SDN_ALV_SINGLE_COL_HEADER
*&
*&---------------------------------------------------------------------*
*& Thread: cl_gui_alv_grid protected events
*& https://forums.sdn.sap.com/thread.jspa?threadID=914943&tstart=0
*&---------------------------------------------------------------------*

REPORT  ZUS_SDN_ALV_SINGLE_COL_HEADER.

TYPE-POOLS: abap, cntb, icon.

TYPES: BEGIN OF ty_s_outtab.
INCLUDE TYPE vbak AS vbak.
TYPES: celltab    TYPE lvc_t_styl.
TYPES: END OF ty_s_outtab.
TYPES: ty_t_outtab    TYPE STANDARD TABLE OF ty_s_outtab
                      WITH DEFAULT KEY.

DATA: gt_outtab   TYPE ty_t_outtab.

DATA:
  gd_okcode       TYPE ui_func,
  gd_repid        TYPE syrepid,
  gt_fcat         TYPE lvc_t_fcat,
  gs_layout       TYPE lvc_s_layo,
  gs_variant      TYPE disvariant,
*
  go_docking      TYPE REF TO cl_gui_docking_container,
  go_grid         TYPE REF TO cl_gui_alv_grid.

*----------------------------------------------------------------------*
*       CLASS lcl_eventhandler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_eventhandler DEFINITION.

  public section.
    class-methods:
      handle_user_command
        for EVENT user_command of cl_gui_alv_grid
        importing
          e_ucomm
          sender.

ENDCLASS.                    "lcl_eventhandler DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_eventhandler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_eventhandler IMPLEMENTATION.

  method handle_user_command.

    break-point.
    endmethod.

ENDCLASS.                    "lcl_eventhandler IMPLEMENTATION

PARAMETER:
  p_active  as CHECKBOX.

START-OF-SELECTION.

  PERFORM init_controls.

  PERFORM build_fieldcatalog.
  PERFORM set_layout_and_variant.

  PERFORM build_outtab.
  PERFORM display_outtab.

**  set handler:
**    lcl_eventhandler=>handle_user_command for go_grid.

  gd_repid = syst-repid.
  CALL METHOD go_docking->link
    EXPORTING
      repid                       = gd_repid
      dynnr                       = '0100'
*      CONTAINER                   =
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      lifetime_dynpro_dynpro_link = 3
      OTHERS                      = 4.
  IF sy-subrc  0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  CALL SCREEN '0100'.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'MAIN_0100'.
*  SET TITLEBAR 'xxx'.

  CALL METHOD go_grid->refresh_table_display
*    EXPORTING
*      IS_STABLE      =
*      I_SOFT_REFRESH =
    EXCEPTIONS
      finished       = 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.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  TRANSLATE gd_okcode TO UPPER CASE.
  CASE gd_okcode.
    WHEN 'BACK' OR
         'EXIT' OR
         'CANC'.
      SET SCREEN 0. LEAVE SCREEN.

    WHEN 'APPEND'.
      PERFORM append_row.

    WHEN 'EDIT'.
      PERFORM edit_row.

    WHEN OTHERS.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*
*&      Form  INIT_CONTROLS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_controls .

  CREATE OBJECT go_docking
    EXPORTING
      parent                      = cl_gui_container=>screen0
*      REPID                       =
*      DYNNR                       =
*      SIDE                        = DOCK_AT_LEFT
*      EXTENSION                   = 50
*      STYLE                       =
*      LIFETIME                    = lifetime_default
*      CAPTION                     =
*      METRIC                      = 0
      ratio                       = 90
*      NO_AUTODEF_PROGID_DYNNR     =
*      NAME                        =
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                      = 6.
  IF sy-subrc  0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  CALL METHOD go_docking->set_extension
    EXPORTING
      extension  = 99999
    EXCEPTIONS
      cntl_error = 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.

  CREATE OBJECT go_grid
    EXPORTING
*      I_SHELLSTYLE      = 0
*      I_LIFETIME        =
      i_parent          = go_docking
*      I_APPL_EVENTS     = space
*      I_PARENTDBG       =
*      I_APPLOGPARENT    =
*      I_GRAPHICSPARENT  =
*      I_NAME            =
*      I_FCAT_COMPLETE   = SPACE
    EXCEPTIONS
      error_cntl_create = 1
      error_cntl_init   = 2
      error_cntl_link   = 3
      error_dp_create   = 4
      OTHERS            = 5.
  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.                    " INIT_CONTROLS
*&---------------------------------------------------------------------*
*&      Form  build_fieldcatalog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcatalog .

  REFRESH: gt_fcat.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE              =
      i_structure_name             = 'VBAK'
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_BYPASSING_BUFFER           =
*     I_INTERNAL_TABNAME           =
    CHANGING
      ct_fieldcat                  = gt_fcat
   EXCEPTIONS
     inconsistent_interface       = 1
     program_error                = 2
     OTHERS                       = 3.
  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.                    " build_fieldcatalog
*&---------------------------------------------------------------------*
*&      Form  set_layout_and_variant
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_layout_and_variant .

  CLEAR: gs_layout,
         gs_variant.

  gs_layout-zebra      = abap_true.
  gs_layout-cwidth_opt = abap_true.
  gs_layout-edit       = abap_true. " Grid editable
  gs_layout-stylefname = 'CELLTAB'. " set editable/non-editable

  gs_layout-sgl_clk_hd = p_active. " Single click in (col) header

ENDFORM.                    " set_layout_and_variant
*&---------------------------------------------------------------------*
*&      Form  BUILD_OUTTAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_outtab .
* define local data
  DATA: ls_outtab   TYPE ty_s_outtab,
        ls_fcat     TYPE lvc_s_fcat,
        ls_celltab  TYPE lvc_s_styl.

  SELECT * FROM  vbak INTO CORRESPONDING FIELDS OF TABLE gt_outtab
         UP TO 100 ROWS.

  " Editability of the initially displayed rows is inactivated
  CLEAR: ls_outtab.
  LOOP AT gt_fcat INTO ls_fcat.
    ls_celltab-fieldname = ls_fcat-fieldname.
    ls_celltab-style     = cl_gui_alv_grid=>mc_style_disabled.

    INSERT ls_celltab INTO TABLE ls_outtab-celltab. " sorted itab !!!
  ENDLOOP.

  MODIFY gt_outtab FROM ls_outtab
    TRANSPORTING celltab
    WHERE ( table_line IS NOT INITIAL ).

ENDFORM.                    " BUILD_OUTTAB
*&---------------------------------------------------------------------*
*&      Form  APPEND_ROW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM append_row .
* define local data
  DATA: ls_outtab   TYPE ty_s_outtab,
        ls_fcat     TYPE lvc_s_fcat,
        ls_celltab  TYPE lvc_s_styl.

  " Editability of the initially displayed rows is inactivated
  CLEAR: ls_outtab.
  LOOP AT gt_fcat INTO ls_fcat.
    ls_celltab-fieldname = ls_fcat-fieldname.
    ls_celltab-style     = cl_gui_alv_grid=>mc_style_disabled.

    INSERT ls_celltab INTO TABLE ls_outtab-celltab. " sorted itab !!!
  ENDLOOP.

  APPEND ls_outtab TO gt_outtab.

ENDFORM.                    " APPEND_ROW
*&---------------------------------------------------------------------*
*&      Form  EDIT_ROW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM edit_row .
* define local data
  DATA: ls_outtab   TYPE ty_s_outtab,
        ls_row      TYPE lvc_s_row,
        lt_rows     TYPE lvc_t_row.

  CALL METHOD go_grid->get_selected_rows
    IMPORTING
      et_index_rows = lt_rows
*      ET_ROW_NO     =
      .

  IF ( lt_rows IS INITIAL ).
    MESSAGE 'Select at least a single row' TYPE 'S'.
    RETURN.
  ENDIF.

  REFRESH: ls_outtab-celltab.
  LOOP AT lt_rows INTO ls_row.
    MODIFY gt_outtab FROM ls_outtab INDEX ls_row-index
      TRANSPORTING celltab.
  ENDLOOP.

ENDFORM.                    " EDIT_ROW

*&---------------------------------------------------------------------*
*&      Form  DISPLAY_OUTTAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_outtab .

  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
*      I_BUFFER_ACTIVE               =
*      I_BYPASSING_BUFFER            =
*      I_CONSISTENCY_CHECK           =
*      I_STRUCTURE_NAME              =
      is_variant                    = gs_variant
      i_save                        = 'A'
*      I_DEFAULT                     = 'X'
      is_layout                     = gs_layout
*      IS_PRINT                      =
*      IT_SPECIAL_GROUPS             =
*      IT_TOOLBAR_EXCLUDING          =
*      IT_HYPERLINK                  =
*      IT_ALV_GRAPHICS               =
*      IT_EXCEPT_QINFO               =
*      IR_SALV_ADAPTER               =
    CHANGING
      it_outtab                     = gt_outtab
      it_fieldcatalog               = gt_fcat
*      IT_SORT                       =
*      IT_FILTER                     =
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  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.                    " DISPLAY_OUTTAB