I have searched SDN myself for the answer for sometime. All the friends that answered were helpful but there were only example links. So here is a simple code to implement F4 search help for OO ALV grid cells:
First we have to define the method and sub programs. In the definition part of our events class, include a code as the following:
CLASS lcl_event_handler DEFINITION .
PUBLIC SECTION .
METHODS:
...
....
on_f4 FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
es_row_no
er_event_data
et_bad_cells
e_display.
....
ENDCLASS.
For the implementation part, code can be as follows:
CLASS lcl_event_handler IMPLEMENTATION .
.....
....
METHOD on_f4.
PERFORM on_f4 USING e_fieldname
es_row_no-row_id
er_event_data
et_bad_cells
e_display
er_data_changed.
er_event_data->m_event_handled = 'X'.
ENDMETHOD. "on_f4
.....
.....
ENDCLASS .
Within our main program after displaying the table (by method set_table_for_first_display), we have to create the event handler object and set the handlers for these events.
CREATE OBJECT gr_event_handler .
*--Registering handler methods to handle ALV Grid events
.....
.....
SET HANDLER gr_event_handler->on_f4 FOR gr_alvgrid .
PERFORM register_f4_fields. "set cells with search help
*§3.Optionally register ENTER to raise event DATA_CHANGED.
call method gr_alvgrid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
...... ....... ......
FORM register_f4_fields. "which fields will have F4 search help DATA: lt_f4 TYPE lvc_t_f4 WITH HEADER LINE .
DATA: lt_f4_data TYPE lvc_s_f4.
lt_f4_data-fieldname = 'CHARG'.
lt_f4_data-register = 'X' .
* lt_f4_data-getbefore = 'X' .
lt_f4_data-CHNGEAFTER ='X'.
INSERT lt_f4_data INTO TABLE lt_f4.
lt_f4_data-fieldname = 'LGORT'.
lt_f4_data-register = 'X' .
* lt_f4_data-getbefore = 'X' .
lt_f4_data-CHNGEAFTER ='X'.
INSERT lt_f4_data INTO TABLE lt_f4.
CALL METHOD gr_alvgrid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4[].
ENDFORM. "register_f4_fields
The main sub program where we handle the changed cell value is as follows:
FORM on_f4 USING P_E_FIELDNAME
ROW_ID
P_ER_EVENT_DATA
TYPE REF TO CL_ALV_EVENT_DATA
P_ET_BAD_CELLS
P_E_DISPLAY
IR_DATA_CHANGED
TYPE REF TO cl_alv_changed_data_protocol.
DATA: BEGIN OF value_charg OCCURS 0, "the value table that is passed to F4 fm
charg like zpp_kpduzelt-charg,
lgort like zpp_kpduzelt-lgort,
clabs like mchb-clabs,
END OF value_charg.
DATA : ls_mod_cell TYPE lvc_s_modi ,
ls_del_cell TYPE lvc_s_moce ,
ls_good_cell TYPE lvc_s_modi,
lv_value TYPE lvc_value .
DATA : ls_mod_row like line of gt_list.
.....,
.... *§5 define fields and field-symbols for data-update
field-symbols:
data: ls_modi type lvc_s_modi.
create object ir_data_changed.
SORT ir_data_changed->mt_mod_cells BY row_id .
LOOP AT ir_data_changed->mt_mod_cells
INTO ls_mod_cell.
ENDLOOP.
case p_e_fieldname. "read changed cell
when 'CHARG'.
......
* here must be the code to fill in the possible values table
* and the call to fm F4IF_INT_TABLE_VALUE_REQUEST
......
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'CHARG'
value_org = 'S'
* DYNPPROG = SY-REPID
* DYNPNR = SY-DYNNR
* DYNPROFIELD = 'PRUEFLOS'
TABLES
value_tab = value_charg
* field_tab = field_tab
return_tab = return_tab
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc = 0 and return_tab-fieldval <> ''.
move return_tab-fieldval to charg.
ls_mod_cell-row_id = row_id.
ls_mod_cell-fieldname = 'CHARG'.
move charg to lv_value.
ls_mod_cell-value = lv_value.
append ls_mod_cell to ir_data_changed->mt_mod_cells.
*******************
call method gr_alvgrid->get_frontend_fieldcatalog
IMPORTING
et_fieldcatalog = lt_fcat.
read table gt_list index row_id into wa_tab.
create data lp_wa like line of gt_list.
assign lp_wa->* to
read table lt_fcat
with key fieldname = ls_mod_cell-fieldname into ls_fieldcat.
move ls_fieldcat-ref_table to l_tabname.
move ls_fieldcat-fieldname to l_fieldname.
assign component ls_fieldcat-fieldname
of structure wa_tab
to
**§6 assign the cell table fieldsymbol to the dereferenced data table
*and
* fill the table.
assign p_er_event_data->m_data->* to
append ls_mod_cell to
....
....
ENDIF.
....
.....
endcase.
No comments:
Post a Comment