ALV 帳票出力
23.3 ALV 帳票出力
3. ALV 帳票出力
ALV出力には大きく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 には 以下の項目が構築されていることになります。