Mesh - это специальный тип который представляет собой связанные внутренние таблицы(узлы). Структура в целом похожа на структуру БД.
Mesh появился в ABAP 7.40 бла-бла-бла... Основная проблема в том ,что он не прижился, возможно из-за слабой осведомленности разработчиков, возможно из-за не перспективности подхода. Однако, в некоторых случаях данная концепция ложится довольно хорошо.
Синтаксис:
ASSOCIATION - имя узла. В дальнейшем его будет необходимо указывать для навигации по структуре.
TO - указывает на узел, к которому относится ассоциация
ON - ключ связывающий узлы
Кроме этого, типы таблиц для узлов MESH должны иметь ключевые поля.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
" TYPES ty_mara TYPE SORTED TABLE OF mara WITH UNIQUE KEY matnr. TYPES ty_makt TYPE SORTED TABLE OF makt WITH UNIQUE KEY matnr. TYPES ty_t002 TYPE SORTED TABLE OF t002 WITH UNIQUE KEY spras. TYPES: BEGIN OF MESH ty_matnr_mesh, mara TYPE ty_mara ASSOCIATION mara_to_makt TO makt ON matnr = matnr, makt TYPE ty_makt ASSOCIATION makt_to_t002 TO t002 ON spras = spras, t002 TYPE ty_t002, END OF MESH ty_matnr_mesh. DATA ms_matnr TYPE ty_matnr_mesh. |
Заполним получившуюся структуру:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ms_matnr-mara = VALUE #( ( matnr = '00000001' mtart = 'Z001' ) ( matnr = '00000002' mtart = 'Z002' ) ( matnr = '00000003' mtart = 'Z003' ) ( matnr = '00000004' mtart = 'Z001' ) ). ms_matnr-makt = VALUE #( ( matnr = '00000001' maktx = 'Материал 1' spras = 'E' ) ( matnr = '00000002' maktx = 'Материал 2' spras = 'R' ) ( matnr = '00000003' maktx = 'Материал 3' spras = 'G' ) ( matnr = '00000004' maktx = 'Материал 4' spras = 'R' ) ). SELECT * FROM t002 INTO TABLE ms_matnr-t002. |
Теперь попробуем выбрать данные. Примеры не имеют особого смысла и служат просто для показа функционала.
Мы по виду материала из таблицы mara хотим получить название самого материала. Без Mesh код выглядит так.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
" DATA lt_mara TYPE ty_mara. DATA lt_makt TYPE ty_makt. DATA lt_t002 TYPE ty_t002. lt_mara = ms_matnr-mara. lt_makt = ms_matnr-makt. lt_t002 = ms_matnr-t002. READ TABLE lt_mara ASSIGNING FIELD-SYMBOL(<ls_data>) WITH KEY mtart = 'Z002'. IF sy-subrc = 0. READ TABLE lt_makt ASSIGNING FIELD-SYMBOL(<ls_makt>) WITH TABLE KEY matnr = <ls_data>-matnr. ENDIF. |
Тот же результат с MESH
1 2 |
" DATA(ls_result_1) = ms_matnr-mara\mara_to_makt[ ms_matnr-mara[ mtart = 'Z002' ] ]. |
На выходе получим строку из ms_matnr-makt
Это называется прямой связью. Также мы можем получить данные узла ms_matnr-mara по каким либо критериям из узла ms_matnr-makt. Хотя прямая связь в эту сторону у нас не описана. Это называется обратной связью. Для этого после "\" необходимо добавить "^" и указать целевой узел через "~".
1 |
DATA(ls_result_2) = ms_matnr-makt\^mara_to_makt~mara[ ms_matnr-makt[ maktx = 'Материал 2' ] ] . |
В результате получим строку matnr = '00000002' maktx = 'Материал 2' spras = 'R'.
Также можно использовать более сложные соединения для этого надо указывать последующие узлы через '\'.
... mesh-node1\to_node2[ mesh-node1[ ... ] ]\to_node3[ ] ...
1 2 3 4 5 6 7 |
" DATA(ls_result_3) = ms_matnr-mara\mara_to_makt[ ms_matnr-mara[ matnr = '00000001' ] ]\makt_to_t002[ ]. "И в обратную сторону "Получим материал, у которого есть описание на греческом " Данные Примеры бессмысленны в реальной жизни, но показывают работу mesh DATA(ls_result_4) = ms_matnr-t002\^makt_to_t002~makt[ ms_matnr-t002[ laiso = 'EL' ] ]\^mara_to_makt~mara[ ]. |
При помощи FOR можно выбрать несколько строк:
1 2 3 4 5 6 7 |
" DATA(lt_result_5) = VALUE ty_makt( FOR <mara> IN ms_matnr-mara WHERE ( mtart = 'Z001' ) FOR <makt> IN ms_matnr-mara\mara_to_makt[ <mara> ] ( <makt> ) ). |
Результат
Дополнительная информация
Вот тут немного о производительности( однако возникают вопросы к оптимальности выборок из таблиц).
ABAP 740 – Meshes – A new complex type of Structures