1
votes

I need to put color into all the cells with values inside each column.

I want to show something like this.

ALV grid with colored cells

Here is my code:

    SORT gt_sehir_dilim_alv BY
          saat1 DESCENDING
          saat2 DESCENDING
          saat3 DESCENDING
          saat4 DESCENDING
          saat5 DESCENDING
          saat6 DESCENDING
          saat7 DESCENDING.

  LOOP AT gt_sehir_dilim_alv INTO gs_sehir_dilim_alv.
    lv_index = sy-tabix.

    IF lv_index EQ '1'.

      wa_cellcolor-fname = 'SAAT1'.
      wa_cellcolor-color-col =  1.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.


      wa_cellcolor-fname = 'SAAT2'.
      wa_cellcolor-color-col =  1.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.


      wa_cellcolor-fname = 'SAAT3'.
      wa_cellcolor-color-col =  1.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.

      wa_cellcolor-fname = 'SAAT4'.
      wa_cellcolor-color-col =  1.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.

      wa_cellcolor-fname = 'SAAT5'.
      wa_cellcolor-color-col =  1.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.

      wa_cellcolor-fname = 'SAAT6'.
      wa_cellcolor-color-col =  1.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.

      wa_cellcolor-fname = 'SAAT7'.
      wa_cellcolor-color-col =  1.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.
    ENDIF.
  ENDLOOP.

I have tried with this code too. But it's painting row based cells based on requirement:

  LOOP AT gt_sehir_dilim_alv INTO gs_sehir_dilim_alv.
    lv_index = sy-tabix.

    SORT gt_sehir_dilim_alv BY saat1 saat2 saat3 saat4 saat5
                               saat6 saat7  ASCENDING.
*
*    READ TABLE gt_sehir_dilim_alv INTO gs_sehir_dilim_alv INDEX 1.

    IF gs_sehir_dilim_alv-saat1 NE 0
   and gs_sehir_dilim_alv-saat2 NE 0
   AND gs_sehir_dilim_alv-saat3 NE 0
   AND gs_sehir_dilim_alv-saat4 NE 0
   AND gs_sehir_dilim_alv-saat5 NE 0
   AND gs_sehir_dilim_alv-saat6 NE 0
   AND gs_sehir_dilim_alv-saat7 NE 0.

    ELSEIF gs_sehir_dilim_alv-saat1 GT gs_sehir_dilim_alv-saat2
       AND gs_sehir_dilim_alv-saat1 GT gs_sehir_dilim_alv-saat3
       AND gs_sehir_dilim_alv-saat1 GT gs_sehir_dilim_alv-saat4
       AND gs_sehir_dilim_alv-saat1 GT gs_sehir_dilim_alv-saat5
       AND gs_sehir_dilim_alv-saat1 GT gs_sehir_dilim_alv-saat6
       AND gs_sehir_dilim_alv-saat1 GT gs_sehir_dilim_alv-saat7.

      "7.40 kodu - wa_fcat kullanmadan edit atabiliyoruz.
      APPEND VALUE #( fname     = 'SAAT1'
                      color-col =  6
                      color-int = '1'
                      color-inv = '0' ) TO
gs_sehir_dilim_alv-cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.

    ELSEIF gs_sehir_dilim_alv-saat2 GT gs_sehir_dilim_alv-saat1
       AND gs_sehir_dilim_alv-saat2 GT gs_sehir_dilim_alv-saat3
       AND gs_sehir_dilim_alv-saat2 GT gs_sehir_dilim_alv-saat4
       AND gs_sehir_dilim_alv-saat2 GT gs_sehir_dilim_alv-saat5
       AND gs_sehir_dilim_alv-saat2 GT gs_sehir_dilim_alv-saat6
       AND gs_sehir_dilim_alv-saat2 GT gs_sehir_dilim_alv-saat7.


      wa_cellcolor-fname = 'SAAT2'.
      wa_cellcolor-color-col =  6.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.


    ELSEIF gs_sehir_dilim_alv-saat3 GT gs_sehir_dilim_alv-saat1
       AND gs_sehir_dilim_alv-saat3 GT gs_sehir_dilim_alv-saat2
       AND gs_sehir_dilim_alv-saat3 GT gs_sehir_dilim_alv-saat4
       AND gs_sehir_dilim_alv-saat3 GT gs_sehir_dilim_alv-saat5
       AND gs_sehir_dilim_alv-saat3 GT gs_sehir_dilim_alv-saat6
       AND gs_sehir_dilim_alv-saat3 GT gs_sehir_dilim_alv-saat7.

      wa_cellcolor-fname = 'SAAT3'.
      wa_cellcolor-color-col =  6.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
            TRANSPORTING cellcolor.


    ELSEIF gs_sehir_dilim_alv-saat4 GT gs_sehir_dilim_alv-saat1
       AND gs_sehir_dilim_alv-saat4 GT gs_sehir_dilim_alv-saat2
       AND gs_sehir_dilim_alv-saat4 GT gs_sehir_dilim_alv-saat3
       AND gs_sehir_dilim_alv-saat4 GT gs_sehir_dilim_alv-saat5
       AND gs_sehir_dilim_alv-saat4 GT gs_sehir_dilim_alv-saat6
       AND gs_sehir_dilim_alv-saat4 GT gs_sehir_dilim_alv-saat7
      .
      wa_cellcolor-fname = 'SAAT4'.
      wa_cellcolor-color-col =  6.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
            TRANSPORTING cellcolor.


    ELSEIF gs_sehir_dilim_alv-saat5 GT gs_sehir_dilim_alv-saat1
       AND gs_sehir_dilim_alv-saat5 GT gs_sehir_dilim_alv-saat2
       AND gs_sehir_dilim_alv-saat5 GT gs_sehir_dilim_alv-saat3
       AND gs_sehir_dilim_alv-saat5 GT gs_sehir_dilim_alv-saat4
       AND gs_sehir_dilim_alv-saat5 GT gs_sehir_dilim_alv-saat6
       AND gs_sehir_dilim_alv-saat5 GT gs_sehir_dilim_alv-saat7.

      wa_cellcolor-fname = 'SAAT5'.
      wa_cellcolor-color-col =  6.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.

      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
            TRANSPORTING cellcolor.


    ELSEIF gs_sehir_dilim_alv-saat6 GT gs_sehir_dilim_alv-saat1
       AND gs_sehir_dilim_alv-saat6 GT gs_sehir_dilim_alv-saat2
       AND gs_sehir_dilim_alv-saat6 GT gs_sehir_dilim_alv-saat3
       AND gs_sehir_dilim_alv-saat6 GT gs_sehir_dilim_alv-saat4
       AND gs_sehir_dilim_alv-saat6 GT gs_sehir_dilim_alv-saat5
       AND gs_sehir_dilim_alv-saat6 GT gs_sehir_dilim_alv-saat7.

      wa_cellcolor-fname = 'SAAT6'.
      wa_cellcolor-color-col =  6.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
            TRANSPORTING cellcolor.

    ELSEIF gs_sehir_dilim_alv-saat7 GT gs_sehir_dilim_alv-saat1
       AND gs_sehir_dilim_alv-saat7 GT gs_sehir_dilim_alv-saat2
       AND gs_sehir_dilim_alv-saat7 GT gs_sehir_dilim_alv-saat3
       AND gs_sehir_dilim_alv-saat7 GT gs_sehir_dilim_alv-saat4
       AND gs_sehir_dilim_alv-saat7 GT gs_sehir_dilim_alv-saat5
       AND gs_sehir_dilim_alv-saat7 GT gs_sehir_dilim_alv-saat6.

      wa_cellcolor-fname = 'SAAT7'.
      wa_cellcolor-color-col =  6.
      wa_cellcolor-color-int = '1'.
      wa_cellcolor-color-inv = '0'.
      APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
      CLEAR: wa_cellcolor.
      MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
      TRANSPORTING cellcolor.

    ENDIF.
  ENDLOOP.
2
I don't understand because the colors in the screenshot don't match the two code snippets you provided.Sandra Rossi
@Sandra Rossi Second code searching different. This was my first attempt to fill colors. But to fill each column's highest value i used first code snippet. Second one searching row based not column.RaknRooL
I can't understand if your issue is just about the logic "how to determine the highest value" or about how to set colors. Please provide a minimal reproducible example. Thank you. If it's about how to set colors (don't forget layout-ctab_fname = 'CELLCOLOR'.), look at demo program BCALV_TEST_GRID (your code seems okay, setting colors is not difficult).Sandra Rossi
@SandraRossi I am a fresher in ABAP programming sometimes even for asking questions is difficult because you dont know what you need to know :D Thx for helpingRaknRooL
I understand, but even if you're "a fresher", you could at least try to answer the questions. I still don't understand how the ALV grid shows 4 colors in your screenshot (yellow, light gray, gray, blue) but you define explicitly only one color (col = 6, int = 1, inv = 0) + default color = 2 colors, not 4.Sandra Rossi

2 Answers

1
votes

Here is the sample how to do it for 3 fields of table ANLC without additional itabs and loops:

TYPES: BEGIN OF t_assets,
             idx   TYPE char6,
             bukrs TYPE anlc-bukrs,
             anln1 TYPE anlc-anln1,
             nafap TYPE anlc-nafap,
             nafag TYPE anlc-nafag,
             answl TYPE anlc-answl,
           t_color TYPE lvc_t_scol,
          END OF t_assets.

DATA: gt_assets TYPE TABLE OF t_assets.

SELECT DISTINCT bukrs, anln1, abs( nafap ) AS nafap, abs( nafag ) as nafag, answl
  INTO CORRESPONDING FIELDS OF TABLE @gt_assets
  FROM anlc
 WHERE nafap <> 0 OR nafag <> 0 OR answl <> 0.

LOOP AT gt_assets ASSIGNING FIELD-SYMBOL(<fs_asset>).
  <fs_asset>-idx = sy-tabix.
  CONDENSE <fs_asset>-idx.
ENDLOOP.

DATA(maximums) = REDUCE t_assets( INIT max = VALUE t_assets( )
                 FOR <m> IN gt_assets NEXT 
                                      max-nafap = COND #( WHEN <m>-nafap > max-nafap THEN <m>-nafap ELSE max-nafap )
                                      max-nafag = COND #( WHEN <m>-nafag > max-nafag THEN <m>-nafag ELSE max-nafag )
                                      max-answl = COND #( WHEN <m>-answl > max-answl THEN <m>-answl ELSE max-answl )
                                      max-idx = condense( val = gt_assets[ nafap = max-nafap ]-idx ) && condense( val = gt_assets[ nafag = max-nafag ]-idx ) && condense( val = gt_assets[ answl = max-answl ]-idx ) ).

gt_assets[ idx = maximums-idx(2) ]-t_color   = VALUE lvc_t_scol( BASE gt_assets[ idx = maximums-idx(2) ]-t_color ( fname  = 'NAFAP' color-col = col_negative ) ).
gt_assets[ idx = maximums-idx+2(2) ]-t_color = VALUE lvc_t_scol( BASE gt_assets[ idx = maximums-idx+2(2) ]-t_color ( fname  = 'NAFAG' color-col = col_negative ) ).
gt_assets[ idx = maximums-idx+4(2) ]-t_color = VALUE lvc_t_scol( BASE gt_assets[ idx = maximums-idx+4(2) ]-t_color ( fname  = 'ANSWL' color-col = col_negative ) ).

TRY.
    cl_salv_table=>factory( IMPORTING r_salv_table = DATA(alv) CHANGING t_table = gt_assets ).
  CATCH cx_salv_msg INTO DATA(message).
ENDTRY.

TRY.
    DATA(columns) = alv->get_columns( ).
    columns->set_color_column( 'T_COLOR' ).
  CATCH cx_salv_data_error.                         "#EC NO_HANDLER
ENDTRY.

alv->display( ).

The code is rather self-commenting but I'd put some comments:

  1. First and foremost you need index for each line to be able to pick them
  2. Then while finding maximums with REDUCE I made a trick of putting all the MAX indices into single field, which should be lengthy enough to hold them (current snippet is for 2char index i.e. for tables up to 99 rows). This is dirty but anyway it's better than additional loop
  3. Finally I fill colors by table expressions by picking index for the correspondent field

With a little bit of effort this piece can be adapted to any number of fields or to dynamic style without field names whatsoever.

0
votes

I created another extra itab i put all the values into it. After by SORT DESCENDING order i pick index 1 compare with table itab now im able to give cell colors to highest values.

APPEND LINES OF gt_sehir_dilim_alv TO  gt_sehir_dilim_alv1.

LOOP AT gt_sehir_dilim_alv INTO gs_sehir_dilim_alv.

lv_index = sy-tabix.

SORT gt_sehir_dilim_alv1 BY saat1  DESCENDING.
READ TABLE gt_sehir_dilim_alv1 INDEX 1 INTO
  gs_sehir_dilim_alv1.

IF gs_sehir_dilim_alv1-saat1 EQ gs_sehir_dilim_alv-saat1.
  wa_cellcolor-fname = 'SAAT1'.
  wa_cellcolor-color-col =  1.
  wa_cellcolor-color-int = '1'.
  wa_cellcolor-color-inv = '0'.
  APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
  CLEAR: wa_cellcolor.
  MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
  TRANSPORTING cellcolor.
ENDIF.

SORT gt_sehir_dilim_alv1 BY saat2  DESCENDING.
READ TABLE gt_sehir_dilim_alv1 INDEX 1 INTO
  gs_sehir_dilim_alv1.

IF gs_sehir_dilim_alv1-saat2 EQ gs_sehir_dilim_alv-saat2.
  wa_cellcolor-fname = 'SAAT2'.
  wa_cellcolor-color-col =  1.
  wa_cellcolor-color-int = '1'.
  wa_cellcolor-color-inv = '0'.
  APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
  CLEAR: wa_cellcolor.
  MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
  TRANSPORTING cellcolor.
ENDIF.

SORT gt_sehir_dilim_alv1 BY saat3  DESCENDING.
READ TABLE gt_sehir_dilim_alv1 INDEX 1 INTO
  gs_sehir_dilim_alv1.

IF gs_sehir_dilim_alv1-saat3 EQ gs_sehir_dilim_alv-saat3.
  wa_cellcolor-fname = 'SAAT3'.
  wa_cellcolor-color-col =  1.
  wa_cellcolor-color-int = '1'.
  wa_cellcolor-color-inv = '0'.
  APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
  CLEAR: wa_cellcolor.
  MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
  TRANSPORTING cellcolor.
ENDIF.


SORT gt_sehir_dilim_alv1 BY saat4  DESCENDING.
READ TABLE gt_sehir_dilim_alv1 INDEX 1 INTO
  gs_sehir_dilim_alv1.

IF gs_sehir_dilim_alv1-saat4 EQ gs_sehir_dilim_alv-saat4.
  wa_cellcolor-fname = 'SAAT4'.
  wa_cellcolor-color-col =  1.
  wa_cellcolor-color-int = '1'.
  wa_cellcolor-color-inv = '0'.
  APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
  CLEAR: wa_cellcolor.
  MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
  TRANSPORTING cellcolor.
ENDIF.


SORT gt_sehir_dilim_alv1 BY saat5  DESCENDING.
READ TABLE gt_sehir_dilim_alv1 INDEX 1 INTO
  gs_sehir_dilim_alv1.

IF gs_sehir_dilim_alv1-saat5 EQ gs_sehir_dilim_alv-saat5.
  wa_cellcolor-fname = 'SAAT5'.
  wa_cellcolor-color-col =  1.
  wa_cellcolor-color-int = '1'.
  wa_cellcolor-color-inv = '0'.
  APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
  CLEAR: wa_cellcolor.
  MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
  TRANSPORTING cellcolor.
ENDIF.


SORT gt_sehir_dilim_alv1 BY saat6  DESCENDING.
READ TABLE gt_sehir_dilim_alv1 INDEX 1 INTO
  gs_sehir_dilim_alv1.

IF gs_sehir_dilim_alv1-saat6 EQ gs_sehir_dilim_alv-saat6.
  wa_cellcolor-fname = 'SAAT6'.
  wa_cellcolor-color-col =  1.
  wa_cellcolor-color-int = '1'.
  wa_cellcolor-color-inv = '0'.
  APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
  CLEAR: wa_cellcolor.
  MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
  TRANSPORTING cellcolor.
ENDIF.

SORT gt_sehir_dilim_alv1 BY saat7  DESCENDING.
READ TABLE gt_sehir_dilim_alv1 INDEX 1 INTO
  gs_sehir_dilim_alv1.

IF gs_sehir_dilim_alv1-saat7 EQ gs_sehir_dilim_alv-saat7.
  wa_cellcolor-fname = 'SAAT7'.
  wa_cellcolor-color-col =  1.
  wa_cellcolor-color-int = '1'.
  wa_cellcolor-color-inv = '0'.
  APPEND wa_cellcolor TO gs_sehir_dilim_alv-cellcolor.
  CLEAR: wa_cellcolor.
  MODIFY gt_sehir_dilim_alv FROM gs_sehir_dilim_alv
  TRANSPORTING cellcolor.
ENDIF.

OUTPUT: enter image description here