リフレッシュしたときに、表示データが多い場合に表示位置が先頭に戻って困る、リフレッシュボタンを押したときの位置をキープしたい、という方に解決方法を紹介します。
以前のALV一覧画面でのリフレッシュ機能で作ったサンプルをベースに作っていきます。
【ABAP】ALV – 一覧リフレッシュ機能の実装(サンプルあり)
事象確認
まずは事象を見てみましょう。
表示行や項目数を増やすと、縦横にスクロールバーが表示されます。
縦横にスクロールした状態でリフレッシュしてみます。
スクロールバーの位置が縦横ともに先頭に移動してしまいましたね。
実装方法(サンプルプログラム)
【ABAP】ALV – 一覧リフレッシュ機能の実装(サンプルあり)
こちらのサンプルをベースに、データ取得元をBUT000からSBOOKに変更したプログラムを作ってみました。
REPORT ytest0011.
TYPES:
BEGIN OF t_main.
INCLUDE TYPE sbook.
TYPES:
box TYPE checkbox,
END OF t_main.
DATA: it_main TYPE TABLE OF t_main.
DATA: it_fcat TYPE slis_t_fieldcat_alv.
DATA: wa_layout TYPE slis_layout_alv.
START-OF-SELECTION.
PERFORM get_data.
PERFORM display_alv.
FORM get_data.
SELECT * FROM sbook INTO CORRESPONDING FIELDS OF TABLE it_main UP TO 500 ROWS.
ENDFORM.
FORM display_alv.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_structure_name = 'SBOOK'
i_bypassing_buffer = abap_on
CHANGING
ct_fieldcat = it_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
wa_layout-box_fieldname = 'BOX'.
wa_layout-colwidth_optimize = abap_on.
wa_layout-zebra = abap_on.
DATA: it_extab TYPE slis_t_extab.
APPEND '&GRAPH' TO it_extab.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = it_fcat
is_layout = wa_layout
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_GUI_STATUS'
i_callback_user_command = 'USER_COMMAND'
it_excluding = it_extab
TABLES
t_outtab = it_main
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
FORM set_gui_status USING it_extab TYPE kkblo_t_extab.
SET PF-STATUS 'S001'.
ENDFORM.
FORM user_command USING i_ucomm TYPE sy-ucomm
i_selfield TYPE slis_selfield.
CASE i_ucomm.
WHEN '&NTE'. リフレッシュ
PERFORM get_data.
i_selfield-refresh = abap_on.
<span class="bold-blue"> i_selfield-col_stable = abap_on.
i_selfield-row_stable = abap_on.</span>
CALL FUNCTION 'REUSE_ALV_GRID_LAYOUT_INFO_SET'
EXPORTING
is_layout = wa_layout.
ENDCASE.
ENDFORM.
ユーザコマンド処理の「I_SELFIELD」パラメータの2つの項目にフラグを立てるだけで実現できます。
- COL_STABLE
- ROW_STABLE
まとめ
パラメータ2つを設定するだけと非常に簡単に実装できるので、困っている方は参考にしてください。