ALV(ABAP List Viewer)は、内部テーブルの内容を表形式で表示するための標準部品です。ABAPで帳票やレポートを作る際、ほぼ必ず使うことになります。
ALVが提供する機能
ALVを使う最大の理由は、実装なしで多くの機能が手に入ることです。
- 列のソート、フィルタ、並べ替え、幅の調整
- 小計・合計の自動計算
- Excel、CSV、PDFへのエクスポート
- 表示レイアウトの保存と再利用(バリアント)
- 行の選択とダブルクリックによる詳細表示
- 印刷レイアウトの自動生成
ALVの実装方式
| 方式 | 呼び方 | 特徴 | 推奨度 |
|---|---|---|---|
| 関数モジュール | REUSE_ALV_GRID_DISPLAY | 古典的。設定項目が多く冗長 | レガシー |
| CL_GUI_ALV_GRID | コントロールベース | 細かい制御が可能。コード量が多い | 複雑な要件向け |
| CL_SALV_TABLE | SALV(シンプルALV) | 簡潔に書ける。標準的な要件に十分 | 推奨 |
SALVによる最短実装
DATA lo_alv TYPE REF TO cl_salv_table.
SELECT matnr, mtart, meins
FROM mara
INTO TABLE @DATA(lt_mara)
UP TO 100 ROWS.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_alv
CHANGING t_table = lt_mara ).
" 標準ツールバーを表示
lo_alv->get_functions( )->set_all( abap_true ).
" 列幅の自動調整
lo_alv->get_columns( )->set_optimize( abap_true ).
" 縞模様表示
lo_alv->get_display_settings( )->set_striped_pattern( abap_true ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_msg).
MESSAGE lx_msg->get_text( ) TYPE 'E'.
ENDTRY.これだけで、ソート・フィルタ・Excel出力・印刷に対応した表が表示されます。SALVは内部テーブルの構造から自動的にフィールドカタログを生成するため、列定義を手で書く必要がありません。
SALVでの表示カスタマイズ
DATA(lo_columns) = lo_alv->get_columns( ).
" 特定の列を取得して設定
DATA(lo_column) = lo_columns->get_column( 'MTART' ).
lo_column->set_short_text( '品目タイプ' ).
lo_column->set_medium_text( '品目タイプ' ).
lo_column->set_long_text( '品目タイプ' ).
" 列を非表示にする
lo_columns->get_column( 'MANDT' )->set_visible( abap_false ).
" 合計を表示する
DATA(lo_agg) = lo_alv->get_aggregations( ).
lo_agg->add_aggregation( columnname = 'MENGE'
aggregation = if_salv_c_aggregation=>total ).
" ソート順を指定
DATA(lo_sorts) = lo_alv->get_sorts( ).
lo_sorts->add_sort( columnname = 'MATNR'
sequence = if_salv_c_sort=>sort_up ).フィールドカタログ
CL_GUI_ALV_GRIDや関数モジュール方式では、フィールドカタログという構造で列の定義を明示的に作る必要があります。
| 項目 | 内容 |
|---|---|
| FIELDNAME | 内部テーブルの項目名 |
| SELTEXT_L / M / S | 列見出し(長・中・短) |
| OUTPUTLEN | 表示幅 |
| NO_OUT | 初期表示しない(ユーザーが追加可能) |
| DO_SUM | 合計を計算する |
| HOTSPOT | クリック可能にする |
| EDIT | 編集可能にする |
| REF_TABLE / REF_FIELD | 参照するDDICの定義 |
" DDIC構造から自動生成する
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'MARA'
CHANGING
ct_fieldcat = lt_fieldcat
EXCEPTIONS
OTHERS = 1.
" 個別に調整
LOOP AT lt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fcat>).
CASE <fs_fcat>-fieldname.
WHEN 'MANDT'.
<fs_fcat>-no_out = abap_true.
WHEN 'MENGE'.
<fs_fcat>-do_sum = abap_true.
ENDCASE.
ENDLOOP.イベント処理
行をダブルクリックしたときに詳細画面を開くといった処理は、イベントハンドラで実装します。
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
METHODS on_double_click
FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS.
CLASS lcl_handler IMPLEMENTATION.
METHOD on_double_click.
READ TABLE gt_data INTO DATA(ls_row) INDEX row.
IF sy-subrc = 0.
SET PARAMETER ID 'MAT' FIELD ls_row-matnr.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
ENDMETHOD.
ENDCLASS.
" ハンドラの登録
DATA(lo_events) = lo_alv->get_event( ).
DATA(lo_handler) = NEW lcl_handler( ).
SET HANDLER lo_handler->on_double_click FOR lo_events.