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

第一种:

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

路漫漫其修遠兮,唔將上下而求索!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值