zoukankan      html  css  js  c++  java
  • 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   EXPORTING
    29     tabname   = p_name
    30   TABLES
    31     dfies_tab = lt_table
    32   EXCEPTIONS
    33     not_found = 1
    34     OTHERS    = 2.
    35 IF sy-subrc <> 0.
    36   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    37   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_name
    45     EXPORTING
    46       p_name         = l_string
    47     RECEIVING
    48       p_descr_ref    = lr_type
    49     EXCEPTIONS
    50       type_not_found = 1
    51       OTHERS         = 2.
    52   IF sy-subrc <> 0.
    53     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    54     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=>create
    62   EXPORTING
    63     p_components = lt_comp
    64   RECEIVING
    65     p_result     = lr_struc.
    66 *根据动态结构创建动态内表类型
    67 CALL METHOD cl_abap_tabledescr=>create
    68   EXPORTING
    69     p_line_type = lr_struc
    70   RECEIVING
    71     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 100
    81 ROWS FROM (p_name).
    82 *显示内表中的数据
    83 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    84   EXPORTING
    85     i_structure_name = p_name
    86   TABLES
    87     t_outtab         = <dyn_table>
    88   EXCEPTIONS
    89     program_error    = 1
    90     OTHERS           = 2.
    91 IF sy-subrc <> 0.
    92   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    93   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_GET'
    24   EXPORTING
    25     langu          = sy-langu
    26     tabname        = p_name
    27   TABLES
    28     nametab        = lt_table
    29   EXCEPTIONS
    30     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_table
    41   EXPORTING
    42     it_fieldcatalog = lt_alv_cat
    43   IMPORTING
    44     ep_table        = d_ref.
    45 *指定生成的内表到字段符号
    46 ASSIGN d_ref->* TO <dyn_table>.
    47 *从动态表中取数到动态内表中
    48 SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 100
    49 ROWS FROM (p_name).
    50 *显示内表中的数据
    51 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    52   EXPORTING
    53     i_structure_name = p_name
    54   TABLES
    55     t_outtab         = <dyn_table>
    56   EXCEPTIONS
    57     program_error    = 1
    58     OTHERS           = 2.
    59 IF sy-subrc <> 0.
    60   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    61   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 100
    29 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   EXPORTING
    37     i_structure_name = p_name
    38   TABLES
    39     t_outtab         = <dyn_table>
    40   EXCEPTIONS
    41     program_error    = 1
    42     OTHERS           = 2.
    43 IF sy-subrc <> 0.
    44   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    45   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    46 ENDIF.
    View Code

    程序显示截图如上所示:

  • 相关阅读:
    flask-bootstrap
    SSH
    Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
    加载spring 的方法。
    简约的form表单校验插件
    javascript 大数值数据运算
    【解题报告】 Task
    【解题报告】 POJ1050 To the Max
    。。。
    【解题报告】 POJ2054 给树染色
  • 原文地址:https://www.cnblogs.com/ruingy/p/3921690.html
Copyright © 2011-2022 走看看