ABAP中创建动态内表的三种方法

来源:互联网 发布:如何设置windows外观 编辑:程序博客网 时间:2024/04/30 11:24

第一种:

如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用CREATE DATA生成,当然也可以是自定义类型。

比如要产生和数据表MARA结构一致的动态内表:

  DATA :  DY_TABLE TYPE REF TO DATA,  WA_LINE TYPE REF TO DATA.

  FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE .

   CREATE DATA DY_TABLE TYPE TABLE OF MARA.
 ASSIGN DY_TABLE->*  TO <DYN_TABLE>.

 CREATE DATA WA_LINE LIKE LINE OF <DYN_TABLE>.
 ASSIGN WA_LINE->* TO <DYN_WA>.

 如果在程序中需要动态生成多个不同的动态内表,可以将表名设置为变量

 CREATE DATA DY_TABLE TYPE TABLE OF (tabname).

第二种:

如果需要对动态内表进行输出,控制输出顺序等属性。可以使用下述方法:

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        I_CLIENT_NEVER_DISPLAY = ''
        I_STRUCTURE_NAME       = TABNAME
      CHANGING
        CT_FIELDCAT            = IT_STRUCTURE
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.

使用该方法创建输入的tabname对应的字段目录

之后根据该字段目录产生与之对应的动态内表结构

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
      EXPORTING
        IT_FIELDCATALOG  = IT_STRUCTURE
*        I_LENGTH_IN_BYTE = 'X'
      IMPORTING
        EP_TABLE         = DY_TABLE.

  ASSIGN DY_TABLE->*  TO <DYN_TABLE>.

动态工作区的产生跟第一种一样。

该方法有一种弊端,仅能连续使用36次。即改方法产生动态是使用创建子例程的方法,当连续使用36次时,会出现子例程池溢出的异常,以为该方法是针对ALV技术的处理,所以用于其它地方的时候需要慎重。

第三种:

第三种的基本思路跟第二种是一样的,只是使用的类和方法不一样,导致输入的数据不一样。

首先产生结构

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        I_CLIENT_NEVER_DISPLAY = ''
        I_STRUCTURE_NAME       = TABNAME
      CHANGING
        CT_FIELDCAT            = IT_STRUCTURE
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.

根据字段产生的字段目录生成相应的接口参数ZCOMPONENTS

 DATA ZCOMPONENTS TYPE  ABAP_COMPONENT_TAB. 在声明该变量前要声明  TYPE-POOLS:ABAP.

    ABAP_COMPONENT_TAB这个结构中的字段如下所示:

    name       TYPE string,
    type       TYPE REF TO cl_abap_datadescr,
    as_include TYPE abap_bool,
    suffix     TYPE string,

 

所以循环之前产生的字段目录内表,

name字段是结构名或者表名 即TABNAME

type是一个对象,可以使用 CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME 这个方法得到,其中 P_NAME 这个参数是表名或结构名+字段名 type 使用?=符号来获取 P_DESCR_REF  的实例

后两个可以不填

 


  产生结构

  CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE
  EXPORTING
    P_COMPONENTS = ZCOMPONENTS
  RECEIVING
    P_RESULT     = ZRESULT     .

     产生表

  CALL METHOD CL_ABAP_TABLEDESCR=>CREATE
  EXPORTING
    P_LINE_TYPE = ZRESULT

  RECEIVING
    P_RESULT    = WRESULT.

  CREATE DATA WA_LINE    TYPE HANDLE ZRESULT.
 CREATE DATA DYN_TABLE TYPE HANDLE WRESULT.

该方法可以避免方法2的弊端。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhonggongsoftware/archive/2010/10/20/5954900.aspx