セクション 9 / 11

ALVレポート

ALVが提供する標準機能、SALVとCL_GUI_ALV_GRIDの使い分け、フィールドカタログの作り方を解説します。

目次を開く

ALV(ABAP List Viewer)は、内部テーブルの内容を表形式で表示するための標準部品です。ABAPで帳票やレポートを作る際、ほぼ必ず使うことになります。

ALVが提供する機能

ALVを使う最大の理由は、実装なしで多くの機能が手に入ることです。

  • 列のソート、フィルタ、並べ替え、幅の調整
  • 小計・合計の自動計算
  • Excel、CSV、PDFへのエクスポート
  • 表示レイアウトの保存と再利用(バリアント)
  • 行の選択とダブルクリックによる詳細表示
  • 印刷レイアウトの自動生成

ALVの実装方式

ALVの3つの実装方式
方式呼び方特徴推奨度
関数モジュールREUSE_ALV_GRID_DISPLAY古典的。設定項目が多く冗長レガシー
CL_GUI_ALV_GRIDコントロールベース細かい制御が可能。コード量が多い複雑な要件向け
CL_SALV_TABLESALV(シンプルALV)簡潔に書ける。標準的な要件に十分推奨

SALVによる最短実装

SALVでALVを表示する
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.

イベント処理

行をダブルクリックしたときに詳細画面を開くといった処理は、イベントハンドラで実装します。

SALVでのダブルクリック処理
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.

📖 わからない用語は SAP用語辞典 で調べられます。

理解度チェック

このセクションの内容を確認しましょう。

確認問題 1

ALVの正式名称は何か。

確認問題 2

ALVでは、ユーザーが表示列の並び替えやフィルタを自由にカスタマイズできる。

確認問題 3

ALVの表示列を定義する仕組みを何と呼ぶか。

確認問題 4

新規開発でALV出力に推奨されるクラスはどれか。

確認問題 5

REUSE_ALV_GRID_DISPLAYはクラスベースのALV実装方法である。

確認問題 6

CL_SALV_TABLEを使ったALV表示の実装手順を並べてください。

クリックして正しい順番に選んでください