• ABAP中创建动态内表的三种方法(转载)


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

    第一种:

    如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用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的弊端。

  • 相关阅读:
    天轰穿C#教程之C#基础的学习路线
    天轰穿C#教程之大话C#
    天轰穿C#教程之#pragma介绍[原创]
    天轰穿.NET教程之第一个控制台应用程序
    .NET笔试题整理(转)
    天轰穿.NET教程之基类库
    天轰穿C#教程之C#有哪些特点?
    程序猿!?应该有哪些目标?
    浅谈编程程序员应该具备的职业素养 [转载]
    .NET访问MySQL数据库方法(转)
  • 原文地址:https://www.cnblogs.com/yanglikun/p/4177973.html
Copyright © 2020-2023  润新知