ALV 帳票出力

23.3 ALV 帳票出力

3. ALV 帳票出力

ALV出力には大きく3つのステップが存在します。

  1. 出力データの取得
  2. 項目カタログの定義
  3. ALV出力

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

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

ALVは内部テーブルの値を後述するレイアウト定義に応じて表示する仕組みです。
前段として、ALVで表示させたいデータを取得し指定の内部テーブルに格納します。

※CORRESPONDING FIELDS OF は何?
オプション「CORRESPONDING FIELDS OF」を使用する事で、BSEGから、指定した内部テーブル「GTBL_ACCOUNT_DOC」へデータを格納する時に、
BSEGと名称が同じ項目にデータが格納されるようになります。

※UP TO 10 ROWSの配置について
SELECT命令のどこに配置(記載)しても問題ないのか?
FROM句の前でもWHERE句の前でもどちらでも問題はない・
特に決まりはないので、もしプログラム内の別箇所でもUP TO ROWSが使用されていれば、そちらと記載位置を合わせるなどして全体で統一しましょう!

ALVの実装方法-項目カタログの定義

項目カタログとは、ALV出力を行うために必要な各項目(列)の定義情報です。

項目カタログはそれぞれ専用のデータ構造でなければならず、この構造を無視するとプログラムはショートダンプしてしまします。

デフォルトとして記述しておけば良いのですが、正確に言うと
ALVで出力するデータとして、
DATA: GTBL_ACCOUNT_DOC TYPE STANDARD TABLE OF BSEG.

ALVで出力するレイアウトを設定する用として(タイトル名等)
DATA G_LAYOUT TYPE SLIS_LAYOUT_ALV.
ALVで各列項目の書式を設定する用として
DATA G_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
または
DATA GTBL_FIELDCAT TYPE STANDARD TABLE OF SLIS_FIELDCAT_ALV.
両方のどちらの宣言方法でも使用できます。(作成されるオブジェクトは一緒です。)
ただし、通例的には、DATA G_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
を使用します。

※TYPE-POOLS: SLIS. は今は無くても動作します。

ALVの実装方法-ALV出力

①出力するレコードと②項目カタログの用意ができたら、フィールドのALV出力専用の汎用モジュールを利用してALV帳票出力をおこないます。

サンプルコード

REPORT ZR_23_TEST_KANDA.

 TYPE-POOLS: SLIS.
*内部テーブル
 DATA: GTBL_ACCOUNT_DOC TYPE STANDARD TABLE OF BSEG.

*変数定義
DATA G_LAYOUT TYPE SLIS_LAYOUT_ALV.

*こちらの方をCT_FIELDCATとして設定しても動作します。
*その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
DATA G_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

*こちらの方をCT_FIELDCATとして設定しても動作します。
*その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
DATA GTBL_FIELDCAT TYPE STANDARD TABLE OF SLIS_FIELDCAT_ALV.

DATA: G_BUKRS TYPE BSEG-BUKRS.


*選択画面
SELECTION-SCREEN BEGIN OF BLOCK LAYOUT WITH FRAME .
SELECT-OPTIONS: S_BUKRS FOR G_BUKRS.
SELECTION-SCREEN END OF BLOCK LAYOUT.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
 EXPORTING
*   I_PROGRAM_NAME               =
*   I_INTERNAL_TABNAME            =
   I_STRUCTURE_NAME              = 'BSEG'
   I_CLIENT_NEVER_DISPLAY       = ''
*   I_INCLNAME                   =
*   I_BYPASSING_BUFFER           =
*   I_BUFFER_ACTIVE              =
  CHANGING
    CT_FIELDCAT                  = GTBL_FIELDCAT
 EXCEPTIONS
   INCONSISTENT_INTERFACE       = 1
   PROGRAM_ERROR                = 2
   OTHERS                       = 3.









* 出力データの取得
SELECT *
  FROM BSEG
  INTO CORRESPONDING FIELDS OF TABLE GTBL_ACCOUNT_DOC
  UP TO 10 ROWS
  WHERE
   BUKRS in S_BUKRS.

"タイトル表示
G_LAYOUT-WINDOW_TITLEBAR = '伝票照会'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
  EXPORTING
     IT_FIELDCAT = GTBL_FIELDCAT
      IS_LAYOUT = G_LAYOUT
      I_SAVE = 'A'
  TABLES
    T_OUTTAB = GTBL_ACCOUNT_DOC
  EXCEPTIONS
    OTHERS = 0.

出力結果

当該汎用モジュールも様々なパラメータが用意されていますが、最低限のパラメータをインプットするだけでALV出力が完成します。

これがALVの基本です。
実は表示したいデータと項目カタログ(一覧の定義情報)だけ用意してあげるだけの簡単な仕組みです。

ALV出力を実装する4つのキーポイント

「ALVって難しそう…」と感じた人もいるかもしれません。
  確かに始めてみると難しそうに感じますが、実は覚えるべきポイントは4つだけです。

①プログラム内にTYPE-POOLS : SLIS.を定義(※現在は、定義しなくても動作します)
②ALV出力のために出力用構造を作成(SE11)
③汎用モジュール「REUSE_ALV_FIELDCATALOG_MERGE」
④汎用モジュール「REUSE_ALV_GRID_DISPLAY」

■①プログラム内にTYPE-POOLS : SLIS.を定義

ALV出力を行うときには不可欠となるデータ群です。
プログラム内でALV出力を行うときは、必ず最初のほうに記載をします。
ALV出力時の絶対のルールだと思ってしまってOKです。
とにかく記載をしてあげればOKとなります。
(※現在は、定義しなくても動作します)

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

どの項目をALV出力するかをここで定義しておきます。
逆に言えば、結果画面でALVで出力したい項目については、
ここで出力用構造に設定しておく必要があります。
※既存のテーブルと全く同じようにように出力させる場合は、
既存のテーブル型の構造を使用すればよいので作成不要。

■③汎用モジュール「REUSE_ALV_FIELDCATALOG_MERGE」

出力用構造からALV項目カタログを作成します。
言葉にすると何が何だかわからないですが、
要するにALVで出力するための準備を行うための汎用モジュールです。
EXPORTパラメータに出力用構造を指定して実行すればOKです。

項目カタログ

項目カタログの情報は、汎用モジュール「REUSE_ALV_FIELDCATALOG_MERGE」で取得することができ、必要に応じて 書き換えること ができます。

■④汎用モジュール「REUSE_ALV_GRID_DISPLAY」

実際にALV出力を行う汎用モジュールです。
・EXPORTパラメータに③の汎用モジュールで作成したALV項目カタログ
・TABLESパラメータに出力したいデータの入った内部テーブル
上記を指定して実行すればOKです。

<参考>

REPORT ZTEST_PROGRAM_ALV_03.
TYPE-POOLS :SLIS.

DATA: LV_STRUCTURE_NAME TYPE DD02L-TABNAME,
      LT_FIELDCAT       TYPE SLIS_T_FIELDCAT_ALV,
      LT_OUTTAB         TYPE STANDARD TABLE OF SPFLI.

* パラメータに値を設定する
LV_STRUCTURE_NAME = 'SPFLI'.   " 内部テーブル構造名

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
     I_STRUCTURE_NAME         = LV_STRUCTURE_NAME
  CHANGING
    CT_FIELDCAT            = LT_FIELDCAT
  EXCEPTIONS
    INCONSISTENT_INTERFACE = 1
    PROGRAM_ERROR          = 2
    OTHERS                 = 3
  
* 正常の場合
IF SY-SUBRC = 0.
  SELECT *
    FROM SPFLI
     INTO TABLE  LT_OUTTAB.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      IT_FIELDCAT      = LT_FIELDCAT
    TABLES
      T_OUTTAB         = LT_OUTTAB
    EXCEPTIONS
      PROGRAM_ERROR    = 1
      OTHERS           = 2
    .
ENDIF. 

補足①

こちらのEXCEPTIONSは汎用モジュールにおけるエラー判定用のパラメータ
この汎用モジュールは、大元のREUSE_ALV_LIST_DISPLAYが呼び出すときに呼び出し元となるメインプログラム名や
項目カタログを取得する際の構造名が空白だった場合に「INCONSISTENT_INTERFACE」という名前のエラーを起こすようになっています。
別の理由で「PROGRAM_ERROR」が起きればSY-SUBRC = 2となります。

サンプルコード①(エラー)

REPORT ZR_23_TEST_KANDA_ERROR.

  TYPE-POOLS: SLIS.

* 内部テーブル
  DATA: GTBL_ACCOUNT_DOC TYPE STANDARD TABLE OF BSEG.

* 変数定義
  DATA G_LAYOUT TYPE SLIS_LAYOUT_ALV.

* こちらの方をCT_FIELDCATとして設定しても動作します。
* その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
  DATA G_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

* こちらの方をCT_FIELDCATとして設定しても動作します。
* その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
  DATA GTBL_FIELDCAT TYPE STANDARD TABLE OF SLIS_FIELDCAT_ALV.
  DATA G_BUKRS TYPE BSEG-BUKRS.

* 選択画面
  SELECTION-SCREEN BEGIN OF BLOCK LAYOUT WITH FRAME.
  SELECT-OPTIONS S_BUKRS FOR G_BUKRS.
  SELECTION-SCREEN END OF BLOCK LAYOUT.















* エラーを起こすために、構造名(I_STRUCTURE_NAME)を空白にして実行
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
*      I_PROGRAM_NAME         =
*      I_INTERNAL_TABNAME     =
*      I_STRUCTURE_NAME        = 'BSEG'
      I_STRUCTURE_NAME        = SPACE
*      I_CLIENT_NEVER_DISPLAY = 'X'
*      I_INCLNAME             =
*      I_BYPASSING_BUFFER     =
*      I_BUFFER_ACTIVE        =
    CHANGING
      CT_FIELDCAT             = GTBL_FIELDCAT
    EXCEPTIONS
      INCONSISTENT_INTERFACE  = 1
      PROGRAM_ERROR           = 2
      OTHERS                  = 3.

* 汎用モジュールエラーの場合
* 内部て起きたエラーの種類によって、
* SY-SUBRCにEXCEPTIONSの1or2or3のどれかが設定される。
  IF SY-SUBRC <> 0.
    MESSAGE S530(0K) DISPLAY LIKE 'E'.  "「項目カタログがみつかりません」
    RETURN.
  ENDIF.

* 出力データの取得
  SELECT *
    FROM BSEG
    INTO CORRESPONDING FIELDS OF TABLE GTBL_ACCOUNT_DOC
   UP TO 10 ROWS
   WHERE BUKRS IN S_BUKRS.

" タイトル表示
  G_LAYOUT-WINDOW_TITLEBAR = '伝票照会'.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      IT_FIELDCAT   = GTBL_FIELDCAT
      IS_LAYOUT     = G_LAYOUT
      I_SAVE        = 'A'
    TABLES
      T_OUTTAB      = GTBL_ACCOUNT_DOC
    EXCEPTIONS
      PROGRAM_ERROR = 1
      OTHERS        = 2.

補足②

DD02L-TABNAME

DD02L テーブル のTABNAME という項目を指し、
SE11 では DD02L と検索いただくと内容が確認できる。
DD02L には、SAP内で作成したテーブルのテーブル名等が格納されています。

またLV_STRUCTURE_NAME TYPE DD02L-TABNAME,
は、
汎用モジュール’REUSE_ALV_FIELDCATALOG_MERGE’
におけるEXPORTING パラメータの I_STRUCTURE_NAME の型が
DD02L-TABNAME を参照しているため
直接I_STRUCTURE_NAMEに文字列を直書きしてもよいのですが、
念のため参照しデータ型を合わしています。

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

項目カタログ
SLIS_T_FIELDCAT_ALV
にて様々なALVで各列項目の書式を設定することが出来る

DATA G_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

上記 G_FIELDCAT には 以下の項目が構築されていることになります。

レイアウト

SLIS_LAYOUT_ALV
にてALVで出力するレイアウトを設定することができます。

DATA G_LAYOUT TYPE SLIS_LAYOUT_ALV.

上記 G_LAYOUT には 以下の項目が構築されていることになります。


NEXT>> 第24章 フィールドシンボル