浅谈 ABAP 内表和工作区
http://scnblogs.techweb.com.cn/xmtcanfly/archives/2.html
作者:Maoting.xia
时间:2010-4-30 9:30
这几天一直在跟同事讲内表和工作区的问题,网上介绍这方面的资料也比较多,今天顺便就这个问题整理下了自己的思路,希望对您在这个问题上有所帮助。
1、首先,我们应该先了解下:内表(internal table) 标题行(header line) 工作区(work area) 这三个不同概念(具体定义请自行查找,这里只讲思路)。在当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(header line),这是一个隐式的(implicit) 的工作区,当然在你定义内表的时候也可以选择无标题行。那么这个工作区是做什么用的呢?因为在对内表操作时,比如增加或者取回一条记录.我们必须暂时保存这条记录,而这条记录就保存在工作区里。来看一个例子:
data: begin of itab occurs 10 with header line,
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 … |
但是这种用隐式的工作区简洁的写法的代码很难理解(系统对于隐式工作区的处理),所以还是定义另外一个不同名的工作来使用易于理解。
到这里相信你对于标题行和工作区的理解已经清楚了。来总结一下:标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行,用于存放被操作的纪录,是内表的缺省的工作区。
2、再回头看下一个没有标题的内表:
data: itab1 like itab occurs 10.
类似这种like/like table of 定义的内表 如没有用with header line(声明标题行)则没有标题行。
那么occurs n 又是怎么回事呢?
因为在定义内表时系统会给你的内表分配空间,而occurs 就是用来定义这个大小的。
例如:当你知道可能每次用Select命中或交换的纪录数N时,可指明 occurs N.
但如用 occurs 0 声明时, buffers 由系统自动分配。
3、针对网上有说:标题行相当于一个缓冲区(buffers) ,我不能苟同这种说法
因为我们只有在内表定义时是用 occurs 命令 系统才会分配buffers ,而工作区则没有。