Небольшой пример без расширения ALV Grid, так сказать стандартными средствами. Не во всех случаях будет именно этот вариант работать, но может кому поможет с общей концепцией.
Code:
TYPES: slis.
DATA: itab TYPE TABLE OF spfli,
gs_layout TYPE lvc_s_layo,
gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat,
gt_sort TYPE lvc_t_sort,
wa_sort TYPE lvc_s_sort.
START-OF-SELECTION.
SELECT * FROM spfli INTO TABLE itab
WHERE distid = 'KM'.
END-OF-SELECTION.
" Включаем множественный выбор
gs_layout-box_fname = 'MANDT'.
" Создаем каталог полей для создания подитогов
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'SPFLI'
CHANGING
ct_fieldcat = gt_fcat.
" Суммируем расстояния по пунктам назначения
" Собственно Итог
LOOP AT gt_fcat INTO gs_fcat.
CASE gs_fcat-fieldname.
WHEN 'DISTANCE'.
gs_fcat-do_sum = 'X'.
MODIFY gt_fcat FROM gs_fcat.
ENDCASE.
ENDLOOP.
" и Подитог
REFRESH gt_sort.
CLEAR wa_sort.
wa_sort-fieldname = 'CITYFROM'.
wa_sort-down = 'X'.
wa_sort-subtot = 'X'.
APPEND wa_sort TO gt_sort.
" Вывод
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
i_callback_user_command = 'USER_COMMAND'
i_callback_pf_status_set = 'SET_PF_STATUS'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fcat
it_sort_lvc = gt_sort
TABLES
t_outtab = itab.
FORM set_pf_status USING extab TYPE slis_t_extab.
" Статус MAIN содержит только одну кнопку GET и команды выхода
SET PF-STATUS 'MAIN'.
ENDFORM.
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
WHEN 'GET'.
FIELD-SYMBOLS <subtotals> TYPE spfli_tab.
DATA: l_grid TYPE REF TO cl_gui_alv_grid,
dref0 TYPE REF TO data,
dref1 TYPE REF TO data,
t_subtotals_get TYPE spfli_tab,
t_rows TYPE lvc_t_row,
s_row TYPE lvc_s_row,
wa_spfli TYPE spfli.
" RS_SELFIELD-SUMINDEX может содержать индекс строки с
" подитогами при DOUBLE_CLICK по ней, но мы будем играться
" с ООП и множественным выбором подитогов через CTRL
" Получение инстанции ALV GRID
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_grid.
IF l_grid IS NOT INITIAL.
" Берем любые выделенные строки
CALL METHOD l_grid->get_selected_rows
IMPORTING
et_index_rows = t_rows.
" Получаем информацию по подитогам - они будут в DREF1
" В DREF0 - итоги. Если будет несколько уровней сортировки
" потребуются дополнительные параметры импорта этого метода
CALL METHOD l_grid->get_subtotals
IMPORTING
ep_collect00 = dref0 " Key 1
ep_collect01 = dref1. " Key 1 + Key 2
ASSIGN dref1->* TO <subtotals>.
" GET_SUBTOTALS не учитывает параметры сортировки,
" сортируем вручную
LOOP AT gt_sort INTO wa_sort.
CASE 'X'.
WHEN wa_sort-down.
SORT <subtotals> BY (wa_sort-fieldname) DESCENDING.
WHEN wa_sort-up.
SORT <subtotals> BY (wa_sort-fieldname) ASCENDING.
ENDCASE.
ENDLOOP.
" По выделенным строкам находим подитоги
LOOP AT t_rows INTO s_row WHERE rowtype IS NOT INITIAL.
READ TABLE <subtotals> INTO wa_spfli INDEX s_row-index.
IF sy-subrc IS INITIAL.
APPEND wa_spfli TO t_subtotals_get.
ENDIF.
ENDLOOP.
IF t_subtotals_get IS NOT INITIAL.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_structure_name = 'SPFLI'
i_grid_title = 'Выбранные подитоги'
TABLES
t_outtab = t_subtotals_get.
ENDIF.
ENDIF.
ENDCASE.
ENDFORM.