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

ABAP

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

以前の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.
      i_selfield-col_stable  = abap_on.
      i_selfield-row_stable  = abap_on.

      CALL FUNCTION 'REUSE_ALV_GRID_LAYOUT_INFO_SET'
        EXPORTING
          is_layout = wa_layout.

  ENDCASE.

ENDFORM.

ユーザコマンド処理の「I_SELFIELD」パラメータの2つの項目にフラグを立てるだけで実現できます。

  • COL_STABLE
  • ROW_STABLE

まとめ

パラメータ2つを設定するだけと非常に簡単に実装できるので、困っている方は参考にしてください。

コメント

タイトルとURLをコピーしました