需求描述:在程序中动态地向内表添加字段,并用alv展示展示出来。
发布日期:20250218
主要逻辑分为3个部分:
1.根据现有结构生成字段列表。
2.向字段列表中动态添加字段。
3.根据添加后的字段列表生成内表。
最后向内表写数据就行啦。
详细代码如下,粘贴可用。
REPORT zmm_rpt_538_wu5.
DATA:gs_main TYPE ztmm_152_log.
DATA: r_tabdescr TYPE REF TO cl_abap_structdescr.
DATA: wa_field TYPE dfies,
t_dfies TYPE ddfields.
DATA: gs_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo.
DATA: dy_table TYPE REF TO data.
FIELD-SYMBOLS:<gt_out> TYPE STANDARD TABLE.
*根据结构gs_main生成字段列表并整理至gt_fieldcat
r_tabdescr ?= cl_abap_structdescr=>describe_by_data( gs_main ).
CALL METHOD cl_salv_data_descr=>read_structdescr
EXPORTING
r_structdescr = r_tabdescr
RECEIVING
t_dfies = t_dfies.
LOOP AT t_dfies INTO wa_field.
CLEAR gs_fieldcat.
MOVE-CORRESPONDING wa_field TO gs_fieldcat.
gs_fieldcat-coltext = gs_fieldcat-scrtext_m.
IF gs_fieldcat-inttype = 'P'.
gs_fieldcat-intlen = 23.
ENDIF.
APPEND gs_fieldcat TO gt_fieldcat.
ENDLOOP.
* 根据周期生成字段
DO 5 TIMES.
CLEAR: gs_fieldcat.
gs_fieldcat-fieldname = 'REQ_QTY' && sy-index.
gs_fieldcat-coltext = '需求' && sy-index.
gs_fieldcat-inttype = 'P'.
gs_fieldcat-intlen = 23.
gs_fieldcat-decimals = 3.
APPEND gs_fieldcat TO gt_fieldcat.
gs_fieldcat-fieldname = 'DATE' && sy-index.
gs_fieldcat-coltext = '日期' && sy-index.
gs_fieldcat-inttype = 'C'.
gs_fieldcat-intlen = 16.
APPEND gs_fieldcat TO gt_fieldcat.
ENDDO.
*根据字段清单创建内表
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fieldcat
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <gt_out>.
gs_layout-sel_mode = 'A'.
gs_layout-zebra = 'X'.
gs_layout-cwidth_opt = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = <gt_out>
EXCEPTIONS
program_error = 1
OTHERS = 2.
最后看一下输出效果。成功添加了字段。