简体   繁体   中英

Fill with color all columns maximums in ALV table

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

I want to show something like this.

带有彩色单元格的 ALV 网格

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.

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 ie 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.

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: 在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM