浅谈 ABAP 内表和工作区

来源:互联网 发布:淘宝严重违规48分申诉 编辑:程序博客网 时间:2024/05/21 08:54

浅谈 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 ,而工作区则没有。

原创粉丝点击