什么是动态内表?动态内表就是字段的数量不是固定的,可以根据实际情况来改变内表的字段数量。
例如程序输入3行3列
ALV输出
如果输入10列3行
ALV输出
直接上代码
REPORT y4_b4_test MESSAGE-ID zmess .
FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE,
<fs_line> TYPE any.
DATA: lr_table TYPE REF TO data,
lr_line TYPE REF TO data.
*ALV字段列表。
DATA: gt_fieldcat TYPE lvc_t_fcat.
PARAMETERS: p_row TYPE i DEFAULT 3,
p_col TYPE i DEFAULT 3.
START-OF-SELECTION.
PERFORM frm_init_data.
END-OF-SELECTION.
PERFORM frm_display_alv.
FORM frm_init_data .
" 初始化列
DO p_col TIMES.
DATA(lv_comps) = |COL{ sy-index }|.
DATA(lv_text) = |列{ sy-index }|.
PERFORM frm_fill_fieldcat USING sy-index lv_comps lv_text.
ENDDO.
SORT gt_fieldcat BY col_pos.
" 根据列创建动态内表
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fieldcat
IMPORTING
ep_table = lr_table.
" 将表对象分配给指针
ASSIGN lr_table->* TO <fs_table>.
" 根据表对象创建行对象
CREATE DATA lr_line LIKE LINE OF <fs_table>.
" 将行对象分配给指针
ASSIGN lr_line->* TO <fs_line>.
"初始化行
DO p_row TIMES .
APPEND INITIAL LINE TO <fs_table> .
ENDDO .
DATA:lv_index TYPE i .
"把每一行的数据赋值
LOOP AT <fs_table> ASSIGNING FIELD-SYMBOL(<a>) .
lv_index = lv_index + 1 .
IF <a> IS ASSIGNED .
DO p_col TIMES .
DATA(lv_comp) = |COL{ sy-index }|.
"用指针指向这个字段
ASSIGN COMPONENT lv_comp OF STRUCTURE <a> TO FIELD-SYMBOL(<fs_comp>).
IF sy-subrc = 0.
<fs_comp> = |{ lv_comp }--{ lv_index }|.
ENDIF.
ENDDO .
ENDIF .
ENDLOOP .
ENDFORM.
FORM frm_fill_fieldcat USING p_col p_fieldname p_text.
APPEND INITIAL LINE TO gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_field>).
IF <fs_field> IS ASSIGNED.
<fs_field>-col_pos = p_col.
<fs_field>-fieldname = p_fieldname.
<fs_field>-scrtext_m = p_text.
ENDIF.
ENDFORM.
FORM frm_display_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
it_fieldcat_lvc = gt_fieldcat
i_default = 'X'
i_save = 'A'
TABLES
t_outtab = <fs_table>.
ENDFORM.