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的弊端。