2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ABAP】ALV –リフレッシュ時に行列の位置を保持する方法(サンプルあり)

Last updated at Posted at 2022-06-21
リフレッシュしたときに、表示データが多い場合に表示位置が先頭に戻って困る、リフレッシュボタンを押したときの位置をキープしたい、という方に解決方法を紹介します。

以前のALV一覧画面でのリフレッシュ機能で作ったサンプルをベースに作っていきます。

【ABAP】ALV – 一覧リフレッシュ機能の実装(サンプルあり)

事象確認

まずは事象を見てみましょう。
image.png
表示行や項目数を増やすと、縦横にスクロールバーが表示されます。

縦横にスクロールした状態でリフレッシュしてみます。
image.png
スクロールバーの位置が縦横ともに先頭に移動してしまいましたね。

この現象を回避する方法を紹介します。
image.png

実装方法(サンプルプログラム)

【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つを設定するだけと非常に簡単に実装できるので、困っている方は参考にしてください。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?