[ABAP]ALV GRIDでセルに色を付ける(Indivisual Cell Color Settings For ALV GRID)

こんにちは。
今回は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色しか使用できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/d4e1701d-4c81-4fa1-c993-078e1138bf6b.png)


###処理の流れ###
* 一覧データの構造定義。この際に色情報を設定する項目(ここでは「CELLCOLOR」)を追加で設定
* データ抽出。上記色情報の項目があるため、「INTO CORRESPONDING FIELDS OF・・・」での抽出が必要
* FIELD CALALOG の内部テーブル作成
* **色情報を持っている一覧データ項目の項目名を設定**
* **色を付ける条件に従ってデータを検索し、色情報(色を付ける項目、色、強調表示有無)を設定**
* ALV表示用汎用Mやクラスメソッドなどで表示(ここでは汎用Mを使用しています)


###サンプルコード###

```ABAP:YTEST_ALV_CELL_COLOR
*&---------------------------------------------------------------------*
*& 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.