既存のALVレポートに対して項目追加や属性変更をしても、更新内容が反映されないケースがあるので原因と対策方法を説明します。
事象の確認
【ABAP】ALV – 行選択ボタンの表示(サンプルコードあり)で作成したプログラムを更新していきます。
プログラムは、構造に項目を追加するだけで、該当項目が自動で取得されるように作成しています。
デバッグで内部テーブルの中身を確認すると、登録日を取得できていることが確認できます。
プログラム上は想定通り取得できているのに、どこにも表示されないのは何故でしょうか。原因を見ていきましょう。
ALVレポートに更新内容が反映されない原因
結論を先に書くと、前回実行時のデータ構造が表示されるためです。
実際にフィールドカタログを取得する汎用モジュール(REUSE_ALV_FIELDCATALOG_MERGE)で取得された内部テーブルの中身を見てみましょう。
構造には登録日を追加していますが、登録日が取得されていません。
続けて対策方法を見ていきます。
対策方法
対策は簡単で、汎用モジュールのパラメータを追加するだけです。
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_structure_name = 'YTEST0008'
<span class="bold-blue">i_bypassing_buffer = abap_on</span>
CHANGING
ct_fieldcat = it_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
EXPORTINGパラメータの「I_BYPASSING_BUFFER」に'X'を渡すだけです。
これで実行してみましょう。
めでたく追加項目が取得されましたね。ALV画面にもちゃんと表示されています。
サンプルコード
【ABAP】ALV – 行選択ボタンの表示(サンプルコードあり)のソースコードに1行追加しただけです。
REPORT ytest0008.
TYPES:
BEGIN OF t_main.
INCLUDE TYPE ytest0008.
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.
SELECT * FROM but000 INTO CORRESPONDING FIELDS OF TABLE it_main.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_structure_name = 'YTEST0008'
<span class="bold-blue">i_bypassing_buffer = abap_on</span>
CHANGING
ct_fieldcat = it_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
wa_layout-box_fieldname = 'BOX'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = it_fcat
is_layout = wa_layout
TABLES
t_outtab = it_main
EXCEPTIONS
program_error = 1
OTHERS = 2.
行選択ボタンの追加時にショートダンプが発生した理由は?
【ABAP】ALV – 行選択ボタンの表示(サンプルコードあり)で行選択ボタンを追加したときはショートダンプが発生したのに、今回の追加項目でショートダンプが発生しなかったのはなぜでしょうか。
行選択ボタンの場合はレイアウトパラメータで行選択ボタンの項目IDを渡してフィールドシンボルで動的に割り当てていますが、フィールドカタログに行選択ボタンの項目IDが存在しなかったため割当できずショートダンプが発生していました。
まとめ
追加項目がALV一覧に反映されない問題は、汎用モジュールのパラメータを1つで解決します。知らない人がこの問題に直面すると調査に時間がかかってしまうので、開発の際は予め「I_BYPASSING_BUFFER」パラメータを使用することをおすすめします。