Довольно типичное задание, но я застрял на том, чтобы делать это красиво.
Например, мне нужно найти последнюю партию для каждого поставщика, то есть найти доставку с максимальной датой для каждого поставщика
VENDOR DELIVERY DATE
10 00055 01/01/2019
20 00070 01/19/2019
20 00088 01/20/2019
20 00120 11/22/2019
40 00150 04/01/2019
40 00200 04/10/2019
Таблица результатов для заполнения
VENDOR DELIVERY DATE
10 00055 01/01/2019
20 00120 11/22/2019
40 00200 04/10/2019
Я реализовал это следующим образом, через DESCENDING, что я считаю очень уродливым
LOOP AT itab ASSIGNING <wa> GROUP BY ( ven_no = <wa>-ven_no ) REFERENCE INTO DATA(vendor).
LOOP AT GROUP vendor ASSIGNING <ven> GROUP BY ( date = <vendor>-date ) DESCENDING.
CHECK NOT line_exists( it_vend_max[ ven_no = <ven>-ven_no ] ).
it_vend_max = VALUE #( BASE it_vend_max ( <ven> ) ).
ENDLOOP.
ENDLOOP.
Есть ли более элегантный способ сделать это?
Я тоже пробовал REDUCE
result = REDUCE #( vend_line = value ty_s_vend()
MEMBERS = VALUE ty_t_vend( )
FOR GROUPS <group_key> OF <wa> IN itab
GROUP BY ( key = <wa>-ven_no count = GROUP SIZE
ASCENDING
NEXT vend_line = VALUE #(
ven_no = <wa>-ven_no
date = REDUCE i( INIT max = 0
FOR m IN GROUP <group_key>
NEXT max = nmax( val1 = m-date
val2 = <wa>-date ) )
deliv_no = <wa>-deliv_no
MEMBERS = VALUE ty_s_vend( FOR m IN GROUP <group_key> ( m ) ) ).
но REDUCE
выбирает максимальную дату из всей таблицы и выбирает только плоскую структуру , что не то, что я хочу. Однако в примерах ABAP я видел примеры, где также возможны сокращения от таблицы к таблице. Я не прав?
Еще одна вещь, которую я пробовал, - это поиск уникальных символов с WITHOUT MEMBERS
, но этот синтаксис не работает:
it_vend_max = VALUE ty_t_vend( FOR GROUPS value OF <line> IN itab
GROUP BY ( <line>-ven_no <line>-ship_no )
WITHOUT MEMBERS ( lifnr = value
date = nmax( val1 = <line>-date
val2 = value-date ) ) ).
Будем благодарны за любые предположения о том, что здесь не так или за собственное элегантное решение.