首页 > 代码库 > 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_GET‘28 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_DISPLAY‘84 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.
附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_GET‘24 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_DISPLAY‘52 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.
程序显示截图如上所示:
附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_DISPLAY‘36 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.
程序显示截图如上所示:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。