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
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:
**********************************************************************
* 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