こんにちは。
今回はALVのセルに色を付けるためのサンプルコードです。
「Excelの条件付き書式のように条件を満たした場合だけ色を変えたい」
「担当者が一覧を見て、要対応・注意の内容がある箇所に色付けしたい」
というような要件があった場合の対応事例になるかと思います。
下記のSAP COMMUNITYなどのサイトのサンプルコードを手直したものを掲載します。
どなたかの参考になれば幸いです。
参考リンク先
https://answers.sap.com/questions/5936331/cell-color-in-alv-grid-display.html
※ABAP OOでのALV作成の記事はこちらにまとめています。
[[ABAP]ABAP OOでALVを作成してみる(Let's try codeing ALV in ABAP OO) (1/N)]
(https://qiita.com/Go_Ohta/items/3355a0850c092d544025)
[[ABAP]ABAP OOでALVを作成してみる(Let's try codeing ALV in ABAP OO) (2/N)]
(https://qiita.com/Go_Ohta/items/ef0d25555b3ef8749495)
仕様###
- 色は規定済みの色しか使用できない**(16色)**→プログラム:SHOWCOLOで見られます
- 一覧データの内部テーブルに項目の色情報用の項目を持ち、色情報を格納する
- 色情報はテーブルデータ型で持つので、1行の複数項目に、それぞれの条件で色付けできる
プログラム:SHOWCOLOの実行結果は下記の通りです。
このうち「INTENSIFIED」「INTENSIFIED OFF」の16色しか使用できません。
処理の流れ###
- 一覧データの構造定義。この際に色情報を設定する項目(ここでは「CELLCOLOR」)を追加で設定
- データ抽出。上記色情報の項目があるため、「INTO CORRESPONDING FIELDS OF・・・」での抽出が必要
- FIELD CALALOG の内部テーブル作成
- 色情報を持っている一覧データ項目の項目名を設定
- 色を付ける条件に従ってデータを検索し、色情報(色を付ける項目、色、強調表示有無)を設定
- ALV表示用汎用Mやクラスメソッドなどで表示(ここでは汎用Mを使用しています)
サンプルコード###
*&---------------------------------------------------------------------*
*& Report YTEST_ALV_CELL_COLOR
*&---------------------------------------------------------------------*
REPORT ytest_ALV_CELL_COLOR.
TYPE-POOLS: slis.
INCLUDE <icon>.
*- Fieldcatalog
DATA: it_fieldcat TYPE lvc_t_fcat,
it_fieldcat1 TYPE slis_t_fieldcat_alv..
DATA: x_fieldcat TYPE lvc_s_fcat.
DATA: x_layout TYPE lvc_s_layo.
DATA: ls_cellcolor TYPE lvc_s_scol.
DATA: l_index TYPE sy-tabix.
DATA: l_pos TYPE i VALUE 1.
TYPES: BEGIN OF typ_it_vbap,
vbeln TYPE vbap-vbeln,
posnr TYPE vbap-posnr,
matnr TYPE vbap-matnr,
pstyv TYPE vbap-pstyv,
cellcolor TYPE lvc_t_scol, "セルの色情報用項目
END OF typ_it_vbap,
ttyp_it_vbap TYPE STANDARD TABLE OF typ_it_vbap.
DATA: it_vbap TYPE ttyp_it_vbap.
* 一覧データ抽出
SELECT vbeln
posnr
matnr
pstyv
FROM vbap
UP TO 20000 ROWS
INTO CORRESPONDING FIELDS OF TABLE it_vbap. "CELLCOLORがあるためCORRESPONDING
* FIELD CATALOG 作成
CLEAR: l_pos.
l_pos = l_pos + 1.
x_fieldcat-seltext = 'VBELN'.
x_fieldcat-fieldname = 'VBELN'.
*x_fieldcat-tabname = 'ITAB'. "?
x_fieldcat-col_pos = l_pos.
x_fieldcat-outputlen = '10'.
APPEND x_fieldcat TO it_fieldcat.
CLEAR x_fieldcat.
l_pos = l_pos + 1.
x_fieldcat-seltext = 'POSNR'.
x_fieldcat-fieldname = 'POSNR'.
*x_fieldcat-tabname = 'ITAB'.
x_fieldcat-col_pos = l_pos.
x_fieldcat-outputlen = '5'.
APPEND x_fieldcat TO it_fieldcat.
CLEAR x_fieldcat.
l_pos = l_pos + 1.
x_fieldcat-seltext = 'MATNR'.
x_fieldcat-fieldname = 'MATNR'.
*x_fieldcat-tabname = 'ITAB'.
x_fieldcat-col_pos = l_pos.
x_fieldcat-outputlen = '18'.
APPEND x_fieldcat TO it_fieldcat.
CLEAR x_fieldcat.
l_pos = l_pos + 1.
x_fieldcat-seltext = 'PSTYV'.
x_fieldcat-fieldname = 'PSTYV'.
*x_fieldcat-tabname = 'ITAB'.
x_fieldcat-col_pos = l_pos.
x_fieldcat-outputlen = '4'.
APPEND x_fieldcat TO it_fieldcat.
CLEAR x_fieldcat.
* 一覧データテーブルにある、色情報を格納している項目名を指定
x_layout-ctab_fname = 'CELLCOLOR'.
* 条件を満たす行のセルに色付け
LOOP AT it_vbap ASSIGNING FIELD-SYMBOL(<fs_vbap>) .
CLEAR ls_cellcolor.
IF <fs_vbap>-pstyv = 'XXXX'. "色を変える条件
ls_cellcolor-fname = 'PSTYV'. "色を変えたい項目
ls_cellcolor-color-col = '6'. "色
ls_cellcolor-color-int = '1'. "強調表示有無
APPEND ls_cellcolor TO <fs_vbap>-cellcolor.
ENDIF.
ENDLOOP.
* ALV DISPLAY
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = x_layout
it_fieldcat_lvc = it_fieldcat
TABLES
t_outtab = it_vbap[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.