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

<!-- wp:paragraph -->ALVレポート開発でよく出てくるのがリフレッシュ機能の実装です。SE16等にも存在しますが、ボタンを押下したら一覧の情報が最新化されるあのボタンです。

簡単に実現できますので、さっそく見ていきましょう。

## GUIステータスにリフレッシュボタン追加

GUIステータスへのボタン追加方法は以前の投稿を参照ください。

[【ABAP】ALV – ツールバーのボタン変更（REUSE_ALV_GRID_DISPLAY編）](https://sapmemo.com/alvbutton/#toc3)

テンプレートではリフレッシュボタンはアプリケーションツールバーではなく、機能キーのエリアに用意されています。F8キーに割り当てられています。

機能コードは標準で用意されている「&NTE」をそのまま使います。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-93-wpp1598621954817.png)
## プログラム実装

1. ユーザコマンドにデータ取得処理を実装
2. リフレッシュパラメータを標準機能に返す

下記サンプルはBPマスタからデータを取得してALV表示するというシンプルなものです。ここにリフレッシュボタンの機能を追加してみました。

```
REPORT ytest0010.

TYPES:
  BEGIN OF t_main.
    INCLUDE TYPE ytest0010.
  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 but000 INTO CORRESPONDING FIELDS OF TABLE it_main.

ENDFORM.
FORM display_alv.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = sy-repid
      i_structure_name       = 'YTEST0010'
      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.
      <span class="bold-blue">i_selfield-refresh = abap_on.</span>

  ENDCASE.

ENDFORM.
```

必要なのはたった一つ、USINGパラメータ「I_SELFIELD」の項目「REFRESH」にフラグをセットするだけです。

ただ、最新データの取得処理は自動ではやってくれないので、再度データ取得処理を実装する必要があります。

データ取得処理をサブルーチン化しておくと、同じロジックを書く必要がないのでバグを起こす確率は下がりますし、保守性も良くなります。

今回のサンプルはデータ取得処理が1行で済んでますが、開発現場ではもっと複雑なロジックになりますし、編集処理が必要な場合もあります。

編集処理まで含めて1つのデータ取得処理として実装する場合はより効果が表れます。

動作確認してみましょう。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-94.png)2番目の名称を変更してリフレッシュボタンを押下します。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-97.png)パッと見では変わりませんが、よく目を凝らしてみると、末尾に「…」が付いているのが見えますね。マウスでドラッグして列を広げてみましょう。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-98-wpp1598625279338.png)自分で列を広げると全体が表示されましたが、これでは操作性がよくないですね。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-99.png)クラスでの実装なら細かく設定できて、リフレッシュボタン押下時の幅調整を実装できた記憶があるのですが、この汎用モジュール「REUSE_ALV_GRID_DISPLAY」ではできないのでしょうかね。

もう少し調べてみます。よく使う汎用モジュールなので実現できると嬉しいのですが。現在のプロジェクトでも使おうとしてるのもあるし。。。

2020/8/29 更新

見つかりました。

SE16ではリフレッシュ時に最適化されたのでやり方はあるのだろう、ということでSE16をデバッグしてみたらこんなのが見つかりました。

```
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.

      CALL FUNCTION 'REUSE_ALV_GRID_LAYOUT_INFO_SET'
        EXPORTING
          is_layout = wa_layout.</span>

  ENDCASE.

ENDFORM.
```

表示中のレイアウト設定を上書き更新してくれる汎用モジュールです。

サンプルではレイアウトパラメータをグローバル定義してるので、単純に汎用モジュールに渡すだけで実装できます。

開発者から実現方法がわからないと質問を受けてもこれで答えられます。一安心。

## まとめ

リフレッシュ機能の実装自体はパラメータを設定するだけなので簡単です。パラメータの存在を知っていれば一瞬で実装できてしまいます。

しかし表示幅の自動調整は一筋縄ではいかないので、さらに調べて何かわかれば更新します。 ⇒2020/8/29更新 実現方法を見つけて更新しました。