【ABAP】-工作区,内表,标题行

工作区=多个变量的组合,理解为用于存储单行数据

工作区跟变量一样,是用来保存数据的。区别是变量只能从中保存一个数据。而工作区可以存放多个。把多个数据合在一起就成工作区了。下面我们来看看工作区是如何定义的吧。定义有四种方法,如下:

1、直接定义

DATA: BEGIN OF WA_EKBE,

MATNR TYPE MARA-MATNR,

MAKTX TYPE MAKT-MAKTX,

END OF WA_EKBE.

上面是以BEGIN和END关键字开始,在其中的就是其工作区的内容。它存放的内容也就是这两个MATNR 和 MAKTX。

2、参照表或结构

DATA: WA_LFA1 TYPE LFA1.

DATA: WA_LFA2 TYPE ZXXEKBE_S01.

上面就是定义WA_LFA1的结构跟表LFA1一样,WA_LFA2的结构跟结构ZXXEKBE_S01一样。

3、如何我们定义的结构一部分是结构,一部分是自定义的变量的话,可以这么定义

DATA: BEGIN OF WA_EKBE.

INCLUDE STRUCTURE ZXXEKBE_S01.

DATA: EBELP TYPE EKKN-EBELP,

END OF WA_EKBE.

这样工作区域WA_EKBE的结构就是结构ZXXEKBE_S01加上EBELP了。

4、参看内部表

DATA L_WA_EKBE LIKE LINE OF IT_EKBE.

这里IT_EKBE是个内部表

上面就是工作区域的定义,注意工作区域只能存放一组数据,不像内部表可以存放N组,为什么要定义这个东西呢,它是为了后面我们处理内部表服务的。

内部表:用于存放数据的,数据库中取值后,存于内标中

ABAP代码中里存放数据的不是数组,而是内部表。我们从DB里把数据取出来就是放在内部表里的。然后通过对内部表的数据进行处理,最后再显示出来的。处理的时候是通过LOOP循环把内部表的数据放到工作区域。然后一个一个的时行处理。下面我们来看看内部表吧。

一、内部表的定义

1、参照工作区域,前面先定义好工作区域。

DATA IT_EKBE LIKE TABLE OF WA_EKBE.

2、参照DB表

DATA: WA_LFA1 TYPE LFA1.

那么我们就可以这样定义内部表

DATA IT_LFA1 TYPE TABLE OF LFA1.

DATA IT_LFA1 LIKE TABLE OF WA_LFA1.

上面两种定义的方法是相同的。

二、内部表的类型

1、STANDARD一般类型常用内部表。定义的方法如下

DATA IT_EKKO TYPE STANDARD TABLE OF EKKO (WITH NON-UNIQUE KEY EBELN.).

这个是基本型,STANDARD 一般情况下是可以省略的。查询语句查询此表时是从第一个数开始按顺序开始查的,所以其效率不是很高。可以用LOOP把所有的数据都找出来。可以在后面指定WITH NON-UNIQUE KEY EBELN

2、SORTED排序内部表。定义的方法如下

DATA IT_EKPO TYPE SORTED TABLE OF EKPO WITH NON-UNIQUE KEY EBELN EBELP.

查询的时候此类表会根据KEY值排序,然后进行二分法查询,所以其效率很好。上面的NON-UNIQUE换成UNIQUE也是一样的。

3、HASHED哈希内部表。定义的方法如下

DATA IT_MAKT TYPE HASHED TABLE OF MAKT WITH UNIQUE KEY MATNR.

查询此类表的时候会用哈希算法进行查询,所以其效率也是高的,这种表定义的时候KEY 是必须的。这种表只能被用来让READ读取,此表还有一个特征就是表内的数值为以KEY为单位进行合计。

常用的还是第一种STANDARD内部表

下面具体说一下这工作区,内表和标题行

先是用TYPES关键字定义一个行(row)的类型.如下:

TYPES: BEGIN OF line,

field1 TYPE i,

field2 TYPE i,

END OF line.

这里的line,就相当于一个自定义的类型,表示一行(row)的字段(field).

这里一行有两个字段field1和field2.

然后是声明一个work area:

DATA wa TYPE line.

接着是声明一个每一行的类型是line的internal table:

DATA itab TYPE line OCCURS 0.

在这暂时把OCCURS作为了区别工作区和内表的标志.

当我们用以上这个方法来声明一个iternal table时,可以选择是否有无header line.

上面这句就是没有header line的.改成如下就有了:

DATA itab TYPE line OCCURS 0 WITH HEADER LINE.

有无header line的区别就是,header line可以当作一个work area来使用

有一下两种方式操作itab:

1).

wa-field1 = 1.

wa-field2 = 2.

APPEND wa TO itab.

2).

itab-field1 = 1.

itab-field2 = 2.

APPEND itab.

这里wa就是上面那个已经定义的work area.

有header line的时候,这两种都可以.

无header line的时候,只能用第1种.

第2种里,itab的意义是一个header line,而不是内表.

因为“DATA itab TYPE line OCCURS 0 WITH HEADER LINE.”这样的声明,

已经隐式声明了一个与内表同名的header line.

所以OCCURS用来声明内表可能造成二义性(ambiguous).

于是,OCCURS被认为是old的东西,采用一下方式声明一个内表比较好:

DATA itab TYPE STANDARD TABLE OF line.

还有一种声明内表的方法:

DATA: BEGIN OF itab OCCURS 0,

field1 TYPE i,

field2 TYPE i,

END OF itab.

这样的itab就自动有了一个同名的header line.

好像不会有 WITHOUT HEADER LINE 或者 NOT WITH HEADER LINE 这样的用法…

如果没有OCCURS 0,比如这样:

DATA: BEGIN OF itab,

field1 TYPE i,

field2 TYPE i,

END OF itab.

那么这个itab就不是内表,只是一个structure,可以作为itab的work area.

写到这里发现,归根到底就是TYPES和DATA这两个关键字的区别和有无OCCURS的区别

当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(header line),这是一个隐式的(implicit) 的工作区,当然在你定义内表的时候也可以选择无标题行。那么这个工作区是做什么用的呢?因为在对内表操作时,比如增加或者取回一条记录.我们必须暂时保存这条记录,而这条记录就保存在工作区里。来看一个例子:

data: begin of itab occurs 10,

ab type c,

cd type i,

end of itab.

Itab是一个内表,且有标题行(也有这样的理解:直接定义了内表itab,不使用工作区,系统自动产生同名工作区(itab)来处理数据,这总说法可能不容易能理解),这里所说的同名工作区即指标题行。

再看一个显示的(explicit)声明一个工作区:

data: wa_itab like itab。

SAP library的说法,如果一个内表有标题行,则对其进行操作的ABAP语句会简洁一些,因为这些语句会自动认为标题行是一个隐式的工作区,来看下SAP library的例子:

Operations without header line

Operations with header line

Operations for all Table Types

INSERT INTO TABLE .

INSERT TABLE ITAB.

COLLECT INTO .

COLLECT .

READ TABLE … INTO .

READ TABLE …

MODIFY TABLE FROM …

MODIFY TABLE …

MODIFY FROM …WHERE …

MODIFY … WHERE …

DELETE TABLE FROM .

DELETE TABLE .

LOOP AT ITAB INTO …

LOOP AT ITAB …

Operations for Index Tables

APPEND TO .

APPEND .

INSERT INTO …

INSERT …

MODIFY FROM …

MODIFY …

但是这种用隐式的工作区简洁的写法的代码很难理解(系统对于隐式工作区的处理),所以还是定义另外一个不同名的工作来使用易于理解。

到这里相信你对于标题行和工作区的理解已经清楚了。来总结一下:标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行,用于存放被操作的纪录,是内表的缺省的工作区

再回头看下一个没有标题的内表:

data: itab1 like itab occurs 10.

类似这种like/like table of 定义的内表 如没有用with header line(声明标题行)则没有标题行。

那么occurs n 又是怎么回事呢?

因为在定义内表时系统会给你的内表分配空间,而occurs 就是用来定义这个大小的。

例如:当你知道可能每次用Select命中或交换的纪录数N时,可指明 occursN. 但如用occurs0声明时, buffers 由系统自动分配。

(以上内容非本人原创,一本ABAP学习笔记中看到,如果侵权,随时联系)

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自律的Drew.Dong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值