Другой возможный способ - заполнить таблицу, используя представления таблиц и выражения таблиц
TYPES: BEGIN OF ty_mara,
matnr TYPE matnr,
matkl TYPE matkl,
maktx TYPE maktx,
END OF ty_mara,
BEGIN OF ty_text,
matnr TYPE matnr,
maktx TYPE maktx,
END OF ty_text.
DATA: gt_text TYPE STANDARD TABLE OF ty_text.
DATA: gt_mara TYPE STANDARD TABLE OF ty_mara.
TYPES: tty_empty TYPE STANDARD TABLE OF ty_mara WITH EMPTY KEY.
SELECT matnr, matkl UP TO 10 ROWS
FROM mara
INTO TABLE @gt_mara.
SELECT matnr, maktx
INTO TABLE @gt_text
FROM makt
FOR ALL ENTRIES IN @gt_mara
WHERE matnr = @gt_mara-matnr.
DATA(gt_result) = VALUE tty_empty( FOR wa IN gt_mara ( matnr = wa-matnr matkl = wa-matkl maktx = VALUE maktx( gt_text[ matnr = wa-matnr ]-maktx OPTIONAL ) ) ).
Однако у этого способа есть несколько недостатков по сравнению со способом Дэна, потому что для этого требуется объявление таблицы stati c, и он создает новый itab вместо изменения существующего. Поэтому я рекомендую придерживаться пути Дэна.
Конечно, построения новой таблицы можно избежать с помощью старого доброго l oop и табличного выражения:
LOOP AT gt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>).
maktx = VALUE maktx( gt_text[ matnr = <fs_mara>-matnr ]-maktx OPTIONAL ).
ENDLOOP.