Nada mais é que uma tabela interna onde além de campos convencionais, tem outra tabela interna.
REPORT ZSAPeiros.
* A idéia é selecionar a VBAP, e retornar em UMA ÚNICA LINHA da tabela interna T_DADOS,
* o documento VBELN e TODOS os materiais com descrição do documento selecionado
* Definição da tabela com material e descrição
TYPES:
BEGIN OF ty_matnrs,
matnr TYPE mara-matnr, "Material
maktx TYPE makt-maktx, "Descrição
END OF ty_matnrs.
* Definição da tabela com documento e tabela de materiais
DATA: BEGIN OF t_dados OCCURS 0.
DATA: vbeln TYPE vbap-vbeln. "Documento
DATA: matnrs TYPE TABLE OF ty_matnrs. "Tabela de materiais
DATA: END OF t_dados.
* Declaração de tabelas internas diversas
DATA:
t_matnrs TYPE TABLE OF ty_matnrs, "Tabela de materiais
w_matnrs TYPE ty_matnrs, "Tabela de materiais
t_makt TYPE TABLE OF makt, "Material/Descrição
w_makt TYPE makt, "Material/Descrição
t_vbap TYPE TABLE OF vbap, "Tabela VBAP
w_vbap TYPE vbap. "Estrutura VBAP
* Parâmetros
PARAMETERS p_vbeln TYPE vbap-vbeln.
* Seleção dos dados
START-OF-SELECTION.
SELECT *
FROM vbap
INTO TABLE t_vbap
WHERE vbeln EQ p_vbeln.
IF sy-subrc IS INITIAL.
SELECT *
FROM makt
INTO TABLE t_makt
FOR ALL ENTRIES IN t_vbap
WHERE matnr EQ t_vbap-matnr
AND spras EQ sy-langu.
IF sy-subrc IS INITIAL.
SORT t_makt BY matnr.
ENDIF.
LOOP AT t_vbap INTO w_vbap.
* Monta tabela com campos matnr e maktx
READ TABLE t_makt
INTO w_makt
WITH KEY matnr = w_vbap-matnr
BINARY SEARCH.
IF sy-subrc IS INITIAL.
w_matnrs-matnr = w_vbap-matnr.
w_matnrs-maktx = w_makt-maktx.
APPEND w_matnrs TO t_matnrs.
ENDIF.
ENDLOOP.
* Popula tabela T_DADOS com documento VBELN e TABELA de materiais
t_dados-vbeln = p_vbeln.
t_dados-matnrs[] = t_matnrs[].
APPEND t_dados.
ENDIF.
BREAK-POINT.