内表和工作区的区别

内表和工作区的区别在于工作区就相当于表头,只有一行。在定义内表需要OCCURS,工作区则不需要。

  如:
        定义一个内表
  DATA: BEGIN OF itab OCCURS 0,
                     ......
                     END OF itab.
        定义一个工作区:
  DATA: BEGIN OF itab,
                     ......
                     END OF itab.
        OCCURS是分配数据缓冲区,当你知道可能每次用SELECT命令中或交换的记录数时,可以OCCURS+具体数值。如果用OCCURS 0声明时,Buffers由系统自动分配。

先是用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.

我用C++(还是对cpp最有好感^^)的概念理解就是,

line是一个class,而wa是一个object. 

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

DATA itab TYPE line OCCURS 0.

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

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的区别. 

这样一想,简单明了~~ 

OCCURS 是在3.0以前申明内表的关键字。意思是内表初始的时候有多少行。现在不提倡使用。看到了认识就行。 

  

======================================================= 

ABAP Work Area & Header Line -

1. Difference between Work Area and Header Line

    工作区与标题行的不同之处

原文地址:

http://www.sap-img.com/abap/difference-between-work-area-and-header-line.htm

我翻译下,嘿嘿

在对内表进行一些操作的时候,比如增加或者取回一条记录.我们必须暂时保存这条记录.

这条记录就保存在内表的工作区里(work area).内表的工作区必须和内表有相同的结构.

内表由主体(body)和一个可选的标题行(head line)组成.

标题行是一个隐式的(implicit)工作区.在内表声明的时候,可以选择有无标题行.

e.g.

data: begin of itab occurs 10,

        ab type c,

        cd type i,

      end of itab.

这样的内表itab,是有标题行的.

data: wa_itab like itab.

这样的wa_itab是显式(explicit)声明的一个itab的工作区.

data: itab1 like itab occurs 10.

这样的内表itab1,是没有标题行的. 

标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行.

所以,标题行相当于一个缓冲区(buffer),用于存放被操作的纪录,是内表的缺省的工作区. 

2. Using Header Lines as Work Areas

    把标题行当工作区来使用

原文地址:  

http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb36a1358411d1829f0000e829fbfe/content.htm

我再翻译下...

当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(这个好像很奇特的样子么...).可以把这个标题行当作工作区来对内表进行操作.

如果一个内表有标题行,则对其进行操作的ABAP语句会简短一些,因为这些语句会自动认为标题行是一个隐式的工作区.语句的不同如下表: 

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 ... 

但是,用隐式的工作区,代码难以被理解,所以还是用一个不同名称的工作区比较好. 

sap abap---通过例子学习ABAP--初始化内表 清空内表

 

初始化内表的作用是清空内表所有的数据行,将内表恢复到填充或赋值之前的状态。初始化内表过程中需要注意之处仍然是初始化无 表头行内表和有表头行内表的区别,以及初始化内表和表头行的区别。 

(1)CLEAR    ITAB.       同时清空表头和行内表的值 

(2)CLEAR    ITAB.       只清空内表本身的值,保留表头行的值。 

(3)REFRESH I   TAB     只清空内表本身的值,保留表头行的值。 

(4)FREE    ITAB.            只清空内表本身的值,保留表头行的值。 

DATA: BEGIN OF line,

         col1(1) TYPE c,

         col2(1) TYPE c,

END OF line.

DATA itab LIKE TABLE OF line WITH HEADER LINE.

line-col1 = 'A'. line-col2 = 'B'.

APPEND line TO itab.

loop at itab.

write : itab-col1.

endloop.

clear itab.  "在这里可以尝试CLEAR ITAB[],FREE ITAB,REFRESH ITAB,看看效果是不是如上所说这样。

IF itab IS INITIAL.

WRITE 'ITAB is empty'.

ENDIF. 

  

  

很多程序BUG,就是这一类 不起眼的东西引起的~

*********************************************************************

*-------- Clear & Refresh Internal Table. -------------------------

*********************************************************************

1. with headerline.

CLEAR itab.        : Clear the headerline of the Internal Table only.

CLEAR itab[].        : Clear the contents of the Internal Table except the headerline.

REFRESH itab.        : Same as CLEAR itab[].

REFRESH itab[].       : Same as CLEAR itab[].

2. without headerline. ( all four commands have same functionality )

CLEAR itab.        : Clear all contents of the Internal Table.

CLEAR itab[].        : Same as CLEAR itab.

REFRESH itab.        : Same as CLEAR itab.

REFRESH itab[].        : Same as CLEAR itab. 

  

  

如何一次性的给内表的一列赋值,不用LOOP循环来做,比如把第一列都给设置成空. 

CLEAR 对应工作区清空

MODIFY 内表 FROM 内表对应工作区  

TRANSPORTING 修改字段 

WHERE 修改字段 <> SPACE. 

MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond

这句话的意思是凡是内表itab中满足条件cond的记录都被工作区wa的数据修改,修改的字段是f1...f

posted @ 2011-08-21 23:14  VerySky  阅读(2628)  评论(0)    收藏  举报