【SAP】动态内表代码示例

*&---------------------------------------------------------------------*
*& Report YTEST7
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ytest7.
*&---------------------------------------------------------------------*
*& TYPE-POOLS & TABLES
*&---------------------------------------------------------------------*
TYPE-POOLS: slis.
TABLES:mara.
*&---------------------------------------------------------------------*
*& PROGRAM VARIABLES & CONSTANTS
*&---------------------------------------------------------------------*
DATA: gs_layout   TYPE lvc_s_layo,
      gt_fieldcat TYPE TABLE OF lvc_s_fcat,
      gs_fieldcat TYPE lvc_s_fcat,
      gr_grid     TYPE REF TO cl_gui_alv_grid,
      gs_variant  LIKE  disvariant,
      gt_events   TYPE TABLE OF slis_alv_event,
      gs_events   TYPE slis_alv_event.
*&---------------------------------------------------------------------*
*& DEFINE TABLE
*&---------------------------------------------------------------------*
TYPES:BEGIN OF ty_tab,
        sel TYPE c,
      END OF ty_tab.
DATA:gt_tab TYPE TABLE OF ty_tab,
     gs_tab TYPE ty_tab.

FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE.
*&---------------------------------------------------------------------*
*& DEFINITION
*&---------------------------------------------------------------------*
DEFINE mcr_field.
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname     = &1.
  gs_fieldcat-scrtext_l     = &2.
  gs_fieldcat-colddictxt    = &3.
  gs_fieldcat-qfieldname    = &4.
  gs_fieldcat-no_zero       = &5.
  gs_fieldcat-edit          = &6.
  gs_fieldcat-ref_table     = &7.
  gs_fieldcat-ref_field     = &8.
  gs_fieldcat-hotspot       = &9.
  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
* SELECTION SCREEN
*----------------------------------------------------------------------*
PARAMETERS p_col TYPE string OBLIGATORY.                               "填入动态创建的列名,以逗号分隔

*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM frm_dis_data .                                               "展示数据

*&---------------------------------------------------------------------*
*& Form frm_dis_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_dis_data .

  CLEAR: gs_layout.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-zebra      = 'X'.

  PERFORM frm_fill_fieldcat.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
*     i_callback_pf_status_set = 'FRM_STATUS'
*     i_callback_user_command  = 'FRM_COMMAND'
      is_layout_lvc      = gs_layout
      it_fieldcat_lvc    = gt_fieldcat[]
      is_variant         = gs_variant
      it_events          = gt_events
      i_default          = 'X'
      i_save             = 'A'
    TABLES
      t_outtab           = <dyn_table>
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_fill_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fill_fieldcat .
  SPLIT p_col AT ',' INTO TABLE DATA(gt_col).

  LOOP AT gt_col ASSIGNING FIELD-SYMBOL(<fs_col>).
    DATA(lv_txt) = <fs_col> && '描述'.

    mcr_field:<fs_col> lv_txt  'L' '' '' '' '' '' ''.
  ENDLOOP.

  PERFORM frm_create_dyn.                                              "创建动态内表&&填充数据
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CREATE_DYN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_dyn .
  DATA:lt_table TYPE REF TO data.

  "创建动态内表
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog           = gt_fieldcat
    IMPORTING
      ep_table                  = lt_table
    EXCEPTIONS
      generate_subpool_dir_full = 1
      OTHERS                    = 2.
  ASSIGN lt_table->* TO <dyn_table>.

  PERFORM frm_write_data_to_dyntable.                                  "向动态内表中写数
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_write_data_to_dyntable
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_write_data_to_dyntable .
  DATA:ls_new_line TYPE REF TO data.
  FIELD-SYMBOLS:<dyn_wa>,
                <field>.

  SPLIT p_col AT ',' INTO TABLE DATA(gt_col).

  "建立一个与动态内表结构相同的数据对象
  CREATE DATA ls_new_line LIKE LINE OF <dyn_table>.
  ASSIGN ls_new_line->* TO <dyn_wa>.

  DESCRIBE TABLE gt_col LINES DATA(lv_col).

  "填充数据
  DO 3 TIMES.
    DO lv_col TIMES.
      DATA(lv_index) = sy-index.
      ASSIGN COMPONENT sy-index OF STRUCTURE <dyn_wa> TO FIELD-SYMBOL(<fs_field>).
      <fs_field> = '填充值' && lv_index .
    ENDDO.
    APPEND <dyn_wa> TO <dyn_table>.
  ENDDO.
ENDFORM.

 

 

 

posted @ 2021-08-25 09:40  littlefoam  阅读(210)  评论(0)    收藏  举报