ABAP 开发系列(05): ABAP 内表与内表结构

2.内表和内表结构

2.1  结构体(Structure)

2.1.1 结构体的定义

ABAP 中可以定义结构来包含多个基本类型,便于整理及操作;

结构体不属于数据字典对象(数据字典中可以定义结构体,但不能存储数据),在程序运行时会被作为临时对象存储在内存空间;

在创建内表时,可参考直接定义的结构体作为内表结构

结构体的定义,可以通过两种方式实现:

 


1.第一种方式

语法:

DATA:  BEGIN OF <name>

<field1> . . .

<field2> . . .

. . .

END OF <name>.

 

如:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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>.

如:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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 … 语句将两个结构体之间相同字段自动匹配赋值:

abap_05_Structure_Set_Value

与基本变量定义类似,结构体的初始化操作也可以通过 CLEAR 语句实现。

如:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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]: 定义内表是否带表头;

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
*--------------------------------------------------------------------*
* 通过定义结构体并参考该结构定义内表
*--------------------------------------------------------------------*
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 向内表存储空间中追加数据。

abap_05_Internal_Table_With_Header_Line

 

对于没有HEADER LINE的内表,只能通过 外部Work Area来传递数据:

abap_05_Internal_Table_Without_Header_Line

语法:

①.APPEND [<Work Area> INTO] <ITAB>.

如:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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.)

01
02
03
04
05
06
07
08
09
10
11
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关键字根据具体行数或主键字段读取内表中的某行记录:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
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.

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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

 

或者直接从数据表取数汇总:

01
02
03
04
05
06
07
08
09
10
11
12
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 也为系统的全局变量;

用于在循环遍历内表时,当前记录的索引值:

1
2
3
4
5
6
7
8
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处数据记录

如:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
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

  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值