详解ABAP4内表结构

详解ABAP4内表结构,第1张

ABAP中的内表相当于其他程序设计语言中的二维数组,存储多行结构相同的数据

? 不同于二维数组,内表在创建后,列结构与列数是固定不变的,而行数是动态增长的

? 内表支持循环对每行数据进行 *** 作,也支持整体 *** 作

? 内表是具有行和列的表结构,然而,不同于数据库表,内表仅在程序运行期间在内存中存储数据

?ABAP中有三种内表类型:标准表,哈希表,排序表

-- ABAP内表数据类型

? 内表数据对象是实际的内表,可以用数据进行填充

? 内表数据类型是用于定义内表数据对象的抽象数据类型(ADT)

? 可以使用的内表数据类型有:

?Structure

? 数据库表

? 用户自定义数据类型

--ABAP内表声明

1>

TYPES: BEGIN OF line,

field1 TYPE i,

field2 TYPE i,

END OF line.

* 声明一个数据类型

DATA: ITAB_WA TYPE(LIKE) line.“ 声明一个内表工作

DATA: ITAB TYPE(LIKE) line OCCURS 0. “ 声明一个无工作区的内表

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0. “ 声明一个有工作区的内表

DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE.

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE.

2>

DATA: BEGIN OF line,

field1 TYPE i,

field2 TYPE i,

END OF line.

* 声明一个line对象,该对象可以作为工作区使用

* 用DATA定义的line本身也是一个结构类型,也可再声明一个工作区

DATA: ITAB_WA TYPE(LIKE) line. “ 声明一个工作区

DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE. “ 声明一个带工作区的内表

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE . “ 声明一个带工作区的内表

3>直接定义内表,这个内表是有工作区的

DATA: BEGIN OF ITAB OCCURS 0 ,

CARR1 LIKE SPFLI-CARRID,

CONN1 LIKE SPFLI-CONNID,

END OF ITAB.

* DATA: ITAB1 TYPE ITAB.(错误的,实践证明,定义出来的什么都不是)。

正确方法:ITAB1 TYPE ITAB OCCURS 0.(这样定义后的是一个无工作区的内表)。

DATA: ITAB1 LIKE ITAB OCCURS 0 WITH HEADER LINE. “定义一个带工作区内表

4>type ref to 定义内表

type ref to 属于ABAP中面向对象的编程。它是定义一个类的对象。

5>通过数据库表定义

data itab1 type table of sflight . “ 定义一个不带内表的工作区

data wa1 like line of sflgit .“ 定义一个内表工作区

data itab1 type table of sflight with header line . “定义一个带内表的工作区

-- 两种内表定义方式的主要区别在于是否有隐式表头

内表是按行进行访问的,然而,程序对内表的行 *** 作不能直接进行,必须使用一种接口来传输,这个接口就是工作区(Work Area)

--内表 *** 作

填充内表行

append <wa>to <itab> “ 不带表头行的填充

append <itab> “ 带隐式表头行的填充

插入内表行

insert <wa>into <itab>[INDEX idx]“

insert <itab>[INDEX idx ] “ 隐式表头行插入内表

-- 如果没有指定INDEX ,则默认插入到内表最后一行

读取内表行

read <itab>into <wa>[INDEX idx]

read <itab>[INDEX IDX]

修改内表行

modify <itab>from <wa>[INDEX idx]

modify <itab>[INDEX idx]

-- read itab index 3 .

-- itab-XX = ‘xxx’ .

-- modify itab index 4 .

删除内表行

delete <itab>[INDEX idx] .

-- 带表头行和不带表头行语法一致 。

内表循环

Loop at <itab>into <wa>.

<statement block>

endloop. “ 带表头行的内表循环 *** 作

Loop at <itab>.

<statement block>

endloop. “ 不带表头行内表 *** 作

-- 循环体的MODIFY,DELETE等语句不必指定INDEX项,系统默认处理当前行 .

-- 如果不需要读取所有的内表行,可以使用WHERE选项进行限制

-- LOOP AT <itab>[WHERE <conditions>]

清空内表

clear <itab>. “清空不带表头行内表

clear<itab>[] . “清空带表头行内表

内表排序

SORT <itab>[ASCENDING | DESCENDING] [AS TEXT]

--ASCENDING和DESCENDING指定升序还是降序排列,如果不指定,缺省排序方式是升序

--AS TEXT影响字符字段的排序方式,如果不使用该选项,系统将按字符平台相应内部编码进行排序,否则,系统根据当前语言按字母顺序排序字符字段

删除重复行

DELETE ADJACENT DUPLICATES FROM <itab>[COMPARING <comp>].

-- 删除重复行之前须对内表进行排序

判断内表行数

DESCRIBE TALBE <itab>LINES <count>.

将内表中部分或全部的数据行整体插入另一内表

INSERT LINES OF <itab1>[FROM n1] [TO n2] INTO [TABLE] <itab2>[INDEX <idx>].

-- insert lines of itab1 from 1 to 100 into itab2 . “ 将内表1前100行数据附加到内表2 .

-- 两个内表必须具有相同的或可转换的行结构

将内表中部分或全部的数据行整体填充到另一内表

APPEND LINES OF <itab1>[FROM n1] [TO n2] TO <itab2>.

按照条件或者索引删除一组选定行

DELETE <itab>[FROM n1] [TO n2] [WHERE <condition>].

-- delete itab1 from 1 to 100 where age >30 . "删除内表前100行中年龄大于30 的记录 。

整体复制内表,目标内表原有内容被覆盖

MOVE <itab1>TO <itab2> 不带表头行的内表之间进行复制

MOVE <itab1>[] TO <itab2>[]. 带表头行的内表之间进行复制

MOVE <itab1>TO <itab2>[].不带表头行的内表复制到带表头行的内表

MOVE-CORRESPONDING <itab1>TO <itab2>复制内表1中与内表2具有相同结构的字段进行复制,同样适用于工作区

1. 你写的代码是怎样的?有可能是没注意DATA和TYPES的区别。types c1(30) type c.data itab1 type table of c1.data c2(30) type c.data itab2 like table of c2.2. char30是一个Data element,相当于Data typeCHAR, Length 303. char是数据字典中的一种数据类型(同类的有ACCP、DATS、QUAN等), c是ABAP中的数据类型(同类的有C、N、D、T、X、I、P、F、STRING、XSTRING)。数据字典中的数据类型是user interface层对数据的分类,用这种分类定义的table field 、structure field或data element用在ABAP程序时,ABAP处理器会把它转换成C,N,D这样的类型。在数据库中创建表时,数据字典的数据类型就会转换成数据库系统所用的类型。

Group by 不是拿来统计行数的, 好不.

统计内表行数可以用

data: lv_num type i.

describe table lt_table lines lv_num.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10074360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存