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

转载于:https://www.cnblogs.com/yanglikun/p/4177973.html

ABAP中创建动态内表的三种方法(转载)相关推荐

  1. ABAP动态生成内表的三种方法

    动态内表的创建和使用主要有以下几点: 动态内表的创建,首先要定义动态结构,然后再根据定义的动态结构利用系统一个标准的method:"cl_ALV_table_create=>creat ...

  2. R语言数据框中创建新的变量的三种方法

    方法1 > mydata<-data.frame(x1=c(1,2,3,4),x2=c(5,6,7,8)) > mydata$sum<-mydata$x1+mydata$x2 ...

  3. vbs执行ctrl+空格_VBS中解决路径带空格的三种方法

    vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...

  4. 在HTML中使用CSS美化网页的三种方法

    在HTML中使用CSS美化网页的三种方法 CSS是Cascading Style Sheets(级联样式表)的缩写,CSS是一种样式表语言,用于为HTML文档定义布局.例如,CSS涉及字体.颜色.边距 ...

  5. Unity3D中的SendMessage使用(消息传递的三种方法)

    转载自 Unity3D中的SendMessage使用(消息传递的三种方法) 0 概述 Unity提供的消息推送机制可以非常方便我们的脚本开发,它实现的是一种 伪监听者模式,利用的是反射机制. 1 常用 ...

  6. js中当等于最小值是让代码不执行_网页中JS函数自动执行常用三种方法

    本文为大家分享了在网页中JS函数自动执行常用方法,供大家参考,具体内容如下 一.JS方法 1.最简单的调用方式,直接写到html的body标签里面: 2.在JS语句调用: function myfun ...

  7. android启动其他app的服务器,Android中通过外部程序启动App的三种方法

    这篇文章主要介绍了Android中通过外部程序启动App的三种方法, 本文讲解了直接通过包名. 通过自定义的Action. 通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下 ==== ...

  8. 安卓在子线程中实现更新UI界面的三种方法 Handler+Message、runOnUiThread、控件.post()

    1.说明 安卓中UI线程为主线程,更新UI界面必须在主线程中进行,在子线程中实现更新UI界面的三种方法:Handler.RunOnUiThread.控件.post() 2.1 Handler (1)定 ...

  9. html网页自动运行函数,在网页中JS函数自动执行常用三种方法

    在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: functionn MyAutoRun() { //以下是您的函数的代码,请自行修改先! alert("函数 ...

最新文章

  1. java下输出中文的一点研究
  2. SpringDataJpa使用原生sql(EntityManager)动态拼接,分页查询
  3. 学习《Building Applications with FME Objects》 之二 使用Sessions(会话)
  4. python sftp_Python使用sftp实现上传和下载功能(实例代码)
  5. 在js中如何判断一个对象是否为空
  6. linux的静态编译elf无法调试,macos-运行arm-elf-gcc编译代码时出现段错误
  7. 课后作业-阅读任务-阅读笔记-2
  8. 前端学习(535):多列布局2
  9. 2021年中国余热回收锅炉市场趋势报告、技术动态创新及2027年市场预测
  10. 如何在应用系统中实现数据权限的控制功能
  11. mysql 5.6.15.0 源码_源码编译mysql-5.6.15
  12. code review的一些思考
  13. Object C中文件后缀名
  14. dubbo服务者源码分期
  15. 追忆似水流年,似水高三
  16. 基于Token的验证方式(JWT简笔)
  17. 单片机实验-数据传送
  18. @Valid 注解详解 Java Bean Validation的前世今生
  19. 转:旅游推荐系统的演进
  20. General error: 1366 Incorrect string value: '\xF0\x9F\x98\x8A' for column

热门文章

  1. java citymap_Java实现Map集合二级联动
  2. 引入struts html标签,【学习】Struts标签之html标签
  3. java foreach和for循环区别_java相关:老生常谈foreach(增强for循环)和for的区别
  4. python OSError: [Errno 24] Too many open files | HTTPConnectionPool(host=‘‘, port=80): Max retries e
  5. 【嵌入式系统】STM32串口通信的四种方法(基于RTOS)
  6. CGPA的完整形式是什么?
  7. java优秀算法河内之塔_河内塔的Java程序
  8. array_push_PHP array_push()函数与示例
  9. 程序崩溃 分析工具_程序分析工具| 软件工程
  10. C++---两数之和