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帳票出力をおこないます。

サンプルコード

1REPORT ZR_23_TEST_KANDA.
2 
3 TYPE-POOLS: SLIS.
4*内部テーブル
5 DATA: GTBL_ACCOUNT_DOC TYPE STANDARD TABLE OF BSEG.
6 
7*変数定義
8DATA G_LAYOUT TYPE SLIS_LAYOUT_ALV.
9 
10*こちらの方をCT_FIELDCATとして設定しても動作します。
11*その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
12DATA G_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
13 
14*こちらの方をCT_FIELDCATとして設定しても動作します。
15*その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
16DATA GTBL_FIELDCAT TYPE STANDARD TABLE OF SLIS_FIELDCAT_ALV.
17 
18DATA: G_BUKRS TYPE BSEG-BUKRS.
19 
20 
21*選択画面
22SELECTION-SCREEN BEGIN OF BLOCK LAYOUT WITH FRAME .
23SELECT-OPTIONS: S_BUKRS FOR G_BUKRS.
24SELECTION-SCREEN END OF BLOCK LAYOUT.
25 
26CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
27 EXPORTING
28*   I_PROGRAM_NAME               =
29*   I_INTERNAL_TABNAME            =
30   I_STRUCTURE_NAME              = 'BSEG'
31   I_CLIENT_NEVER_DISPLAY       = ''
32*   I_INCLNAME                   =
33*   I_BYPASSING_BUFFER           =
34*   I_BUFFER_ACTIVE              =
35  CHANGING
36    CT_FIELDCAT                  = GTBL_FIELDCAT
37 EXCEPTIONS
38   INCONSISTENT_INTERFACE       = 1
39   PROGRAM_ERROR                = 2
40   OTHERS                       = 3.
41 
42 
43 
44 
45 
46 
47 
48 
49 
50* 出力データの取得
51SELECT *
52  FROM BSEG
53  INTO CORRESPONDING FIELDS OF TABLE GTBL_ACCOUNT_DOC
54  UP TO 10 ROWS
55  WHERE
56   BUKRS in S_BUKRS.
57 
58"タイトル表示
59G_LAYOUT-WINDOW_TITLEBAR = '伝票照会'.
60 
61CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
62  EXPORTING
63     IT_FIELDCAT = GTBL_FIELDCAT
64      IS_LAYOUT = G_LAYOUT
65      I_SAVE = 'A'
66  TABLES
67    T_OUTTAB = GTBL_ACCOUNT_DOC
68  EXCEPTIONS
69    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です。

<参考>

1REPORT ZTEST_PROGRAM_ALV_03.
2TYPE-POOLS :SLIS.
3 
4DATA: LV_STRUCTURE_NAME TYPE DD02L-TABNAME,
5      LT_FIELDCAT       TYPE SLIS_T_FIELDCAT_ALV,
6      LT_OUTTAB         TYPE STANDARD TABLE OF SPFLI.
7 
8* パラメータに値を設定する
9LV_STRUCTURE_NAME = 'SPFLI'.   " 内部テーブル構造名
10 
11CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
12  EXPORTING
13     I_STRUCTURE_NAME         = LV_STRUCTURE_NAME
14  CHANGING
15    CT_FIELDCAT            = LT_FIELDCAT
16  EXCEPTIONS
17    INCONSISTENT_INTERFACE = 1
18    PROGRAM_ERROR          = 2
19    OTHERS                 = 3
20   
21* 正常の場合
22IF SY-SUBRC = 0.
23  SELECT *
24    FROM SPFLI
25     INTO TABLE  LT_OUTTAB.
26 
27  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
28    EXPORTING
29      IT_FIELDCAT      = LT_FIELDCAT
30    TABLES
31      T_OUTTAB         = LT_OUTTAB
32    EXCEPTIONS
33      PROGRAM_ERROR    = 1
34      OTHERS           = 2
35    .
36ENDIF.

補足①

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

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

1REPORT ZR_23_TEST_KANDA_ERROR.
2 
3  TYPE-POOLS: SLIS.
4 
5* 内部テーブル
6  DATA: GTBL_ACCOUNT_DOC TYPE STANDARD TABLE OF BSEG.
7 
8* 変数定義
9  DATA G_LAYOUT TYPE SLIS_LAYOUT_ALV.
10 
11* こちらの方をCT_FIELDCATとして設定しても動作します。
12* その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
13  DATA G_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
14 
15* こちらの方をCT_FIELDCATとして設定しても動作します。
16* その場合は、'REUSE_ALV_LIST_DISPLAY'の IT_FIELDCAT に設定も同様に変更します。
17  DATA GTBL_FIELDCAT TYPE STANDARD TABLE OF SLIS_FIELDCAT_ALV.
18  DATA G_BUKRS TYPE BSEG-BUKRS.
19 
20* 選択画面
21  SELECTION-SCREEN BEGIN OF BLOCK LAYOUT WITH FRAME.
22  SELECT-OPTIONS S_BUKRS FOR G_BUKRS.
23  SELECTION-SCREEN END OF BLOCK LAYOUT.
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39* エラーを起こすために、構造名(I_STRUCTURE_NAME)を空白にして実行
40  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
41    EXPORTING
42*      I_PROGRAM_NAME         =
43*      I_INTERNAL_TABNAME     =
44*      I_STRUCTURE_NAME        = 'BSEG'
45      I_STRUCTURE_NAME        = SPACE
46*      I_CLIENT_NEVER_DISPLAY = 'X'
47*      I_INCLNAME             =
48*      I_BYPASSING_BUFFER     =
49*      I_BUFFER_ACTIVE        =
50    CHANGING
51      CT_FIELDCAT             = GTBL_FIELDCAT
52    EXCEPTIONS
53      INCONSISTENT_INTERFACE  = 1
54      PROGRAM_ERROR           = 2
55      OTHERS                  = 3.
56 
57* 汎用モジュールエラーの場合
58* 内部て起きたエラーの種類によって、
59* SY-SUBRCにEXCEPTIONSの1or2or3のどれかが設定される。
60  IF SY-SUBRC <> 0.
61    MESSAGE S530(0K) DISPLAY LIKE 'E'.  "「項目カタログがみつかりません」
62    RETURN.
63  ENDIF.
64 
65* 出力データの取得
66  SELECT *
67    FROM BSEG
68    INTO CORRESPONDING FIELDS OF TABLE GTBL_ACCOUNT_DOC
69   UP TO 10 ROWS
70   WHERE BUKRS IN S_BUKRS.
71 
72" タイトル表示
73  G_LAYOUT-WINDOW_TITLEBAR = '伝票照会'.
74 
75  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
76    EXPORTING
77      IT_FIELDCAT   = GTBL_FIELDCAT
78      IS_LAYOUT     = G_LAYOUT
79      I_SAVE        = 'A'
80    TABLES
81      T_OUTTAB      = GTBL_ACCOUNT_DOC
82    EXCEPTIONS
83      PROGRAM_ERROR = 1
84      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章 フィールドシンボル

f