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)
- 出力テーブル名(I_INTERNAL_TABNAME)
- プログラム名(I_PROGRAM_NAME)
項目定義の元になるDDICオブジェクト名(例:ZT200400101)
ALVに渡す内部テーブル名(例:LT_OUT)
通常は 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点だけ設定します。
・列幅の自動最適化(読みやすさ)
・ゼブラ表示(行を追いやすくする)
・タイトル(何の一覧かを明示する)