xtt->MERGE( IV_BLOCK_NAME = ‘R’ IS_BLOCK =
{"TITLE"=>"Title", "T"=>[{"GROUP"=>"GRP A", "CAPTION"=>"<Caption 1 />", "DATE"=>"2020-10-21", "SUM1"=>5971.44, "SUM2"=>5021.46}, {"GROUP"=>"GRP C", "CAPTION"=>"<Caption 2 />", "DATE"=>"2020-10-19", "SUM1"=>2276.75, "SUM2"=>7717.2}, {"GROUP"=>"GRP B", "CAPTION"=>"<Caption 3 />", "DATE"=>"2020-10-20", "SUM1"=>3031.38, "SUM2"=>445.22}, {"GROUP"=>"GRP A", "CAPTION"=>"<Caption 4 />", "DATE"=>"2020-10-21", "SUM1"=>9476.79, "SUM2"=>3683.27}, {"GROUP"=>"GRP A", "CAPTION"=>"<Caption 5 />", "DATE"=>"2020-10-21", "SUM1"=>4604.0, "SUM2"=>5525.85}, {"GROUP"=>"GRP C", "CAPTION"=>"<Caption 6 />", "DATE"=>"2020-10-19", "SUM1"=>2159.71, "SUM2"=>2260.94}, {"GROUP"=>"GRP B", "CAPTION"=>"<Caption 7 />", "DATE"=>"2020-10-20", "SUM1"=>2490.3, "SUM2"=>6388.81}, {"GROUP"=>"GRP A", "CAPTION"=>"<Caption 8 />", "DATE"=>"2020-10-21", "SUM1"=>5476.81, "SUM2"=>406.18}, {"GROUP"=>"GRP D", "CAPTION"=>"<Caption 9 />", "DATE"=>"2020-10-18", "SUM1"=>689.66, "SUM2"=>518.6}, {"GROUP"=>"GRP C", "CAPTION"=>"<Caption 10 />", "DATE"=>"2020-10-19", "SUM1"=>5451.87, "SUM2"=>4061.85}, {"GROUP"=>"GRP D", "CAPTION"=>"<Caption 11 />", "DATE"=>"2020-10-18", "SUM1"=>4573.55, "SUM2"=>5436.0}, {"GROUP"=>"GRP C", "CAPTION"=>"<Caption 12 />", "DATE"=>"2020-10-19", "SUM1"=>1196.35, "SUM2"=>522.46}, {"GROUP"=>"GRP C", "CAPTION"=>"<Caption 13 />", "DATE"=>"2020-10-19", "SUM1"=>7686.95, "SUM2"=>2727.98}, {"GROUP"=>"GRP D", "CAPTION"=>"<Caption 14 />", "DATE"=>"2020-10-18", "SUM1"=>978.18, "SUM2"=>295.55}, {"GROUP"=>"GRP D", "CAPTION"=>"<Caption 15 />", "DATE"=>"2020-10-18", "SUM1"=>71.12, "SUM2"=>8878.56}]}
).
Если у вас есть обычная таблица с простыми итогами, вы можете использовать внутренние таблицы abap.
Но если вам также нужно отображать промежуточные итоги и другие иерархические структуры, лучше использовать деревья
.
Существует два метода создания деревьев. Сейчас речь пойдет о первом из них TREE_CREATE
.
О TREE_CREATE_RELAT
вы можете прочитать на следующей странице.
Метод TREE_CREATE
" Document structure
BEGIN OF ts_root,
title TYPE string,
t TYPE REF TO data, " better to use general type than zcl_xtt_replace_block=>ts_tree
END OF ts_root.
ls_root-t = zcl_xtt_replace_block=>tree_create(
it_table = lr_table " from 7.5 REF #(lt_rows)
iv_fields = 'GROUP' ). " Name of the fields delimited by ;
Самый простой способ описать данный метод - представить ALV grid с промежуточными итогами.
iv_fields = 'BUKRS' " Подитоги по 1 полю
iv_fields = 'BUKRS;WERKS' " Подитоги по 2 полям
для вычисления сумм (или средних значений) вы должны определить обработчик для обработки дерева и нижестоящих элементов
on_prepare_tree_05 FOR EVENT prepare_tree OF zcl_xtt_replace_block
IMPORTING
ir_tree " Type Ref To ZCL_XTT_REPLACE_BLOCK=>TS_TREE
ir_data " Type Ref To DATA
ir_sub_data, " Type Ref To DATA
в первую очередь в обработчике вы должны преобразовать данные в исходные типы данных
FIELD-SYMBOLS:
<ls_data> TYPE ts_tree_05,
<ls_sub_data> TYPE ts_tree_05.
" Cast to specefic data
ASSIGN:
ir_data->* TO <ls_data>,
ir_sub_data->* TO <lt_sub_data>.
и в цикле вы можете рассчитать все, что вам нужно
" And calc sums
LOOP AT <lt_sub_data> ASSIGNING <ls_sub_data>.
<ls_data>-sum1 = <ls_data>-sum1 + <ls_sub_data>-sum1.
<ls_data>-sum2 = <ls_data>-sum2 + <ls_sub_data>-sum2.
ENDLOOP.
В шаблоне, если у вас есть разные форматирование строк для каждого уровня, вы можете указать для них дополнительные параметры ;level=
и ;top=
. Если нижестоящие элементы идут после родительского элемента, просто добавьте ;top=X
для данного уровня, иначе ;top=
или просто ничего не указывайте.
Также, если вы укажете уровень группировке в шаблоне, он будет реплицирован в окончательном отчете для соответствующих элементов.
Результат выглядит как в ALV GRID