Вопрос общий (больше не после правок ...), потому что я понимаю, что это обычная проблема и для других таблиц, но я опишу свою конкретную проблему с выбором партнеров для выходных сообщений.
Для данного счета я хочу связать партнера с каждым типом сообщения в NAST
таблице. Для одного и того же типа сообщения может быть несколько записей, поэтому мне нужна самая новая на основе полей ERDAT
и ERUHR
(дата и время).
Я пытался сделать это с помощью подзапросов, но это получилось очень некрасиво, особенно поле времени требует двойного подзапроса, потому что вам сначала нужно получить последнюю дату ...
Затем я реализовал это решение, но оно мне не нравится, и я надеялся на что-то получше.
DATA: lt_msg_type_rg TYPE RANGE OF kschl.
lt_msg_type_rg = VALUE #( FOR ls_msg_type IN me->mt_message_type
( sign = 'I' option = 'EQ' low = ls_msg_type-kschl ) ).
SELECT FROM nast AS invoice_msg_status
FIELDS invoice_msg_status~kschl AS message_type,
invoice_msg_status~parnr AS partner_num,
CONCAT( invoice_msg_status~erdat, invoice_msg_status~eruhr ) AS create_timestamp
WHERE invoice_msg_status~kappl = @c_app_invoicing
AND invoice_msg_status~objky = @me->m_invoice_num
AND invoice_msg_status~kschl IN @lt_msg_type_rg
ORDER BY create_timestamp DESCENDING
INTO TABLE @DATA(lt_msg_partner).
DATA: lt_partner_rg TYPE RANGE OF parnr.
LOOP AT lt_msg_partner ASSIGNING FIELD-SYMBOL(<lgr_msg_partner>) GROUP BY <lgr_msg_partner>-message_type.
lt_partner_rg = COND #( WHEN line_exists( lt_partner_rg[ low = <lgr_msg_partner>-partner_num ] )
THEN lt_partner_rg
ELSE VALUE #( BASE lt_partner_rg ( sign = 'I' option = 'EQ' low = <lgr_msg_partner>-partner_num ) ) ).
ENDLOOP.
Пример ввода (пропущены нерелевантные поля)
+-------+-------+-------+-------+------------+-------+
| KAPPL | OBJKY | KSCHL | PARNR | ERDAT | ERUHR |
+-------+-------+-------+-------+------------+-------+
| V3 | 12345 | Z001 | 11 | 27.10.2020 | 11:00 |
| V3 | 12345 | Z001 | 12 | 27.10.2020 | 12:00 |
| V3 | 12345 | Z002 | 13 | 27.10.2020 | 11:00 |
+-------+-------+-------+-------+------------+-------+
Ожидаемый результат:
[12]
[13]