Saturday, March 26, 2011

Custom F4 in Editable ALV

This simple proram demonstrates how to add custom F4 to a field in editable ALV using class cl_gui_alv_grid.


REPORT zvv_test.


**********************************************************************
*  GLOBAL DATA DECLARATION
**********************************************************************

TYPES: BEGIN OF ty_data,
              state(10),
       END OF ty_data.

DATA: gv_cont_0100      TYPE REF TO cl_gui_custom_container,
      gv_grid_0100      TYPE REF TO cl_gui_alv_grid,
      gs_f4             TYPE lvc_s_f4,
      gt_f4             TYPE lvc_t_f4,
      gt_data           TYPE TABLE OF ty_data,
      gt_ret            TYPE TABLE OF ddshretval,
      gs_layo_0100      TYPE lvc_s_layo,
      gs_fieldcat_0100  TYPE lvc_s_fcat,
      gt_fieldcat_0100  TYPE lvc_t_fcat,
      gt_exclude_0100   TYPE ui_functions,
      gs_exclude             TYPE ui_func,
      gv_change.

TYPES: BEGIN OF t_rel_disp,
                  report(10),
                  state(10),
       END OF t_rel_disp.

DATA: gt_rel_disp TYPE TABLE OF t_rel_disp.
DATA: w_rel_disp TYPE t_rel_disp.

CONSTANTS: gc_x          VALUE 'X'.

FIELD-SYMBOLS: TYPE lvc_t_modi.

**********************************************************************
* LOCAL CLASS DEFINITION
**********************************************************************

*Class definition to handle the ONF4 event

CLASS lcl_event_handler DEFINITION.

  PUBLIC SECTION.

    METHODS: on_f4 FOR EVENT onf4 OF cl_gui_alv_grid
                   IMPORTING sender
                             e_fieldname
                             e_fieldvalue
                             es_row_no
                             er_event_data
                             et_bad_cells
                             e_display.

    METHODS: data_change FOR EVENT data_changed OF cl_gui_alv_grid
                         IMPORTING er_data_changed
                                   e_onf4.

ENDCLASS.                    "lcl_event_handler DEFINITION


**********************************************************************
*   LOCAL CLASS IMPLEMENTATION
**********************************************************************

*Class implementation to handle the ONF4 event

CLASS lcl_event_handler IMPLEMENTATION.

  METHOD on_f4.

    DATA: ls_modi          TYPE lvc_s_modi.
*
**********************************************************************
* Add the custom F4 values
**********************************************************************
*
    TYPE-POOLS: slis.
*
*
    DATA: w_top TYPE setid.
    DATA: i_hier_sets TYPE TABLE OF sethier.
    DATA: w_hier_sets TYPE sethier.

    TYPES: BEGIN OF t_outtab_popup,
                      setid    TYPE setid,
                      descript TYPE  settext,
           END OF t_outtab_popup.

    DATA: w_outtab_popup TYPE t_outtab_popup.

    DATA: gt_outtab_popup TYPE TABLE OF t_outtab_popup.

    DATA: gs_private TYPE slis_data_caller_exit.
    DATA: gs_selfield TYPE slis_selfield.
    DATA: gt_fieldcat_popup TYPE TABLE OF slis_fieldcat_alv.
    DATA: gs_fieldcat_popup TYPE slis_fieldcat_alv.
    DATA: g_exit(1) TYPE c.

    DATA: w_title TYPE sy-title VALUE '  Select the Hierarchy area'.

    w_outtab_popup-setid = 1.
    w_outtab_popup-descript = 'Test1'.
    APPEND w_outtab_popup to gt_outtab_popup.

        w_outtab_popup-setid = 2.
    w_outtab_popup-descript = 'Test2'.
    APPEND w_outtab_popup to gt_outtab_popup.

        w_outtab_popup-setid = 3.
    w_outtab_popup-descript = 'Test3'.
    APPEND w_outtab_popup to gt_outtab_popup.

        w_outtab_popup-setid = 4.
    w_outtab_popup-descript = 'Test4'.
    APPEND w_outtab_popup to gt_outtab_popup.

* Populate ALV it_fieldcat
*
    gs_fieldcat_popup-fieldname  = 'SETID'.
    gs_fieldcat_popup-seltext_l     =  'Set Id'.
    gs_fieldcat_popup-col_pos     = 1.
    gs_fieldcat_popup-outputlen   = 34.
    gs_fieldcat_popup-datatype    = 'CHAR'.
*    gs_fieldcat_popup-intlen      = 34.

    APPEND gs_fieldcat_popup TO gt_fieldcat_popup .

    CLEAR gs_fieldcat_popup.

    gs_fieldcat_popup-fieldname   = 'DESCRIPT'.
    gs_fieldcat_popup-seltext_l     = 'Description'.
    gs_fieldcat_popup-col_pos     = 2.
    gs_fieldcat_popup-outputlen   = 40.
    gs_fieldcat_popup-datatype    = 'CHAR'.
*    gs_fieldcat_popup-intlen      = 6.

    APPEND gs_fieldcat_popup TO gt_fieldcat_popup .
*
*Present popup for selection
*
    CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
         EXPORTING
              i_title                 = w_title
*           I_SELECTION             = 'X'
*           I_ZEBRA                 = ' '
*           I_SCREEN_START_COLUMN   = 0
*           I_SCREEN_START_LINE     = 0
*           I_SCREEN_END_COLUMN     = 0
*           I_SCREEN_END_LINE       = 0
*           I_CHECKBOX_FIELDNAME    =
*           I_LINEMARK_FIELDNAME    =
*           I_SCROLL_TO_SEL_LINE    = 'X'
              i_tabname               = '1'
              it_fieldcat             = gt_fieldcat_popup[]
*           IT_FIELDCAT             =
*           IT_EXCLUDING            =
*           I_CALLBACK_PROGRAM      =
*           I_CALLBACK_USER_COMMAND =
              is_private              = gs_private
       IMPORTING
              es_selfield             = gs_selfield
              e_exit                  = g_exit
         TABLES
              t_outtab                = gt_outtab_popup
         EXCEPTIONS
              program_error           = 1
              OTHERS                  = 2.
    IF sy-subrc <> 0.
      MESSAGE i000(0k) WITH sy-subrc.
    ENDIF.
*
*


*  (Note: gt_ret[] contains the row id selected by the user from the
* list of F4 values)

    IF gs_selfield IS INITIAL.            " no selection was made
*     do nothing
    ELSE.                                 " a selection was made
*
      ls_modi-row_id    = gs_selfield-tabindex.
      ls_modi-fieldname = gs_selfield-fieldname.
      ls_modi-value     = gs_selfield-value .

      ASSIGN er_event_data->m_data->* TO .
      APPEND ls_modi TO .
      gv_change = gc_x.

    ENDIF.

*      (to inform grid that f4 was handled manually)
    er_event_data->m_event_handled = gc_x.

  ENDMETHOD.                                                "on_f4
*
*
  METHOD data_change.

    gv_change = gc_x.

  ENDMETHOD.                    "data_changed

ENDCLASS .                   "lcl_event_handler IMPLEMENTATION

**********************************************************************
*   start-of-selection
**********************************************************************
*
START-OF-SELECTION.

  CALL SCREEN '0600'.

END-OF-SELECTION.
*
**********************************************************************
*  pbo -  status_0100
**********************************************************************
*
MODULE status_0100 OUTPUT.

*  SET PF-STATUS '0100'.
*  SET TITLEBAR  '0100'.

  SET PF-STATUS 'DISP'.
  SET TITLEBAR 'ALVF4'.

ENDMODULE.                    "data_change


**********************************************************************
* pbo -  get_result_data
**********************************************************************
*
MODULE get_result_data_0100 OUTPUT.
*
*
  DATA: gref_events_0100 TYPE REF TO lcl_event_handler.

  IF gv_cont_0100 IS INITIAL.

*    create an object for the grid container

    CREATE OBJECT gv_cont_0100

       EXPORTING container_name = 'CCONT' "'GV_CONTAINER_0100'
       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.

* Raise a msg

    ENDIF.

  ENDIF.

  IF gv_grid_0100 IS INITIAL.

*      create an object for the alv grid

    CREATE OBJECT gv_grid_0100
        EXPORTING
          i_parent = gv_cont_0100
        EXCEPTIONS
         error_cntl_create = 1
         error_cntl_init      = 2
         error_cntl_link     = 3
         error_dp_create   = 4
         OTHERS            = 5.

    IF sy-subrc <> 0.

* Raise a msg

    ENDIF.

*register the field for which the custom f4 has to be displayed

    gs_f4-fieldname  = 'STATE'.

    gs_f4-register   = 'X'.

    gs_f4-getbefore  = space.

    gs_f4-chngeafter = space.

    APPEND gs_f4 TO gt_f4.

*  (note: chngeafter set to 'X' only if any other field value has to be
*   set based on the selected f4 value)

    CALL METHOD gv_grid_0100->register_f4_for_fields
      EXPORTING
        it_f4 = gt_f4.

* define layout attributes

    gs_layo_0100-cwidth_opt = gc_x.
    gs_layo_0100-sel_mode   = 'D'.
    gs_layo_0100-zebra      = gc_x.
    gs_layo_0100-grid_title = 'Display Result'(001).

* define the field catalogue attributes

    gs_fieldcat_0100-fieldname  = 'REPORT'.
    gs_fieldcat_0100-coltext     =  'Report'.
    gs_fieldcat_0100-col_pos     = 1.
    gs_fieldcat_0100-outputlen   = 40.
    gs_fieldcat_0100-datatype    = 'CHAR'.
    gs_fieldcat_0100-intlen      = 40.
    gs_fieldcat_0100-hotspot     = gc_x.

    APPEND gs_fieldcat_0100 TO gt_fieldcat_0100.

    CLEAR gs_fieldcat_0100.

    gs_fieldcat_0100-fieldname   = 'STATE'.
    gs_fieldcat_0100-coltext     = 'State'.
    gs_fieldcat_0100-col_pos     = 2.
    gs_fieldcat_0100-outputlen   = 10.
    gs_fieldcat_0100-datatype    = 'CHAR'.
    gs_fieldcat_0100-intlen      = 6.
    gs_fieldcat_0100-f4availabl  = gc_x.
    gs_fieldcat_0100-edit        = gc_x.

    APPEND gs_fieldcat_0100 TO gt_fieldcat_0100.

* define the functions that has to be excluded

    gs_exclude = cl_gui_alv_grid=>mc_fc_maximum.
    APPEND gs_exclude TO gt_exclude_0100.

    gs_exclude = cl_gui_alv_grid=>mc_fc_select_all.
    APPEND gs_exclude TO gt_exclude_0100.

    gs_exclude = cl_gui_alv_grid=>mc_fc_minimum.
    APPEND gs_exclude TO gt_exclude_0100.

    gs_exclude = cl_gui_alv_grid=>mc_fc_subtot.
    APPEND gs_exclude TO gt_exclude_0100.

* Create an object for the local class

    CREATE OBJECT gref_events_0100.

    SET HANDLER gref_events_0100->on_f4 FOR gv_grid_0100.

*    SELECT report state FROM cnv_10940_rep
*                        INTO TABLE gt_rel_disp
*                        WHERE runid = '0010'.
*
    w_rel_disp-state = 'State 1'.
    w_rel_disp-report = 'Report 1'.
    APPEND w_rel_disp TO gt_rel_disp.

    w_rel_disp-state = 'State 2'.
    w_rel_disp-report = 'Report 2'.
    APPEND w_rel_disp TO gt_rel_disp.

* Display data in ALV GRID format.

    CALL METHOD gv_grid_0100->set_table_for_first_display
      EXPORTING
        i_bypassing_buffer            = gc_x
        is_layout                     = gs_layo_0100
        it_toolbar_excluding          = gt_exclude_0100
      CHANGING
        it_outtab                     = gt_rel_disp[]
        it_fieldcatalog               = gt_fieldcat_0100
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.

    IF sy-subrc <> 0.

* raise a message

    ENDIF.

  ENDIF.

ENDMODULE.                    "data_change


**********************************************************************
* pai -  user_command_0100
**********************************************************************

MODULE user_command_0100 INPUT.

  CASE sy-ucomm.

    WHEN 'SAVE'.

      CALL METHOD gv_grid_0100->check_changed_data.
*
       CHECK gv_change EQ 'X'.
*
       CLEAR gv_change.
*
**      MODIFY cnv_10940_rep FROM TABLE gt_rel_disp.
*
*      COMMIT WORK.

**When the user clicks the 'EXIT; he is out
    WHEN 'EXIT' OR 'CANC'.
      LEAVE PROGRAM.

**When the user clicks the 'BACK; he goes back to screen 0
    WHEN 'BACK'.
      LEAVE TO SCREEN 0 .

  ENDCASE.

ENDMODULE.                    "data_change

No comments:

Post a Comment