[ABAP] ALV-Grid: Nach Drücken der Enter-Taste in die nächste Zeile springen

METHOD on_data_changed.
  DATA: lv_row_id TYPE lvc_s_row.
  DATA: lv_col_id TYPE lvc_s_col.
  DATA: lv_row_no TYPE lvc_s_roid.

* aktuelle Zelle holen
  o_alv->get_current_cell( IMPORTING
                             es_row_id = lv_row_id
                             es_col_id = lv_col_id
                             es_row_no = lv_row_no ).

* Wert für Zeile erhöhen
  lv_row_id-index  = lv_row_id-index  + 1.
  lv_row_no-row_id = lv_row_no-row_id + 1.

* akt. Zeile setzen,
* dabei prüfen, ob Zeilenindex nicht größer als Inhalt der internen
* Tabelle im ALV-Grid ist
  IF lv_row_id-index < lines( itab ).
    o_alv->set_current_cell_via_id( EXPORTING
                                      is_row_id    = lv_row_id
                                      is_column_id = lv_col_id
                                      is_row_no    = lv_row_no ).
  ENDIF.
ENDMETHOD.

[ABAP] ALV-Grid: Bei Refresh Cursor- und Scrollposition halten

Variante 1 ( refresh_table_display )

DATA: o_alv TYPE REF TO cl_gui_alv_grid.
  
...

DATA: lv_stable TYPE lvc_s_stbl.
lv_stable-row = 'X'.
lv_stable-col = 'X'.

o_alv->refresh_table_display( is_stable = lv_stable ).

Variante 2 ( set_scroll_info_via_id, set_current_cell_via_id )

DATA: o_alv TYPE REF TO cl_gui_alv_grid.
  
...

* Scrollbalken und Cursorposition im Gitter auslesen
DATA: lv_row_no TYPE lvc_s_roid.
DATA: lv_row_info TYPE lvc_s_row.
DATA: lv_col_info TYPE lvc_s_col.

o_alv->get_scroll_info_via_id( IMPORTING
                                 es_row_no   = lv_row_no
                                 es_row_info = lv_row_info
                                 es_col_info = lv_col_info ).

DATA: lv_row_no2 TYPE lvc_s_roid.
DATA: lv_row_id2 TYPE lvc_s_row.
DATA: lv_col_id2 TYPE lvc_s_col.

o_alv->get_current_cell( IMPORTING
                           es_row_id = lv_row_id2
                           es_col_id = lv_col_id2
                           es_row_no = lv_row_no2 ).
                           
o_alv->refresh_table_display( ).

* Scrollbalken und Cursorposition im Gitter auf die alte Position setzen
o_alv->set_scroll_info_via_id( is_row_info = lv_row_info
                               is_col_info = lv_col_info
                               is_row_no   = lv_row_no ).

o_alv->set_current_cell_via_id( is_row_id    = lv_row_id2
                                is_column_id = lv_col_id2
                                is_row_no    = lv_row_no2 ).

Weiterführende Infos: Link