Добрый день.
Хочу предложить вниманию пользователей ФМ по группировке таблиц.
Если интересно, могу поделиться...
Вообще цель - тестирование данного ФМ.
Данный ФМ исправлен для использования Include структур.
Code:
FUNCTION Z_GROUP_TABLE.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(FIELDS_GROUP) TYPE STRING
*" REFERENCE(FIELDS_SUM) TYPE STRING
*" TABLES
*" IT
*"----------------------------------------------------------------------
*" Функциональный модуль осуществляет группировку таблицы по указанным полям
*" FIELDS_GROUP, и суммирование указанных полей FIELDS_SUM.
*" Результат помещается в ту же таблицу, где содержались первоначальные данные.
*" Пример в программе: ZGROUP_TABLE.
field-symbols:
<fld> type any,
<wa> type any,
<wa_if_data> type any,
<it_if_data> type standard table,
<it_if_data_new> type standard table.
types:
abap_keyname type c length 255.
types:
begin of abap_keydescr,
name type abap_keyname,
end of abap_keydescr.
data:
F_GROUP type string,
F_SUM type string,
p_key type STANDARD TABLE OF abap_keydescr
WITH KEY name,
w_key type abap_keydescr,
itab_g type table of string with header line,
itab_s type table of string with header line,
dref type ref to data,
itab_type type ref to cl_abap_tabledescr,
comp_fld type cl_abap_structdescr=>component,
comp_fld_inc type cl_abap_structdescr=>component,
comp_tab type cl_abap_structdescr=>component_table,
comp_tab_new type cl_abap_structdescr=>component_table,
comp_tab_inc type cl_abap_structdescr=>component_table,
struct_type type ref to cl_abap_structdescr,
struct_type_inc type ref to cl_abap_structdescr.
F_GROUP = FIELDS_GROUP.
F_SUM = FIELDS_SUM.
if F_GROUP <> '' and F_SUM <> ''.
translate F_GROUP to upper case.
translate F_SUM to upper case.
split F_GROUP at ',' into table itab_g.
split F_SUM at ',' into table itab_s.
struct_type ?= cl_abap_typedescr=>describe_by_data( it ).
comp_tab = struct_type->get_components( ).
loop at comp_tab into comp_fld.
if comp_fld-as_include = 'X'.
struct_type_inc ?= comp_fld-type.
comp_tab_inc = struct_type_inc->get_components( ).
loop at comp_tab_inc into comp_fld_inc.
append comp_fld_inc to comp_tab.
endloop.
endif.
endloop.
delete comp_tab where as_include = 'X'.
refresh: comp_tab_new, p_key.
loop at itab_g.
loop at comp_tab into comp_fld.
if comp_fld-name = itab_g.
append comp_fld to comp_tab_new.
w_key-name = comp_fld-name.
append w_key to p_key.
endif.
endloop.
endloop.
loop at itab_s.
loop at comp_tab into comp_fld.
if comp_fld-name = itab_s.
append comp_fld to comp_tab_new.
endif.
endloop.
endloop.
struct_type = cl_abap_structdescr=>create( comp_tab_new ).
itab_type = cl_abap_tabledescr=>create( p_line_type = struct_type
p_table_kind = cl_abap_tabledescr=>tablekind_std
p_key = p_key ).
create data dref type handle itab_type.
assign dref->* to <it_if_data>.
assign dref->* to <it_if_data_new>.
create data dref like line of <it_if_data>. assign dref->* to <wa_if_data>.
create data dref like line of it. assign dref->* to <wa>.
create data dref like <it_if_data>. assign dref->* to <it_if_data_new>.
loop at it into <wa>.
move-corresponding <wa> to <wa_if_data>.
append <wa_if_data> to <it_if_data>.
endloop.
sort <it_if_data>.
loop at <it_if_data> into <wa_if_data>.
collect <wa_if_data> into <it_if_data_new>.
endloop.
refresh it.
clear it.
loop at <it_if_data_new> into <wa_if_data>.
clear <wa>.
move-corresponding <wa_if_data> to <wa>.
append <wa> to it.
endloop.
endif.
ENDFUNCTION.