ABAP中创建动态内表的三种方法
2010-10-28 13:22
274 查看
第一种:
如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用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
如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用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
相关文章推荐
- ABAP中创建动态内表的三种方法(转载)
- 动态创建标记的三种方法
- ASP.NET AJAX Advance Tips & Tricks (11) 三种方法动态创建Tooltip
- ABAP动态生成内表的三种方法
- JS中动态创建元素的三种方法
- 动态创建窗体实例的三种方法
- java中使用字符串或者动态创建对象的三种方法(Class,Constructor,Proxy)
- 创建动态代理的三种方法
- JS中动态创建元素的三种方法总结(推荐)
- ASP.NET AJAX Advance Tips & Tricks (11) 三种方法动态创建Tooltip
- jquery动态加载js三种方法实例
- Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法
- Mysql创建用户的三种基本方法
- [转]创建单实例应用程序的三种方法
- IE8中动态创建script标签onload无效的解决方法
- JavaScript动态加载CSS的三种方法
- javascript 动态创建标记的几种方法
- Linux、Solaris 系统根据时间动态创建目录或文件夹的方法
- OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法
- Runtime-动态创建类添加属性和方法