ABAP 开发系列(05): ABAP 内表与内表结构
来源:互联网 发布:js flag用法 编辑:程序博客网 时间:2024/04/29 07:20
2.内表和内表结构
2.1 结构体(Structure)
2.1.1 结构体的定义
ABAP 中可以定义结构来包含多个基本类型,便于整理及操作;
结构体不属于数据字典对象(数据字典中可以定义结构体,但不能存储数据),在程序运行时会被作为临时对象存储在内存空间;
在创建内表时,可参考直接定义的结构体作为内表结构。
结构体的定义,可以通过两种方式实现:
1.第一种方式
语法:
DATA: BEGIN OF <name>
<field1> . . .
<field2> . . .
. . .
END OF <name>.
如:
TABLES
: TABNA.
DATA
:
BEGIN
OF
ADDRESS,
FLAG
TYPE
C,
ID
LIKE
TABNA-
ID
,
NAME1
LIKE
TABNA-NAME1,
CITY
LIKE
TABNA-CITY,
END
OF
ADDRESS.
* 为结构体字段赋值
MOVE
'X'
TO
ADDRESS-FLAG.
MOVE
'0001'
TO
ADDRESS-
ID
.
MOVE
'Smith'
TO
ADDRESS-NAME1.
MOVE
'Philadelphia'
TO
ADDRESS-CITY.
WRITE
ADDRESS.
2.第二种方式
语法:
TYPES: BEGIN OF <name1>,
<field1> . . . ,
<field2> . . . ,
. . . ,
END OF <name1>.
DATA: <name2> TYPE <name1>.
如:
TYPES
:
BEGIN
OF
ADDR,
FLAG,
ID
LIKE
EMPLOYEE-
ID
,
NAME1
LIKE
EMPLOYEE-NAME1,
CITY
LIKE
EMPLOYEE-CITY,
END
OF
ADDR.
DATA
: ADDRESS
TYPE
ADDR.
MOVE
:
'X'
TO
ADDRESS-FLAG,
'00001'
TO
ADDRESS-
ID
,
'Smith'
TO
ADDRESS-NAME1,
'Philadelphia'
TO
ADDRESS-CITY.
WRITE
ADDRESS.
2.1.2 结构体的赋值
相同结构体之间可以通过 MOVE … TO … 语句进行赋值;
如若存在类型差异的结构体,则可以通过 MOVE-CORRESSPONDING … TO … 语句将两个结构体之间相同字段自动匹配赋值:
与基本变量定义类似,结构体的初始化操作也可以通过 CLEAR 语句实现。
如:
TABLES
: employee.
DATA
:
BEGIN
OF
address,
flag,
id
LIKE
employee-id,
name
LIKE
employee-name1,
city
LIKE
employee-city,
END
OF
ADDRESS.
SELECT
* FROM employee.
MOVE
-
CORRESPONDING
employee
TO
address.
WRITE
: / address-flag, address-id,
address-name, address-city.
CLEAR
address.
ENDSELECT
.
2.2 内表(Internal Table)
内表与结构体基本类似,同样在程序运行过程中存储在临时创建的内存空间,它是一个可以存储多条记录的数据表。
2.2.1 内表的定义
通过关键字DATA定义内表,可以直接参考结构体或者其他内表及透明表结构,也可以直接定义结构字段。
语法:
①.DATA <NAME> TYPE <STRUCTURE> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE].
②.DATA <NAME> LIKE TABLE OF <TABLE> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE].
③.DATA: BEGIN OF itab OCCURS n,
<field>
<field>
END OF itab.
其中,关键字说明如下:
[UNIQUE|NON-UNIQUE]: 指定关键字,只用于排序表,使用NON-UNIQUE关键字的话,排序表数据记录允许重复关键字字段;
[INITIAL SIZE n]:指定初始化内表大小,比较少用,一般默认即可;
[WITH HEADER LINE]: 定义内表是否带表头;
*--------------------------------------------------------------------*
* 通过定义结构体并参考该结构定义内表
*--------------------------------------------------------------------*
TABLES
: employee.
"参考某一透明表,必须先引用定义
TYPES
:
BEGIN
OF
emp,
id
LIKE
employee-id,
name1
LIKE
employee-name1,
country
LIKE
employee-country,
END
OF
emp.
*--------------------------------------------------------------------*
* 参考EMP 结构定义一个初始化大小为10,并有HEADER LINE的内表
*--------------------------------------------------------------------*
DATA
: emptab
TYPE
STANDARD
TABLE
OF
emp
INITIAL
SIZE
10
WITH
HEADER
LINE
.
*--------------------------------------------------------------------*
* 参考EMPTAB内表,重新定义没有HEADER LINE的内表
*--------------------------------------------------------------------*
DATA
: emptab_n
LIKE
STANDARD
TABLE
OF
emptab.
*--------------------------------------------------------------------*
* 定义一个允许重复KEY,并且没有HEADER LINE的排序表
*--------------------------------------------------------------------*
DATA
: emptab_s
TYPE
SORT
TABLE
OF
emp
WITH
NON
-
UNIQUE
KEY
id.
*--------------------------------------------------------------------*
* 通过第三种方式定义的内表,可指定具体字段,默认内表存在HEADER LINE
*--------------------------------------------------------------------*
TYPES
:
BEGIN
OF
emp
OCCURS
0,
id
LIKE
employee-id,
name1
LIKE
employee-name1,
country
LIKE
employee-country,
END
OF
emp.
2.2.2 内表有无 HEADER LINE 的区别
对于有HEADER LINE的内表,可以通过填充HEADER LINE数据后或通过 外部Work Area 向内表存储空间中追加数据。
对于没有HEADER LINE的内表,只能通过 外部Work Area来传递数据:
语法:
①.APPEND [<Work Area> INTO] <ITAB>.
如:
TABLES
: employee.
TYPES
:
BEGIN
OF
emp,
id
LIKE
employee-id,
name1
LIKE
employee-name1,
country
LIKE
employee-country,
END
OF
emp.
* 有 HEADER LINE 的内表
DATA
: emptab
TYPE
STANDARD
TABLE
OF
emp
INITIAL
SIZE
10
WITH
HEADER
LINE
.
* 没有 HEADER LINE 的内表
DATA
: emptab2
TYPE
STANDARD
TABLE
OF
emp
INITIAL
SIZE
10,
* Work Area
emptab_wa
TYPE
emp.
SELECT
* FROM employee.
MOVE
-
CORRESPONDING
employee
TO
emptab.
APPEND
emptab.
MOVE
-
CORRESPONDING
employee
TO
emptab_wa.
APPEND
emptab_wa
TO
emptab2.
ENDSELECT
.
由于没有HEADER LINE的内表通过Work Area 传递数据在性能上会优于HEADER LINE直接填充HEADER LINE,
所以,一般基本都使用没有 HEADER LINE 的内表。
除非一些特殊情况,才会使用 HEADER LINE 内表。
2.2.3 内表数据处理
1. 遍历读取内表数据 (LOOP … ENDLOOP.)
LOOP
AT
emptab
WHERE
country
BETWEEN
‘A’
AND
‘D’.
WRITE
: / emptab-country, emptab-name1, emptab-sales.
ENDLOOP
.
IF
sy-subrc
NE
0.
WRITE
: / ‘
NO
ENTRIES
’.
ENDIF
.
解析:
a.LOOP 语句后,允许使用WHERE语句筛选数据。
b.程序中,出现 sy-subrc 变量,这是系统全局变量,用于检查是否符合条件,
如若符合条件 sy-subrc 返回0 ,如果不符合,则返回4.
2. 读取内表数据 (READ TABLE …)
在数据内表,可以通过READ TABLE关键字根据具体行数或主键字段读取内表中的某行记录:
TABLES
: employee.
TYPES
:
BEGIN
OF
emp,
country
LIKE
employee-country,
name1
LIKE
employee-name1,
END
OF
emp.
DATA
: emptab
TYPE
STANDARD
TABLE
OF
emp
INITIAL
SIZE
10
WITH
HEADER
LINE
.
SELECT
* FROM EMPLOYEE.
MOVE
-
CORRESPONDING
employeeTO emptab.
APPEND
EMPTAB.
ENDSELECT
.
READ
TABLE
….
READ TABLE 选项:
1) READ TABLE <EMPTAB>.
2) READ TABLE <EMPTAB> WITH KEY <k1> = <v1>… <kn> = <vn>.
3) READ TABLE <EMPTAB> WITH TABLE KEY <k1> = <v1> … <kn> = <vn>.
4) READ TABLE <EMPTAB> WITH KEY = <value>.
5) READ TABLE <EMPTAB> WITH KEY . . . BINARY SEARCH.
6) READ TABLE <EMPTAB> INDEX <i>.
7) READ TABLE <EMPTAB> COMPARING <f1> <f2> . . . .
8) READ TABLE <EMPTAB> COMPARING ALL FIELDS.
9) READ TABLE <EMPTAB> TRANSPORTING <f1> <f2> . . . .
10) READ TABLE <EMPTAB> TRANSPORTING NO FIELDS.
关键字说明:
[KEY|TABLE KEY]: 通过内表的主键字段查找
[BINARY SEARCH]: 二分法查找,使用该方法时,在READ TABLE之前,必须对内表排序
[INDEX]: 根据内表索引查找
[COMPARING]:只查找设置的字段
[COMPARING ALL FIELDS]:查找内表所有的字段
[TRANSPORTING]: 只输出设置的字段数据
[TRANSPORTING NO FIELDS]: 不输出任何数据
3. 内表排序
对内表进行排序,指定具体排序的排序字段、排序方式(升序/降序)
默认情况下,为升序。
语法:
SORT itab [BY <f1> <f2> …] [ASCENDING|DESCENDING]
4. 内表分类汇总(COLLECT TABLE …)
通过COLLECT TABLE关键字,可以对内表中相同记录合并,若有数字类型(I、P、F)的字段,会将其合并汇总。
语法:
COLLECT [<work area> INTO] itab.
TABLES
: EMPLOYEE.
TYPES
:
BEGIN
OF
EMP,
COUNTRY
LIKE
EMPLOYEE-COUNTRY,
SALES
LIKE
EMPLOYEE-SALES,
END
OF
EMP.
DATA
: EMPTAB
TYPE
STANDARD
TABLE
OF
EMP
INITIAL
SIZE
10
WITH
HEADER
LINE
,
EMPTAB_C
TYPE
STANDARD
TABLE
OF
EMP
INITIAL
SIZE
10
WITH
HEADER
LINE
.
DATA
: EMPTAB_WA
TYPE
EMP.
* 赋值
EMPTAB-COUNTRY =
'D'
.
EMPTAB-SALES = 400.
APPEND
EMPTAB.
EMPTAB-COUNTRY =
'USA'
.
EMPTAB-SALES = 1000.
APPEND
EMPTAB.
EMPTAB-COUNTRY =
'GB'
.
EMPTAB-SALES = 500.
APPEND
EMPTAB.
EMPTAB-COUNTRY =
'D'
.
EMPTAB-SALES = 7800.
APPEND
EMPTAB.
SORT
EMPTAB
BY
COUNTRY.
LOOP
EMPTAB.
MOVE
-
CORRESPONDING
EMPTAB
TO
EMPTAB_WA.
COLLECT
EMPTAB
INTO
EMPTAB_C.
ENDLOOP
.
输出结果:
D 8200
GB 500
USA 1000
或者直接从数据表取数汇总:
SELECT
* FROM EMPLOYEE.
MOVE
-
CORRESPONDING
EMPLOYEE
TO
EMPTAB.
COLLECT
EMPTAB.
ENDSELECT
.
LOOP
AT
EMPTAB.
WRITE
: / EMPTAB-COUNTRY, EMPTAB-SALES.
ENDLOOP
.
5.系统字段 SY-TABIX
与前面提到的 SY-SUBRC 字段一样,SY-TABIX 也为系统的全局变量;
用于在循环遍历内表时,当前记录的索引值:
SELECT
* FROM EMPLOYEE
INTO
CORRESPONDING
FIELDS
OF
TABLE
EMPTAB.
LOOP
AT
EMPTAB.
WRITE
: / SY-TABIX, EMPTAB-COUNTRY, EMPTAB-NAME1.
ENDLOOP
.
2.2.4 维护内表数据
1.通过索引值维护内表
语法:
INSERT <EMPTAB> INDEX <i>.
MODIFY <EMPTAB> INDEX <i>.
DELETE <EMPTAB> INDEX <i>.
说明:
INSERT: 向内表数据I处插入数据记录
MODIFY:修改内表数据I处记录
DELETE:删除内表I处数据记录
如:
SELECT
* FROM EMPLOYEE.
MOVE
-
CORRESPONDING
EMPLOYEE
TO
EMPTAB.
APPEND
EMPTAB.
ENDSELECT
.
READ
TABLE
EMPTAB
INDEX
1.
MOVE
'ABC'
TO
EMPTAB-NAME1.
MODIFY
EMPTAB
INDEX
SY-TABIX.
* 每次执行完之后,判断SY-SUBRC是否为0
IF
SY-SUBRC
NE
0.
WRITE
: / ‘Attempt
to
modify failed.’.
ELSE
.
WRITE
: / EMPTAB-COUNTRY, EMPTAB-NAME1.
ENDIF
.
INSERT
EMPTAB
INDEX
1.
DELETE
EMPTAB
INDEX
SY-TABIX.
2. 维护没有HEADER LINE的内表
APPEND <work area> TO <internal table>.
COLLECT <work area> INTO <internal table>.
INSERT <work area> INTO <internal table>.
MODIFY <internal table> FROM <work area>.
READ TABLE <internal table> INTO <work area>.
LOOP AT <internal table> INTO <work area>.
说明:
APPEND: 向内表追加数据
COLLECT:内表数据分类汇总
INSERT:向内表插入数据
MODIFY:修改内表数据
READ TABLE:读取内表数据
LOOP AT:遍历内表数据
3. 清空内表
清空内表有4种方式:
CLEAR <internal table>:仅清空HEADER LINE,对内表数据存储空间不影响
REFRESH <internal table>:清空内表数据存储空间,对HEADER LINE不影响
FREE <internal table>:清空内表数据存储空间,对HEADER LINE不影响
4.获取内表信息
可以通过 DESCRIBE 关键字获取内表的相关信息。
语法:
DESCRIBE TABLE <internal table> [LINES <var1>] [OCCURS <var2>].
说明:
LINES: 获取内表存储记录数
OCCURS:获取内表存储空间大小
原著地址:http://www.sapjx.com/abap-internal-table-and-data-structure.html
- ABAP 开发系列(05): ABAP 内表与内表结构
- ABAP结构体,内表动态创建
- abap 工作区 结构 内表 区别
- 关于ABAP内表
- ABAP-内表
- ABAP动态内表
- 【ABAP】内表类型
- ABAP内表操作
- ABAP内表操作
- ABAP动态内表
- abap内表
- 关于ABAP内表
- ABAP-动态内表
- ABAP 内表
- 动态ABAP内表
- ABAP~ 内表操作
- ABAP开发的第一步, 先说说ABAP内表
- ABAP开发的第一步, 先说说ABAP内表
- C++第二次实验-作业报告
- 进程保活-探索篇之1像素保活
- Android 开发:(六)Activity生命周期以及函数意义
- 欢迎使用CSDN-markdown编辑器
- Servlet工作原理
- ABAP 开发系列(05): ABAP 内表与内表结构
- 剑指Offer系列-面试题30:最小的K个数
- Java NIO(六)--ServerSocketChannel与SocketChannel
- 【机器学习】使用python实现kNN算法
- 错题系列知识点总结03
- Oracle数据库的连接配置和字符集配置
- Linux中文编码乱码 vim shell svn
- leetcode 第20题<Valid Parentheses>(java)
- Elastic-Job项目源码分析4--为什么会有这么多的service?