There is an issue with ALV grid that if you refresh the grid being in edit mode using method REFRESH_TABLE_DISPLAY (in case you use CL_GUI_ALV_GRID) after you have changed some data, it may happen the cursor and/or scroll goes to the first (top left) cell of the grid. It might be a little confusing for user, but you can avoid this issue by using the following methods (and attached piece of code)
- GET_SCROLL_INFO_VIA_ID – gets current scroll information
- GET_CURRENT_CELL – gets current cell, we will use that data to set the cursor at the end
- GET_SELECTED_ROWS – gets selected rows
- GET_SELECTED_CELLS_ID – if we didn’t select any rows, we check for the selected cell information
- REFRESH_TABLE_DISPLAY – refresh the grid with updated data
- SET_SELECTED_CELLS_ID – set selected cell
- SET_SELECTED_ROWS – or set seleted rows (depanding what we received at the begining)
- SET_SCROLL_INFO_VIA_ID – refresh the previous scroll position
- SET_CURRENT_CELL_VIA_ID – Set cursor on the last selected cell
In the below code (class method), there is just an example code of the methods mentioned in the list above.
Method definition – Importing parameters
i_soft TYPE xfeld DEFAULT abap_true
i_set_current TYPE xfeld DEFAULT abap_true
i_set_selected TYPE xfeld DEFAULT abap_false
… changing parameters
ir_grid TYPE REF TO cl_gui_alv_grid
… and the code implementation itself
METHOD refresh_grid.
DATA:
l_scroll_row_no TYPE lvc_s_roid,
l_scroll_row_info TYPE lvc_s_row,
l_scroll_col_info TYPE lvc_s_col,
l_cell_row_no TYPE lvc_s_roid,
l_cell_row_id TYPE lvc_s_row,
l_cell_col_id TYPE lvc_s_col,
mt_sel_cells TYPE lvc_t_ceno,
mt_sel_rows TYPE lvc_t_row.
* Save the scroll info
mr_grid->get_scroll_info_via_id(
importing
es_row_no = l_scroll_row_no
es_row_info = l_scroll_row_info
es_col_info = l_scroll_col_info
).
* Save info about last selected cell
mr_grid->get_current_cell(
IMPORTING
* e_row =
* e_value =
* e_col =
es_row_id = l_cell_row_id
es_col_id = l_cell_col_id
es_row_no = l_cell_row_no
).
* Save info about selected rows
mr_grid->get_selected_rows(
IMPORTING
et_index_rows = mt_sel_rows
).
* If no row is selected save info about selected cells
IF mt_sel_rows[] IS INITIAL.
mr_grid->get_selected_cells_id(
IMPORTING
et_cells = mt_sel_cells
).
ENDIF.
* ALV Grid refresh
mr_grid->refresh_table_display( i_soft_refresh = i_soft ).
* Restore the saved selection
IF i_set_selected = abap_true.
IF mt_sel_cells[] IS NOT INITIAL.
mr_grid->set_selected_cells_id( it_cells = mt_sel_cells ).
ELSE.
mr_grid->set_selected_rows(
it_index_rows = mt_sel_rows
* it_row_no =
* is_keep_other_selections =
).
ENDIF.
ENDIF.
* Restore previously saved scroll position
mr_grid->set_scroll_info_via_id(
is_row_info = l_scroll_row_info
is_col_info = l_sroll_col_info
is_row_no = l_scroll_row_no
).
* Set focus on previously selected cell
IF i_set_current = abap_true.
mr_grid->set_current_cell_via_id(
is_row_id = l_cell_row_id
is_column_id = l_cell_col_id
is_row_no = l_cell_row_no ).
ENDIF.
ENDMETHOD.
Thank you very much, works like a charm!
Thanks!
Change mr_grid to ir_grid and l_sroll_col_info to l_scroll_col_info
brgds!
Thanks!