Залейте цветом максимумы всех столбцов в таблице ALV - PullRequest
1 голос
/ 06 мая 2020

Мне нужно поместить цвет во все ячейки со значениями внутри каждого столбца.

Я хочу показать что-то вроде этого.

ALV grid with colored cells

Вот мой код:

    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.

Я тоже пробовал с этим кодом . Но он рисует ячейки на основе строк в соответствии с требованиями:

  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 ]

1 голос
/ 10 мая 2020

Вот пример того, как это сделать для 3 полей таблицы ANL C без дополнительных itabs и циклов:

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( ).

Код довольно самокомментирующий, но я бы добавил несколько комментариев:

  1. В первую очередь вам нужен индекс для каждой строки, чтобы иметь возможность выбирать их
  2. Затем, при нахождении максимумов с помощью REDUCE, я попытался поместить все индексы MAX в один поле, которое должно быть достаточно длинным, чтобы содержать их (текущий фрагмент предназначен для индекса 2char, то есть для таблиц до 99 строк). Это грязно, но в любом случае это лучше, чем дополнительное l oop
  3. Наконец, я заполняю цвета табличными выражениями , выбирая индекс для соответствующего поля

С помощью Немного усилий, этот кусок можно адаптировать к любому количеству полей или к динамическому c стилю без каких-либо имен полей.

0 голосов
/ 07 мая 2020

Я создал еще один дополнительный itab и поместил в него все значения. После сортировки по убыванию я выбираю индекс 1 для сравнения с таблицей itab, и теперь я не могу присвоить цвету ячеек самые высокие значения.

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.

ВЫХОД: enter image description here

...