Step1:创建动态的 Fieldcat
和普通创建 fieldcat 的方法相同,不过通过循环去创建动态的列。
Step2:创建动态的内表
根据上一步骤创建的 fieldcat 创建动态的内表,使用 cl_alv_table_create=>create_dynamic_table。
Step3:指针为动态表赋值
ASSIGN gt_dyntab->* TO <dyntab>.:将字段符号指向新创建出来的内表对象CREATE DATA gs_dyntab LIKE LINE OF <dyntab>.:根据动态内表名动态创建数据ASSIGN gs_dyntab->* to <fs_wa>.:将字段符号指向新创建出来的结构对象
Step4:显示 ALV
REPORT zdyn_table_test.
TABLES: vbap.
TYPES:BEGIN OF typ_vbap,
vbeln TYPE vbap-vbeln,
posnr TYPE vbap-posnr,
END OF typ_vbap.
DATA: gt_vbap TYPE TABLE OF typ_vbap,
gs_vbap TYPE typ_vbap.
* Dynamic table
DATA: gt_dyntab TYPE REF TO data,
gs_dyntab TYPE REF TO data.
FIELD-SYMBOLS:
<dyntab> TYPE STANDARD TABLE,
<fs_wa> TYPE ANY,
<fs_val> TYPE ANY.
* ALV data
DATA: gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat.
DATA: g_fname TYPE char2.
DEFINE fcat.
gs_fcat-fieldname = &1.
gs_fcat-scrtext_l = &2.
append gs_fcat to gt_fcat.
clear gs_fcat.
END-OF-DEFINITION.
PARAMETERS p_col TYPE i.
START-OF-SELECTION.
SELECT vbeln posnr
INTO TABLE gt_vbap
FROM vbap
UP TO p_col ROWS.
* Fieldcat
fcat 'VBELN' 'SO'.
fcat 'POSNR' 'SOITEM'.
DO p_col TIMES.
g_fname = sy-index.
CONCATENATE 'F' g_fname INTO g_fname.
fcat g_fname g_fname.
ENDDO.
* Dynamic table create
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fcat
IMPORTING
ep_table = gt_dyntab
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'create dynamic table error' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
* Dynamic table data fill
ASSIGN gt_dyntab->* TO <dyntab>.
CREATE DATA gs_dyntab LIKE LINE OF <dyntab>.
ASSIGN gs_dyntab->* TO <fs_wa>.
LOOP AT gt_vbap INTO gs_vbap.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE <fs_wa> TO <fs_val>.
<fs_val> = gs_vbap-vbeln.
ASSIGN COMPONENT 'POSNR' OF STRUCTURE <fs_wa> TO <fs_val>.
<fs_val> = gs_vbap-posnr.
APPEND <fs_wa> TO <dyntab>.
ENDLOOP.
* Alv display
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
it_fieldcat_lvc = gt_fcat
TABLES
t_outtab = <dyntab>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'alv display error' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.