Вот пример того, как это сделать для 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( ).
Код довольно самокомментирующий, но я бы добавил несколько комментариев:
- В первую очередь вам нужен индекс для каждой строки, чтобы иметь возможность выбирать их
- Затем, при нахождении максимумов с помощью
REDUCE
, я попытался поместить все индексы MAX в один поле, которое должно быть достаточно длинным, чтобы содержать их (текущий фрагмент предназначен для индекса 2char, то есть для таблиц до 99 строк). Это грязно, но в любом случае это лучше, чем дополнительное l oop - Наконец, я заполняю цвета табличными выражениями , выбирая индекс для соответствующего поля
С помощью Немного усилий, этот кусок можно адаптировать к любому количеству полей или к динамическому c стилю без каких-либо имен полей.