ALV 帳票出力

23.3 ALV 帳票出力

ALV出力の実装は、次の3ステップで進めます。
(1) 出力データの取得 → (2) 項目カタログの定義 → (3) ALV出力
この順番で準備すると、実装の見通しがよくなります。

1. 出力データの取得(ABAP SQLで必要データを内部テーブルに入れる)
2. 項目カタログの定義(どの列をどう表示するかを決める)
3. ALV出力(REUSE_ALV_GRID_DISPLAYで一覧表示する)

 まずは、①ALV出力用のデータ取得。
その後、②項目カタログを定義して、③ALV出力を行います。
 それぞれのステップを、順を追って解説していきます。

ALVの実装方法-出力データの取得

ALVは「内部テーブルの一覧表示」を行う仕組みです。 そのため最初に、表示したいデータを ABAP SQLで取得 して、ALV出力用の内部テーブルへ格納します。

サンプルコード

*&---------------------------------------------------------------------*
*& Report Z_SAMPLE223_ALV
*&---------------------------------------------------------------------*
*& 概要   :ZT200400101をクラシックALVで一覧表示(旧ALV)
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE223_ALV.

"* TYPE-POOLS: slis.
"* 以前は TYPE-POOLS を明示することがありましたが、
"* 現在は型グループは参照時に自動ロードされるため、通常は不要です。

"------------------------------------------------------------
" 選択条件(DDIC項目参照にしない=環境差の構文エラー回避)
"------------------------------------------------------------
DATA LV_ZISDT TYPE ZE200400103. "登録日(DATS)
DATA LV_MATNR TYPE MATNR.       "品目コード

SELECT-OPTIONS:
  S_ZISDT FOR LV_ZISDT,
  S_MATNR FOR LV_MATNR.

"------------------------------------------------------------
" 出力用TYPE(必要項目だけ)
"------------------------------------------------------------
TYPES: BEGIN OF TY_OUT,
         MATNR    TYPE ZT200400101-MATNR,     "品目コード
         ZTEXT    TYPE ZT200400101-ZTEXT,     "商品名
         ZAMT_SAL TYPE ZT200400101-ZAMT_SAL,  "売上金額
         WAERS    TYPE ZT200400101-WAERS,     "通貨コード
         ZISDT    TYPE ZT200400101-ZISDT,     "登録日
         ZNUM     TYPE ZT200400101-ZNUM,      "伝票番号
       END OF TY_OUT.

DATA LT_OUT TYPE STANDARD TABLE OF TY_OUT WITH EMPTY KEY.

" フィールドカタログ/レイアウト
DATA LT_FCAT   TYPE SLIS_T_FIELDCAT_ALV.
DATA LS_LAYOUT TYPE SLIS_LAYOUT_ALV.

START-OF-SELECTION.

  " 1) データ取得(必要項目だけSELECT)
  SELECT MATNR, ZTEXT, ZAMT_SAL, WAERS, ZISDT, ZNUM
    FROM ZT200400101
    WHERE ZISDT IN @S_ZISDT
      AND MATNR IN @S_MATNR
    INTO TABLE @LT_OUT
    UP TO 200 ROWS.

  IF LT_OUT IS INITIAL.
    MESSAGE '該当データがありません。' TYPE 'S'.
    RETURN.
  ENDIF.


  " 2) フィールドカタログ生成(MERGE方式)
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME         = SY-REPID
      I_INTERNAL_TABNAME     = 'LT_OUT'
      I_STRUCTURE_NAME       = 'ZT200400101'
    CHANGING
      CT_FIELDCAT            = LT_FCAT
    EXCEPTIONS
      INCONSISTENT_INTERFACE = 1
      PROGRAM_ERROR          = 2
      OTHERS                 = 3.

  IF SY-SUBRC <> 0.
    MESSAGE '項目カタログの生成に失敗しました。' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  " 2-2) 表示列の最低限設定(MERGE後に必要分だけ上書き)
  "      ※列幅は LS_LAYOUT-COLWIDTH_OPTIMIZE に任せるため OUTPUTLEN は設定しない
  DATA LT_SET TYPE SLIS_T_FIELDCAT_ALV.

  LT_SET = VALUE SLIS_T_FIELDCAT_ALV(
    ( FIELDNAME = 'MATNR'    SELTEXT_L = '品目コード' COL_POS = 1 KEY = ABAP_TRUE )
    ( FIELDNAME = 'ZTEXT'    SELTEXT_L = '商品名'     COL_POS = 2 )
    ( FIELDNAME = 'ZAMT_SAL' SELTEXT_L = '売上金額'   COL_POS = 3 CFIELDNAME = 'WAERS' )
    ( FIELDNAME = 'WAERS'    SELTEXT_L = '通貨'       COL_POS = 4 )
    ( FIELDNAME = 'ZISDT'    SELTEXT_L = '登録日'     COL_POS = 5 )
    ( FIELDNAME = 'ZNUM'     SELTEXT_L = '伝票番号'   COL_POS = 6 )
  ).

  LOOP AT LT_FCAT INTO DATA(LS_FCAT).

    READ TABLE LT_SET INTO DATA(LS_SET)
      WITH KEY FIELDNAME = LS_FCAT-FIELDNAME.

    IF SY-SUBRC <> 0.
      LS_FCAT-NO_OUT = ABAP_TRUE.     " 表示しない
      MODIFY LT_FCAT FROM LS_FCAT.
      CONTINUE.
    ENDIF.

    LS_FCAT-NO_OUT     = ABAP_FALSE.  " 表示する
    LS_FCAT-SELTEXT_L  = LS_SET-SELTEXT_L.
    LS_FCAT-COL_POS    = LS_SET-COL_POS.
    LS_FCAT-KEY        = LS_SET-KEY.
    LS_FCAT-CFIELDNAME = LS_SET-CFIELDNAME. " 金額→通貨参照(該当列のみ)

    MODIFY LT_FCAT FROM LS_FCAT.
  ENDLOOP.

  " 3) 見やすいレイアウト(列幅は自動最適化に任せる)
  LS_LAYOUT-COLWIDTH_OPTIMIZE = ABAP_TRUE. "列幅最適化
  LS_LAYOUT-ZEBRA             = ABAP_TRUE. "ゼブラ表示
  LS_LAYOUT-WINDOW_TITLEBAR   = '売上一覧(旧ALV)'.

  " 4) ALV出力(グリッド)
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = SY-REPID
      IS_LAYOUT          = LS_LAYOUT
      IT_FIELDCAT        = LT_FCAT
      I_SAVE             = 'A'
    TABLES
      T_OUTTAB           = LT_OUT
    EXCEPTIONS
      OTHERS             = 1.

  IF SY-SUBRC <> 0.
    MESSAGE 'ALV出力に失敗しました。' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
結果

このサンプルでは、ZT200400101 のデータを ALV で一覧表示します。 ただし、テーブルの全項目をそのまま表示すると列数が多くなり、画面が横に潰れて読みにくくなります。

1. 項目カタログは「自動生成 → 必要な列だけ調整」が基本

項目カタログには、列の見出し、表示順、表示形式など「一覧表示の設計情報」が含まれます。
初心者が最初から項目カタログを手作業で組み立てると、設定項目が多くて混乱しやすく、また定義漏れも起きがちです。
そこで本テキストでは、まず汎用モジュール「REUSE_ALV_FIELDCATALOG_MERGE」で自動生成し、 その後に必要な列だけ最小限の調整を行う方法を採用します。

2. REUSE_ALV_FIELDCATALOG_MERGE で項目カタログを生成する

REUSE_ALV_FIELDCATALOG_MERGEは、DDICの構造(テーブル/構造/ビュー)をもとに、ALV表示に必要な項目カタログを生成する汎用モジュールです。 この汎用モジュールでは、主に次の情報を指定します。

  • 構造名(I_STRUCTURE_NAME)
  • 項目定義の元になるDDICオブジェクト名(例:ZT200400101)

  • 出力テーブル名(I_INTERNAL_TABNAME)
  • ALVに渡す内部テーブル名(例:LT_OUT)

  • プログラム名(I_PROGRAM_NAME)
  • 通常は SY-REPID を指定

自動生成が成功すると、項目カタログ(CT_FIELDCAT)に列定義が格納されます。
失敗した場合は SY-SUBRC が 0 以外になるため、必ず戻り値をチェックして、異常時は処理を中断します。

3. 自動生成した項目カタログを「最小限だけ」調整する

自動生成した項目カタログには、構造に含まれる多くの項目が含まれます。 しかし、項目を多く表示しすぎると一覧が横に広がり、学習者にとって読みにくくなります。 そのため本サンプルでは、次の方針で調整します。

1. 表示したい列だけを残し、それ以外は非表示にする
2.残した列について、次の「最低限の設定」だけを上書きする
列見出し(SELTEXT_L)
表示順(COL_POS)
キー列(KEY)
金額列の通貨参照(CFIELDNAME:売上金額 → 通貨コード)

この程度の調整でも、画面は十分読みやすくなり、教材としても理解しやすい構成になります。

4. 列幅は「自動最適化」に任せる
列幅(OUTPUTLEN)は手作業でも設定できますが、初学者の段階では設定項目が増えて負担になりがちです。
本テキストでは、まずレイアウト設定の列幅最適化(COLWIDTH_OPTIMIZE)を有効化し、列幅は自動調整に任せます。
LS_LAYOUT-COLWIDTH_OPTIMIZE = ABAP_TRUE.(列幅を自動最適化)
LS_LAYOUT-ZEBRA = ABAP_TRUE.(ゼブラ表示で視認性を向上)

この方針にすることで、項目カタログ側の設定は最小限に抑えつつ、実行結果の見やすさを確保できます。
■ 補足:フィールドカタログで「表示する列と見出し」を定義(ALV用の編集)

旧ALV(REUSE_ALV_GRID_DISPLAY)では、ALVに表示する列の情報をフィールドカタログで指定します。フィールドカタログは、「どの項目を表示するか」「見出し(列名)」「列幅」など、一覧表示の設計情報をまとめた内部テーブルです。
本サンプルでは、フィールドカタログを作成する際に次の内容を指定しています。

  • ・FIELDNAME:表示する項目名(内部テーブルの項目名と一致させる)
  • ・SELTEXT_L:列の見出し(人が読むための表示名)
  • ・OUTPUTLEN:列幅(見やすさの調整)
  • ・KEY:キー項目扱い(例:先頭に置いて識別しやすくするため)
  • ・CFIELDNAME:金額(CURR)項目の通貨項目(CUKY)を指定する
  • 例:売上金額ZAMT_SALに対して、通貨「WAERS」を関連付けるために 「CFIELDNAME = ‘WAERS’」を指定する

■補足:画面が崩れにくいようにするレイアウトを設定

最後に、ALVの表示を見やすくするため、表示調整の設定を有効化します。
・列幅最適化(colwidth_optimize):列の幅を内容に合わせて自動調整する
・ゼブラ表示(zebra):行を縞模様にして、横方向に視線を追いやすくする

これらは「機能追加」というより、表示品質(読みやすさ)を確保するための基本設定です。

ON/OFF と TRUE/FALSE の考え方

ABAPでは「有効/無効」や「する/しない」といった 二択の設定を、さまざまな方法で表します。
このとき、教材やソースコードで ON/OFF と TRUE/FALSE の表現が混在していると、 意味が同じなのか違うのかが分かりづらくなります。ここでは、ABAPでよく使われる真偽(ブール)表現を整理します。

■ ABAP_TRUE / ABAP_FALSE(推奨:真偽の標準定数)

abap_true は内部的に ‘X’、abap_false は空白を表します。 設定の有効化/無効化でも、条件判定でも、どちらも同じ真偽値として扱えます。

例) レイアウト設定を有効化する(設定系)
DATA lv_ok TYPE abap_bool.
lv_ok = abap_true. ” 真(有効)
lv_ok = abap_false. ” 偽(無効)
例) 条件が真なら処理する(判定系)
IF lv_ok = abap_true.
…
ENDIF.

このように、「有効化(設定)」と「真(判定)」は、コード上は同じ abap_true / abap_false で表現できます。そのため、本文の説明でも「ON/OFF」「TRUE/FALSE」を使い分けるのではなく、有効化/無効化、真/偽を abap_true / abap_false に対応させて理解するのが最も分かりやすい整理です。

■ABAP_ON / ABAP_OFF

ABAPには ABAP_ON / ABAP_OFF という定数も存在し、意味としては「ON/OFF」を表します。
既存の資料や古いコードでは ON/OFF という表現(ABAP_ON / ABAP_OFF など)が出てくることがあります。その場合は、次のように読み替えて問題ありません。

ON(有効)= abap_true
OFF(無効)= abap_false

本テキストでは、表記と実装を統一するため、以降の説明・サンプルコードは abap_true / abap_false を 使用します。

ALV出力を実装するポイント

ALVは最初は難しく見えますが、実装の考え方はシンプルです。本テキストでは、次のポイントを押さえて進めます。
① ALV出力のために出力用構造を作成(SE11)
② 汎用モジュール「REUSE_ALV_FIELDCATALOG_MERGE」
③ 汎用モジュール「REUSE_ALV_GRID_DISPLAY」

■ALV出力のために出力用構造を作成(SE11)

ここでは、「ALVに表示したい項目」を定義します。 逆に言えば、一覧画面で表示したい項目は、出力用構造に含めておく必要があります。 なお、既存テーブルとまったく同じ項目をそのまま出力するだけであれば、既存テーブル(または既存構造)をそのまま参照できるため、新たに出力用構造を作成しなくても構いません。

■汎用モジュール「REUSE_ALV_FIELDCATALOG_MERGE」

この汎用モジュールは、出力用構造(またはテーブル/ビュー)から ALVの項目カタログ(フィールドカタログ)を生成します。
言葉だけだと分かりづらいですが、要するに「ALV表示に必要な列定義(見出し・型・通貨参照など)を作るための準備処理」です。基本的には、EXPORTパラメータに出力用構造名を指定して実行すればOKです。

■汎用モジュール「REUSE_ALV_GRID_DISPLAY」

汎用モジュール「REUSE_ALV_GRID_DISPLAY」(書き直し版)
こちらは、実際にALVを一覧表示するための汎用モジュールです。実行時は主に次を渡します。

・EXPORTING:REUSE_ALV_FIELDCATALOG_MERGEで作成した項目カタログ
・TABLES:出力したいデータが入った内部テーブル

これらを指定して呼び出すことで、ALVとして一覧表示できます。

■補足:プログラム内にTYPE-POOLS : SLISの定義(※現在は、定義しなくても動作します)

従来、クラシックALVでは 、「TYPE-POOLS: SLIS.」をプログラム先頭付近に書く例が多くありました。 ただし現在の環境では、型グループが参照時に自動ロードされるため、明示しなくても動作するケースが一般的です。
本テキストでは「古いサンプルを読むために出てくる可能性がある」ことを前提に触れますが、「必ず書く絶対ルール」として暗記しないようにしてください。

■補足:EXCEPTIONSとSY-SUBRCの意味

REUSE_ALV_FIELDCATALOG_MERGEには、エラー判定用に次のEXCEPTIONSが用意されています。

EXCEPTIONS
	INCONSISTENT_INTERFACE = 1
	PROGRAM_ERROR = 2
	OTHERS = 3.

このEXCEPTIONSは、汎用モジュール側で「呼び出しに必要な情報が不足している/矛盾している」などを検知した場合に使われます。 たとえば、呼び出し元となるメインプログラム名や、項目カタログ作成に必要な構造名が空白の場合に INCONSISTENT_INTERFACE を発生させる設計になっています。 別の理由で、内部的な PROGRAM_ERROR が起きた場合は、SY-SUBRC = 2 になります。

■補足:DD02L-TABNAME

DD02L-TABNAMEは、データディクショナリ上の「テーブル/ビュー名(TABNAME)」の型です。
DD02LのTABNAMEを指し、SE11で「DD02L」を検索すると内容を確認できます。 DD02Lには、SAP内で定義されたテーブルの名称などが格納されています。

また、REUSE_ALV_FIELDCATALOG_MERGEのEXPORTINGパラメータ、I_STRUCTURE_NAMEは、このDD02L-TABNAMEを参照しています。 そのため、I_STRUCTURE_NAMEに文字列を直接書いても動作しますが、変数側も DD02L-TABNAMEで型合わせしておくと、 「ここには構造(テーブル/ビュー)名を渡す」という意図が明確になります。

項目カタログの定義

項目カタログは、ALVの各列(フィールド)に対して「どう表示するか」を定義する情報です。
列見出し、列順、列幅、表示形式などを設定できます。
項目カタログはALVが想定する型(例:SLIS_T_FIELDCAT_ALV)で準備する必要があります。型が合っていないと実行時エラーの原因になるため、宣言時点でALV用の型に合わせます。 また、項目カタログは汎用モジュール(例:REUSE_ALV_FIELDCATALOG_MERGE)を使って、DDICのテーブルや構造から自動生成できます。最初は自動生成を使い、必要な列だけ見出しや順序を調整する方法が取り組みやすいです。

ALV出力の項目カタログとレイアウト

クラシックALV(REUSE_ALV_GRID_DISPLAY)では、一覧の見た目を整えるために、主に次の2つの情報を準備します。

  • 項目カタログ(フィールドカタログ):列(フィールド)ごとの表示ルール
  • レイアウト:一覧全体の表示オプション

どちらも設定できる項目数は非常に多いため、本テキストでは、頻出の項目を中心に紹介します。


※項目カタログの自動生成

項目カタログは、ALVの各列について「どの列を表示するか」「列見出し」「表示順」などのルールを定義する情報です。
この情報は汎用モジュール「REUSE_ALV_FIELDCATALOG_MERGE」を使うことで、DDICの構造(テーブル/構造)から自動生成できます。

本サンプルでは、まず自動生成を行い、見出し・順序などを最小限の項目を調整します。

■ REUSE_ALV_FIELDCATALOG_MERGE の基本指定

REUSE_ALV_FIELDCATALOG_MERGE では、最低限として次の3点を指定します。
・I_PROGRAM_NAME:通常は SY-REPID
・I_INTERNAL_TABNAME:ALVに渡す内部テーブル名(例:LT_OUT)
・I_STRUCTURE_NAME:項目定義の元になる構造名(例:ZT200400101)

■サンプルで扱う「最小セット」

フィールドカタログ(SLIS_T_FIELDCAT_ALV)には多数の項目があります。 しかし本サンプルでは、「まず一覧を整えられる」ことを目的に、次の項目だけを使います。

  • FIELDNAME:どの列か(内部テーブルの項目名)
  • SELTEXT_L:列見出し(長い見出し)
  • COL_POS:列の表示順
  • KEY:キー列として扱う(識別しやすい列を先頭に固定しやすい)
  • NO_OUT:表示しない列(非表示にしたい列に設定)
  • CFIELDNAME:金額(CURR)列に対する通貨列(CUKY)の関連付け
  • (例:売上金額→通貨)


それ以外の項目(色付け、アイコン、ホットスポット、編集マスク、合計など)は、必要になったタイミングで付録を参照できれば十分です。

■レイアウトは「読みやすさのための3項目」に絞る

レイアウト(SLIS_LAYOUT_ALV)も設定可能な項目が非常に多いですが、 本章では「機能を増やす」のではなく読みやすい一覧にすることを優先にして、次の3つだけを扱います。

  • COLWIDTH_OPTIMIZE:列幅を内容に合わせて自動調整する(列幅は手で決めず、まず自動で見やすくする)
  • ZEBRA:行を縞模様(交互の背景)にして、横方向に視線を追いやすくする
  • WINDOW_TITLEBAR:ALV画面のタイトルバー文字列を設定する

付録:ALVの代表項目一覧(クラシックALV)

付録では、クラシックALVでよく登場する「項目カタログ(SLIS_T_FIELDCAT_ALV)」と「レイアウト(SLIS_LAYOUT_ALV)」の項目を、用途別に整理します。 元資料は全項目が並んでいますが、初心者が最初から全てを使う必要はありません。必要になったときに「該当カテゴリだけ」参照してください。


A. 項目カタログ(SLIS_T_FIELDCAT_ALV)代表項目
●A-1. 表示する/しない・並び順を決める(最重要)
・FIELDNAME:内部テーブルの項目名(どの列か)
・COL_POS:列の表示位置(表示順)
・NO_OUT:列を表示しない(非表示)
・KEY:キー列(識別しやすい列に付ける)

●A-2. 見出し(列名)を整える
列の見出しは、DDIC由来のテキストが自動セットされますが、「教材として分かりやすい日本語」に 直したい場合は上書きします。
・SCRTEXT_L / _M / _S:列見出し(長/中/短)
・REPTEXT:ヘッダ(関連データエレメントのテキスト)
・TOOLTIP:列ヘッダのツールチップ

サンプルでは、見出しを「SELTEXT_L」を使って上書きしていますが、考え方としては SCRTEXT_L と同じ「列見出しの上書き」です。

●A-3. 金額・数量の単位を正しく表示する(実務で重要)
金額(CURR)や数量(QUAN)は、単位(通貨・数量単位)とセットで表示するのが 基本です。
・CFIELDNAME:通貨(CUKY)項目名を関連付ける(例:金額→通貨コード)
・QFIELDNAME:数量単位(UNIT)項目名を関連付ける

●A-4. 表示フォーマット(必要になったら)
・JUST:表示位置(左/右寄せなど)
・NO_ZERO:0を非表示
・EDIT_MASK:編集マスク
・OUTPUTLEN:列幅

本文では列幅はレイアウトの自動最適化(COLWIDTH_OPTIMIZE)に任せる方針のため、 OUTPUTLENは割愛されています。(必要になったケースだけ付録参照)。

●A-5. 罫線・セル結合(基本では扱わない)
・NO_MERGING:セルを結合しない

ただし、セル結合は「見た目が整う」反面、初心者が最初に触ると混乱しやすいので、 基本章では扱わないのが安全です。

B. レイアウト(SLIS_LAYOUT_ALV)代表項目

●B-1. まず使う3つ(本文の方針と一致)
・COLWIDTH_OPTIMIZE:列幅を自動最適化(列幅を調整して読みやすくする)
・ZEBRA:ゼブラ表示(行を縞模様にして視線を追いやすくする)
・WINDOW_TITLEBAR:タイトルバーに表示する文字列

●B-2. 表示の好み(必要なら)
・NO_COLHEAD:列見出しを表示しない
・NO_VLINE / NO_HLINE:罫線(縦線・横線)の制御

●B-3. セル結合(基本章では非推奨)
・CELL_MERGE:同一内容のセルを結合して表示する系のオプション
(一覧の「見た目」をまとめたいときに使用)

旧ALVとSALVの違い

ここまでの例では、旧ALV(REUSE_ALV_GRID_DISPLAY)を使って一覧表示を行いました。
旧ALVでは、ALVに表示する列の情報を「フィールドカタログ」としてプログラム側で用意し、 「どの項目を表示するか」「見出し」「列幅」などを明示的に指定するのが基本です。
一方、S/4HANAの開発でよく使われる「SALV(CL_SALV_TABLE)」では、 内部テーブルの定義(項目構成)をもとに、表示列を自動的に生成できます。
そのため、旧ALVのようにフィールドカタログを毎回作成しなくても、短いコードで一覧表示を実現できます。
つまり、同じ「ALV一覧表示」でも考え方は次のように整理できます。

・旧ALV(REUSE):表示列をフィールドカタログで自分で定義する(細かな制御ができる)
・SALV:内部テーブルの構造から表示列を自動生成する(短く書けて学習しやすい)
本テキストでは、旧ALVで「列定義が必要であること」を理解したうえで、次のステップとしてSALVによる、よりシンプルな一覧表示の書き方を学習します。これにより、「旧来の資産も読める」+「現在の主流の書き方も使える」という形で理解を広げられます。

SALV(CL_SALV_TABLE)による一覧表示

1. SALVの特徴は次の通りです。
・列定義を自動生成できる
内部テーブルの項目構成から列を作るため、フィールドカタログ作成が不要になります。
・短いコードで一覧表示できる
「一覧を出す」だけなら実装がシンプルになります。
・逆に、細かな制御が必要な場合は旧ALV(または別方式)を検討する
旧ALVはフィールドカタログで列定義を持てるため、細かな制御に向きます。

補足:SALVはクラスベース(オブジェクト指向)なので、 最低限「クラスメソッドを呼び出して表示する」という読み方ができれば十分です。

2. 代表的な構文(最小限)
SALVの基本パターンは次の3ステップです。
1.データを内部テーブルに取得する
2.CL_SALV_TABLE=>FACTORY でALVオブジェクトを生成する
3.DISPLAY で表示する

この章では、表示を見やすくするために次の設定も合わせて使います。
・列幅の自動最適化:get_columns( )->set_optimize( abap_true )
・ゼブラ表示:get_display_settings( )->set_striped_pattern( abap_true )
・タイトル:get_display_settings( )->set_list_header( … )

注意:環境(WebGUI等)によって、ソート/フィルターのボタンがツールバーに出ず、表側のメニューにまとめられて表示されることがあります。

サンプルコード
*&---------------------------------------------------------------------*
*& Report Z_SAMPLE223_SALV
*&---------------------------------------------------------------------*
*& 概要   :ZT200400101をSALVで一覧表示
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE223_SALV.

CONSTANTS C_MAX_ROWS TYPE I VALUE 200.

"------------------------------------------------------------
" 選択条件
"------------------------------------------------------------
DATA LV_ZISDT TYPE ZE200400103. "登録日(DATS)
DATA LV_MATNR TYPE MATNR.       "品目コード

SELECT-OPTIONS:
  S_ZISDT FOR LV_ZISDT,
  S_MATNR FOR LV_MATNR.

"------------------------------------------------------------
" 出力用TYPE(必要項目だけ)
"------------------------------------------------------------
TYPES: BEGIN OF TY_OUT,
         MATNR    TYPE ZT200400101-MATNR,     "品目コード
         ZTEXT    TYPE ZT200400101-ZTEXT,     "商品名
         ZAMT_SAL TYPE ZT200400101-ZAMT_SAL,  "売上金額
         WAERS    TYPE ZT200400101-WAERS,     "通貨コード
         ZISDT    TYPE ZT200400101-ZISDT,     "登録日
         ZNUM     TYPE ZT200400101-ZNUM,      "伝票番号
       END OF TY_OUT.

DATA LT_OUT TYPE STANDARD TABLE OF TY_OUT WITH EMPTY KEY.

START-OF-SELECTION.

  " 1) データ取得(必要項目だけ)
  SELECT MATNR, ZTEXT, ZAMT_SAL, WAERS, ZISDT, ZNUM
    FROM ZT200400101
    WHERE ZISDT IN @S_ZISDT
      AND MATNR IN @S_MATNR
    INTO TABLE @LT_OUT
    UP TO @C_MAX_ROWS ROWS.


  IF LT_OUT IS INITIAL.
    MESSAGE '該当データがありません。' TYPE 'S'.
    RETURN.
  ENDIF.

  " 2) SALVオブジェクト生成 → 3) 表示
  TRY.
      DATA LO_ALV TYPE REF TO CL_SALV_TABLE.

      CL_SALV_TABLE=>FACTORY(
        IMPORTING
          R_SALV_TABLE = LO_ALV
        CHANGING
          T_TABLE      = LT_OUT ).

      " 見やすい表示(最小限)
      LO_ALV->GET_COLUMNS( )->SET_OPTIMIZE( ABAP_TRUE ).
      LO_ALV->GET_DISPLAY_SETTINGS( )->
SET_STRIPED_PATTERN( ABAP_TRUE ).
      LO_ALV->GET_DISPLAY_SETTINGS( )->
SET_LIST_HEADER( '売上一覧(SALV)' ).

      LO_ALV->DISPLAY( ).

    CATCH CX_SALV_MSG INTO DATA(LX_SALV).
      MESSAGE LX_SALV->GET_TEXT( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.	

■ データ取得
SALVも旧ALVと同様に、一覧に表示する元データを内部テーブルへ取得します。ここでは、表示列が増えすぎないように必要項目だけをSELECTしています。

■ CL_SALV_TABLE=>FACTORY で生成
SALVでは、表示対象の内部テーブル(lt_out)を渡してALVオブジェクトを作ります。内部テーブルの項目構成から列が自動生成されるため、旧ALVのようにフィールドカタログを自作する必要がありません。

■ 最小限の表示調整
本テキストでは、まず次の3点だけ設定します。
・列幅の自動最適化(読みやすさ)
・ゼブラ表示(行を追いやすくする)
・タイトル(何の一覧かを明示する)


NEXT>> 23.4 ソート

研修の詳細はこちら