(原创)创建纵深结构的动态内表
在上一篇博客中已经给出创建非纵深结构动态内表的DEMO,在这篇博客中结合上篇博客中的DEMO,给出创建纵深结构动态内表的DEMO。
选择界面:
输出目标(DEBUG界面):
源代码:
*&---------------------------------------------------------------------* *& Report Z15540_DYN02 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT z15540_dyn02. DATA:gs_fcat TYPE lvc_s_fcat, gt_fcat TYPE lvc_t_fcat. DATA:dyn_table TYPE REF TO data, dyn_line TYPE REF TO data, dyn_line1 TYPE REF TO data, dyn_handle TYPE REF TO data. DATA:lcl_struct TYPE REF TO cl_abap_structdescr, lcl_tab TYPE REF TO cl_abap_tabledescr. DATA:gs_components TYPE abap_componentdescr, gt_components TYPE abap_component_tab. "存储动态列的数据对象,在后续cl_abap_structdescr的CREATE方法中用到 DATA gt_col TYPE TABLE OF string. FIELD-SYMBOLS:<fs_table> TYPE STANDARD TABLE, "非纵深动态内表字段符号 <fs_table_zs> TYPE STANDARD TABLE. "纵深动态内表字段符号 PARAMETERS p_col TYPE string OBLIGATORY."填入动态创建的列名,以逗号分隔 START-OF-SELECTION. "动态创建非纵深结构内表 PERFORM frm_fcat. PERFORM frm_create_dyn."创建非纵深结构动态内表&&填充数据 "动态创建纵深结构内表 PERFORM frm_components."填充列 PERFORM frm_create_dyn_zs."创建纵深结构动态内表&&填充数据&&显示 *&---------------------------------------------------------------------* *& Form FRM_FCAT *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_fcat . SPLIT p_col AT ',' INTO TABLE gt_col. LOOP AT gt_col ASSIGNING FIELD-SYMBOL(<fs_col>). gs_fcat-fieldname = <fs_col>. gs_fcat-coltext = <fs_col> && '描述' . gs_fcat-ref_table = 'MAKT'. gs_fcat-ref_field = 'MAKTX'. APPEND gs_fcat TO gt_fcat. CLEAR gs_fcat. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CREATE_DYN *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_create_dyn . DATA: lv_col TYPE i, lv_index(2). "创建动态内表 CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING * i_style_table = it_fieldcatalog = gt_fcat * i_length_in_byte = IMPORTING ep_table = dyn_table * e_style_fname = * EXCEPTIONS * generate_subpool_dir_full = 1 * others = 2 . ASSIGN dyn_table->* TO <fs_table>. CREATE DATA dyn_line LIKE LINE OF <fs_table>. ASSIGN dyn_line->* TO FIELD-SYMBOL(<fs_line>). "填充数据 DESCRIBE TABLE gt_col LINES lv_col. DO lv_col TIMES. lv_index = sy-index. ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<fs_field>). <fs_field> = '填充值' && lv_index . ENDDO. APPEND <fs_line> TO <fs_table>. DO lv_col TIMES. lv_index = sy-index. ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line> TO <fs_field>. <fs_field> = '填充值' && lv_index . ENDDO. APPEND <fs_line> TO <fs_table>. DO lv_col TIMES. lv_index = sy-index. ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line> TO <fs_field>. <fs_field> = '填充值' && lv_index . ENDDO. APPEND <fs_line> TO <fs_table>. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_COMPONENTS *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_components . CLEAR gs_components . gs_components-type ?= cl_abap_structdescr=>describe_by_name( 'MAKT-MAKTX' ). gs_components-name = 'col1'. APPEND gs_components TO gt_components. CLEAR gs_components . gs_components-type ?= cl_abap_structdescr=>describe_by_name( 'MAKT-MAKTX' ). gs_components-name = 'col2'. APPEND gs_components TO gt_components. CLEAR gs_components . gs_components-type ?= cl_abap_structdescr=>describe_by_data( <fs_table> ). gs_components-name = 'col3'. APPEND gs_components TO gt_components. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CREATE_DYN_ZS *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_create_dyn_zs . DATA ldy_table TYPE REF TO data. FIELD-SYMBOLS:<fs_col3> TYPE STANDARD TABLE. CREATE DATA ldy_table LIKE <fs_table>. ASSIGN ldy_table->* TO <fs_col3>. "创建纵深动态内表 lcl_struct ?= cl_abap_structdescr=>create( gt_components )."创建结构对象 lcl_tab ?= cl_abap_tabledescr=>create( lcl_struct )."创建表类型对象 CREATE DATA dyn_handle TYPE HANDLE lcl_tab."参照表类型对象创建动态数据对象 ASSIGN dyn_handle->* TO <fs_table_zs>."将动态数据对象分配给字段符号 CREATE DATA dyn_line1 LIKE LINE OF <fs_table_zs>."参照字段符号创建工作区数据对象 ASSIGN dyn_line1->* TO FIELD-SYMBOL(<fs_line1>). "填充纵深动态内表 DO 3 TIMES. IF sy-index NE 3. ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line1> TO FIELD-SYMBOL(<fs_field1>). <fs_field1> = '填充数据' && sy-index. ELSE. ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line1> TO <fs_col3>. <fs_col3> = <fs_table>. ENDIF. ENDDO. APPEND <fs_line1> TO <fs_table_zs>. BREAK-POINT. ENDFORM.