首页 > 代码库 > ABAP 动态生成内表的几种方法

ABAP 动态生成内表的几种方法

      最近要写个程序,既有更新的,也有删除的,需要涉及到很多系统表,如果一个表一个表进行更新或者删除太慢了,于是就想通过创建动态内表来实现这些功能,在网上找了一些资料,经过多次尝试,终于测试成功了。网上讲述的创建动态内表的方法大致有两种。我做了一下测试,源代码附后。在这里提醒大家一点,在做动态更新程序的时候,要注意两点:
      1.使用modify (p_tabname) from <dyn_wa>. 的时候,一定要确定要更新的字段是不是系统表的关键字段,如果是关键字段的话,需要先删除这条记录,delete (p_tabname) from <dyn_wa>.再进行modify,因为modify进行更新的时候如果不存在就新增,这点一定要注意。
      2.如果使用UPDATE进行更新,对于非主键字段的改变还是可以的,但是对于主键字段,只能用MODIFY了。直接对SAP数据做UPDATE和MODIFY是很危险的,不到万不得已,最好不要做这些操作。如果万一出问题,会很严重的。这里就不用更新和删除程序作为测试程序了,直接做一个动态内表ALV显示的测试程序,道理和更新与删除差不多,希望对有这方面需求的朋友有所帮助!

3.最近从同事程序中发现另一种创建动态内表的简便方法,附3中为测试代码。觉得这个方法更简单些……

附1:

 1 *&---------------------------------------------------------------------* 2 *& Report  YDEMO_RICK 3 *& 4 *&---------------------------------------------------------------------* 5 *& 6 *& 7 *&---------------------------------------------------------------------* 8 REPORT  ydemo_rick. 9 10 TYPE-POOLS:abap.11 PARAMETERS p_name TYPE tabname.12 DATA lt_table TYPE TABLE OF dfies. "字段结构表13 DATA ls_table TYPE dfies.14 DATA lr_struc TYPE REF TO cl_abap_structdescr.15 DATA lr_table TYPE REF TO cl_abap_tabledescr.16 DATA lr_type TYPE REF TO cl_abap_typedescr.17 DATA lr_data TYPE REF TO cl_abap_datadescr.18 DATA lt_comp TYPE abap_component_tab.19 DATA ls_comp LIKE LINE OF lt_comp.20 DATA dyn_wa TYPE REF TO data.21 DATA dyn_table TYPE REF TO data.22 DATA l_string TYPE string.23 FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,24                <dyn_wa> TYPE any.25 26 *1.获取表中的字段结构27 CALL FUNCTION DDIF_NAMETAB_GET28   EXPORTING29     tabname   = p_name30   TABLES31     dfies_tab = lt_table32   EXCEPTIONS33     not_found = 134     OTHERS    = 2.35 IF sy-subrc <> 0.36   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno37   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .38 ENDIF.39 40 LOOP AT lt_table INTO ls_table.41   CONCATENATE ls_table-tabname - ls_table-fieldname INTO l_string.42   ls_comp-name = ls_table-fieldname.43 *读取字段类型44   CALL METHOD cl_abap_datadescr=>describe_by_name45     EXPORTING46       p_name         = l_string47     RECEIVING48       p_descr_ref    = lr_type49     EXCEPTIONS50       type_not_found = 151       OTHERS         = 2.52   IF sy-subrc <> 0.53     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno54     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.55   ENDIF.56   ls_comp-type ?= lr_type.57   APPEND ls_comp TO lt_comp.58   CLEAR ls_comp.59 ENDLOOP.60 *根据字段目录创建动态结构类型61 CALL METHOD cl_abap_structdescr=>create62   EXPORTING63     p_components = lt_comp64   RECEIVING65     p_result     = lr_struc.66 *根据动态结构创建动态内表类型67 CALL METHOD cl_abap_tabledescr=>create68   EXPORTING69     p_line_type = lr_struc70   RECEIVING71     p_result    = lr_table.72 *参照动态结构类型和动态内表类型创建内表与工作区73 CREATE DATA dyn_wa TYPE HANDLE lr_struc.74 CREATE DATA dyn_table TYPE HANDLE lr_table.75 *指定内表与工作区到字段符号76 ASSIGN dyn_wa->* TO <dyn_wa>.77 ASSIGN dyn_table->* TO <dyn_table>.78 79 *从动态表中取数到动态内表中80 SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 10081 ROWS FROM (p_name).82 *显示内表中的数据83 CALL FUNCTION REUSE_ALV_GRID_DISPLAY84   EXPORTING85     i_structure_name = p_name86   TABLES87     t_outtab         = <dyn_table>88   EXCEPTIONS89     program_error    = 190     OTHERS           = 2.91 IF sy-subrc <> 0.92   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno93   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.94 ENDIF.
View Code

附2:

 1 *&---------------------------------------------------------------------* 2 *& Report  YDEMO_RICK 3 *& 4 *&---------------------------------------------------------------------* 5 *& 6 *& 7 *&---------------------------------------------------------------------* 8 REPORT  ydemo_rick. 9 10 TYPE-POOLS:abap.11 PARAMETERS p_name TYPE tabname.12 DATA: d_ref TYPE REF TO data,13 lt_alv_cat TYPE TABLE OF lvc_s_fcat,14 ls_alv_cat LIKE LINE OF lt_alv_cat.15 16 DATA: lt_table LIKE TABLE OF dntab.17 DATA: ls_table TYPE dntab.18 19 FIELD-SYMBOLS : <dyn_table> TYPE table,20                 <dyn_wa> TYPE any,21                 <dyn_field> TYPE any.22 *取出表结构的字段目录23 CALL FUNCTION NAMETAB_GET24   EXPORTING25     langu          = sy-langu26     tabname        = p_name27   TABLES28     nametab        = lt_table29   EXCEPTIONS30     no_texts_found = 1.31 *根据取出的字段目录生成参考字段目录32 LOOP AT lt_table INTO ls_table.33   ls_alv_cat-fieldname = ls_table-fieldname.34   ls_alv_cat-ref_table = p_name.35   ls_alv_cat-ref_field = ls_table-fieldname.36   APPEND ls_alv_cat TO lt_alv_cat.37   CLEAR ls_alv_cat.38 ENDLOOP.39 *内表创建40 CALL METHOD cl_alv_table_create=>create_dynamic_table41   EXPORTING42     it_fieldcatalog = lt_alv_cat43   IMPORTING44     ep_table        = d_ref.45 *指定生成的内表到字段符号46 ASSIGN d_ref->* TO <dyn_table>.47 *从动态表中取数到动态内表中48 SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 10049 ROWS FROM (p_name).50 *显示内表中的数据51 CALL FUNCTION REUSE_ALV_GRID_DISPLAY52   EXPORTING53     i_structure_name = p_name54   TABLES55     t_outtab         = <dyn_table>56   EXCEPTIONS57     program_error    = 158     OTHERS           = 2.59 IF sy-subrc <> 0.60   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno61   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.62 ENDIF.
View Code

程序显示截图如上所示:

附3:

 1 *&---------------------------------------------------------------------* 2 *& Report  YDEMO_RICK 3 *& 4 *&---------------------------------------------------------------------* 5 *& 6 *& 7 *&---------------------------------------------------------------------* 8 REPORT  ydemo_rick. 9 10 PARAMETERS p_name TYPE tabname.11 12 DATA: dyn_table TYPE REF TO data.13 DATA: dyn_wa TYPE REF TO data.14 15 FIELD-SYMBOLS: <dyn_table> TYPE table,16 <dyn_wa> TYPE any.17 18 *创建动态表结构19 CREATE DATA dyn_table TYPE TABLE OF (p_name).20 *创建动态内表21 ASSIGN dyn_table->* TO <dyn_table>.22 *创建动态工作区结构23 CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.24 *创建动态工作区25 ASSIGN dyn_wa->* TO <dyn_wa>.26 27 *从动态表中取数到动态内表中28 SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 10029 ROWS FROM (p_name).30 *对取出数据进行处理31 LOOP AT <dyn_table> ASSIGNING <dyn_wa>.32   "内表数据处理33 ENDLOOP.34 *显示内表中的数据35 CALL FUNCTION REUSE_ALV_GRID_DISPLAY36   EXPORTING37     i_structure_name = p_name38   TABLES39     t_outtab         = <dyn_table>40   EXCEPTIONS41     program_error    = 142     OTHERS           = 2.43 IF sy-subrc <> 0.44   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno45   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.46 ENDIF.
View Code

程序显示截图如上所示: