簡単に実現できますので、さっそく見ていきましょう。
GUIステータスにリフレッシュボタン追加
GUIステータスへのボタン追加方法は以前の投稿を参照ください。
【ABAP】ALV – ツールバーのボタン変更(REUSE_ALV_GRID_DISPLAY編)
テンプレートではリフレッシュボタンはアプリケーションツールバーではなく、機能キーのエリアに用意されています。F8キーに割り当てられています。
機能コードは標準で用意されている「&NTE」をそのまま使います。
プログラム実装
- ユーザコマンドにデータ取得処理を実装
- リフレッシュパラメータを標準機能に返す
下記サンプルは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つのデータ取得処理として実装する場合はより効果が表れます。
動作確認してみましょう。
パッと見では変わりませんが、よく目を凝らしてみると、末尾に「…」が付いているのが見えますね。マウスでドラッグして列を広げてみましょう。
自分で列を広げると全体が表示されましたが、これでは操作性がよくないですね。
クラスでの実装なら細かく設定できて、リフレッシュボタン押下時の幅調整を実装できた記憶があるのですが、この汎用モジュール「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更新 実現方法を見つけて更新しました。