05-08-2014 7:07 AM
Hi,
I am using FM REUSE_ALV_GRID_DISPLAY_LVC for an editable ALV Report. There are five editable amount columns.
Last one non editable column is subtotal of all five editable columns. I want to update subtotal column automatically when user edit editable amount columns for a particular row.
Thanks,
Sunil
05-08-2014 9:14 AM
Hi Sunil,
I have implemented something similar to your requirement.
There are two amount fields and the third field is the total.
When the user changes the amount fields and clicks enter, the total field changes automatically to reflect the new total.
TYPE-POOLS: slis.
TYPES: BEGIN OF t_data,
item TYPE i,
bukrs TYPE bukrs,
gjahr TYPE gjahr,
dmbtr2 TYPE dmbtr,
dmbtr3 TYPE dmbtr,
dmbtr4 TYPE dmbtr,
END OF t_data.
DATA: gt_data TYPE TABLE OF t_data,
gs_data TYPE t_data.
DATA: gt_fieldcatalog TYPE lvc_t_fcat,
gs_fieldcatalog TYPE lvc_s_fcat,
gt_events TYPE slis_t_event,
gs_events TYPE slis_alv_event.
START-OF-SELECTION.
* * Add same data
gs_data-item = 1.
gs_data-bukrs = '1000'.
gs_data-gjahr = '2012'.
gs_data-dmbtr2 = '100.00' .
gs_data-dmbtr3 = '1020.00' .
APPEND gs_data TO gt_data.
gs_data-item = 2.
gs_data-bukrs = '1000'.
gs_data-gjahr = '2013'.
gs_data-dmbtr2 = '200.00' .
gs_data-dmbtr3 = '4020.00' .
APPEND gs_data TO gt_data.
gs_data-item = 3.
gs_data-bukrs = '1000'.
gs_data-gjahr = '2012'.
gs_data-dmbtr2 = '100.00' .
gs_data-dmbtr3 = '1120.00' .
APPEND gs_data TO gt_data.
SORT gt_data BY bukrs.
CLEAR gs_data.
LOOP AT gt_data INTO gs_data.
gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
MODIFY gt_data FROM gs_data INDEX sy-tabix.
CLEAR gs_data.
ENDLOOP.
DATA: lv_pos TYPE i.
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'ITEM'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'Item'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 7.
gs_fieldcatalog-key = 'X'.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'BUKRS'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'Company'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 7.
gs_fieldcatalog-key = 'X'.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'GJAHR'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'YEAR'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 7.
gs_fieldcatalog-key = 'X'.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'DMBTR2'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'AMT1'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 10.
gs_fieldcatalog-edit = 'X'.
gs_fieldcatalog-decimals = 2.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'DMBTR3'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'AMT2'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 10.
gs_fieldcatalog-edit = 'X'.
gs_fieldcatalog-decimals = 2.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'DMBTR4'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'TOT'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 10.
gs_fieldcatalog-decimals = 2.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
* Trigger ENTER Event
gs_events-name = 'CALLER_EXIT'.
gs_events-form = 'CALLER_EXIT'.
APPEND gs_events TO gt_events.
* To capture changed data
gs_events-name = 'DATA_CHANGED'.
gs_events-form = 'DATA_CHANGED'.
APPEND gs_events TO gt_events.
* Call ALV Grid
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
it_fieldcat_lvc = gt_fieldcatalog
it_events = gt_events
TABLES
t_outtab = gt_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
* *&---------------------------------------------------------------------*
* *& Form data_changed
* *&---------------------------------------------------------------------*
FORM data_changed USING ir_data_changed TYPE REF TO cl_alv_changed_data_protocol.
DATA ls_modi TYPE lvc_s_modi.
* * Check each modification:
LOOP AT ir_data_changed->mt_mod_cells INTO ls_modi.
CASE ls_modi-fieldname.
WHEN 'DMBTR2' .
CLEAR gs_data.
READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
gs_data-dmbtr2 = ls_modi-value.
gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.
WHEN 'DMBTR3' .
CLEAR gs_data.
READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
gs_data-dmbtr3 = ls_modi-value.
gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.
ENDCASE.
ENDLOOP.
* Refresh ALV Grid
DATA: g_alv TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = g_alv.
CALL METHOD g_alv->refresh_table_display.
ENDFORM. "data_changed
* *&---------------------------------------------------------------------*
* *& Form caller_exit
* *&---------------------------------------------------------------------*
FORM caller_exit USING is_data TYPE slis_data_caller_exit.
DATA: lr_alv TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_alv.
* * Register ENTER as edit event:
CALL METHOD lr_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
ENDFORM. "CALLER_EXIT
05-08-2014 7:14 AM
Hi,
You can achieve the same. Use enter event and trigger the sum logic on it.
05-08-2014 7:17 AM
Can you please share the code. I am new to event in editable ALV.
05-08-2014 7:20 AM
05-08-2014 7:35 AM
Hi Sunil,
You can acheive the given requirement easily by writing code logic using ALV OOPs concept(Class-CL_GUI_ALV_GRID. Refer below thread for guidance.
Refer event-handle_data_changed_finished which will be triggered after finishing of ALV cell changes so you can populate the subtotal field in ALV output table after population of 5th field and refresh the ALV Grid display.
Regards,
Sudeesh Soni
05-08-2014 9:14 AM
Hi Sunil,
I have implemented something similar to your requirement.
There are two amount fields and the third field is the total.
When the user changes the amount fields and clicks enter, the total field changes automatically to reflect the new total.
TYPE-POOLS: slis.
TYPES: BEGIN OF t_data,
item TYPE i,
bukrs TYPE bukrs,
gjahr TYPE gjahr,
dmbtr2 TYPE dmbtr,
dmbtr3 TYPE dmbtr,
dmbtr4 TYPE dmbtr,
END OF t_data.
DATA: gt_data TYPE TABLE OF t_data,
gs_data TYPE t_data.
DATA: gt_fieldcatalog TYPE lvc_t_fcat,
gs_fieldcatalog TYPE lvc_s_fcat,
gt_events TYPE slis_t_event,
gs_events TYPE slis_alv_event.
START-OF-SELECTION.
* * Add same data
gs_data-item = 1.
gs_data-bukrs = '1000'.
gs_data-gjahr = '2012'.
gs_data-dmbtr2 = '100.00' .
gs_data-dmbtr3 = '1020.00' .
APPEND gs_data TO gt_data.
gs_data-item = 2.
gs_data-bukrs = '1000'.
gs_data-gjahr = '2013'.
gs_data-dmbtr2 = '200.00' .
gs_data-dmbtr3 = '4020.00' .
APPEND gs_data TO gt_data.
gs_data-item = 3.
gs_data-bukrs = '1000'.
gs_data-gjahr = '2012'.
gs_data-dmbtr2 = '100.00' .
gs_data-dmbtr3 = '1120.00' .
APPEND gs_data TO gt_data.
SORT gt_data BY bukrs.
CLEAR gs_data.
LOOP AT gt_data INTO gs_data.
gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
MODIFY gt_data FROM gs_data INDEX sy-tabix.
CLEAR gs_data.
ENDLOOP.
DATA: lv_pos TYPE i.
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'ITEM'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'Item'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 7.
gs_fieldcatalog-key = 'X'.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'BUKRS'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'Company'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 7.
gs_fieldcatalog-key = 'X'.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'GJAHR'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'YEAR'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 7.
gs_fieldcatalog-key = 'X'.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'DMBTR2'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'AMT1'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 10.
gs_fieldcatalog-edit = 'X'.
gs_fieldcatalog-decimals = 2.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'DMBTR3'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'AMT2'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 10.
gs_fieldcatalog-edit = 'X'.
gs_fieldcatalog-decimals = 2.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
lv_pos = lv_pos + 1.
CLEAR gs_fieldcatalog.
gs_fieldcatalog-fieldname = 'DMBTR4'.
gs_fieldcatalog-tabname = 'GT_DATA'.
gs_fieldcatalog-scrtext_m = 'TOT'.
gs_fieldcatalog-col_pos = lv_pos.
gs_fieldcatalog-outputlen = 10.
gs_fieldcatalog-decimals = 2.
APPEND gs_fieldcatalog TO gt_fieldcatalog.
* Trigger ENTER Event
gs_events-name = 'CALLER_EXIT'.
gs_events-form = 'CALLER_EXIT'.
APPEND gs_events TO gt_events.
* To capture changed data
gs_events-name = 'DATA_CHANGED'.
gs_events-form = 'DATA_CHANGED'.
APPEND gs_events TO gt_events.
* Call ALV Grid
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
it_fieldcat_lvc = gt_fieldcatalog
it_events = gt_events
TABLES
t_outtab = gt_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
* *&---------------------------------------------------------------------*
* *& Form data_changed
* *&---------------------------------------------------------------------*
FORM data_changed USING ir_data_changed TYPE REF TO cl_alv_changed_data_protocol.
DATA ls_modi TYPE lvc_s_modi.
* * Check each modification:
LOOP AT ir_data_changed->mt_mod_cells INTO ls_modi.
CASE ls_modi-fieldname.
WHEN 'DMBTR2' .
CLEAR gs_data.
READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
gs_data-dmbtr2 = ls_modi-value.
gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.
WHEN 'DMBTR3' .
CLEAR gs_data.
READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
gs_data-dmbtr3 = ls_modi-value.
gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.
ENDCASE.
ENDLOOP.
* Refresh ALV Grid
DATA: g_alv TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = g_alv.
CALL METHOD g_alv->refresh_table_display.
ENDFORM. "data_changed
* *&---------------------------------------------------------------------*
* *& Form caller_exit
* *&---------------------------------------------------------------------*
FORM caller_exit USING is_data TYPE slis_data_caller_exit.
DATA: lr_alv TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_alv.
* * Register ENTER as edit event:
CALL METHOD lr_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
ENDFORM. "CALLER_EXIT
05-08-2014 12:39 PM
Dear Susmitha,
Thanks. It is working fine. But after Refresh ALV Grid the screen became initial. It is difficult to find edited row again and again. Can we make it stable in editable line.
Thanks,
Sunil
05-08-2014 12:52 PM
Share your code. It did not become initial for me.
Also, you dont have to find the edited rows again and again.. All the edited rows would be there in the table ir_data_changed, till the enter key is pressed. All these rows would be modified together.
05-08-2014 1:09 PM
Thanks. I solved bu using
LS_STABLE-ROW = 'X'.
LS_STABLE-COL = 'X'.
05-08-2014 12:12 PM
Hello Sunil,
You can use methods get_selected_rows and check_changed_data of class cl_gui_alv_grid. on event PAI.
Thanks,
Dnyanesh.