OCCURS和WITH HEADER LINE:
OCCURS是声明了一个标准内表(abap3.0以前版本),而with header line是使这个标准内表同时带了同名工作区(即表头行)
REPORT demo_int_tables_append. * append ... to data: BEGIN OF wa ,
col1(1) TYPE c, col2 TYPE i, END OF wa.
*DATA itab LIKE standard table of wa.
*DATA itab LIKE standard table of wa with header line.
*the specification \types.
*DATA itab like wa with header line. DATA itab like wa occurs 0. **下边代码会产生错误,因为上面定义的内表itab不带工作区(表头行) *一个表肯定不能直接write出字段 *write : / itab-col1, itab-col2. DO 3 TIMES.
wa-col1 = sy-index. wa-col2 = sy-index ** 2. APPEND wa TO itab. ENDDO.
*itab和itab[]都代表内表itab,虽然内表itab不带表头行 LOOP AT itab INTO wa.
WRITE: / wa-col1, wa-col2. ENDLOOP.
loop at itab[] into wa. write: / wa-col1,wa-col2. endloop.
因为有了同名工作区而产生的问题:
----------------itab 和itab[]
REPORT demo_int_tables_append . * append ... to DATA: BEGIN OF wa ,
col1(1) TYPE c, col2 TYPE i, END OF wa.
DATA itab LIKE standard table of wa with header line. DO 3 TIMES.
itab-col1 = sy-index. itab-col2 = sy-index ** 2. APPEND itab. ENDDO.
LOOP AT itab.
WRITE: / itab-col1, itab-col2. ENDLOOP.
*不是说带表头行的内表,itab代表表头行(工作区),itab[]才代表内*表吗?
*在loop at循环中itab就代表内表,而不是表头行(工作区) *因为表头行(工作区)就一行,所以不需要也不能loop循环 loop at itab into wa.
write: / wa-col1,wa-col2. endloop.
*不管什么时候itab[]都代表内表本身 loop at itab[] into wa. write: / wa-col1,wa-col2. endloop.
*在不在loop循环中的时候才是itab代表表头行,而itab[]代表内表本身 *就如后边要讲的 move itab to jtab 与 move itab[] to jtab[]的区别 write : / itab-col1, itab-col2.
同名的工作区的小例子:
1.读取内表数据时候,用了同名工作区做中转站
REPORT demo_int_tables_append . * append ... to
*occurs是ABAP3.0之前声明内表的关键字 *这样声明即定义了一个内表WA,
*同时WA又带了一个同名的工作区(itab[]代表内表,itab代表工作区) DATA: BEGIN OF itab occurs 10, col1(1) TYPE c, col2 TYPE i, END OF itab. DO 3 TIMES.
itab-col1 = sy-index. itab-col2 = sy-index ** 2. APPEND itab. ENDDO.
itab-col1 = 'x'. itab-col2 = 100.
*输出工作区itab中的数据
WRITE: / itab-col1, itab-col2. skip.
*loop后边的不管是itab[],还是itab都是内表,
*因为工作区(表头行)只有一行,所以是不用循环读取的, *下边的itab是个带工作区(表头行)的内表,
*所以它循环读取的时候是用自己的同名工作区来做中转站的. LOOP AT itab.
WRITE: / itab-col1, itab-col2. ENDLOOP. skip.
*输出工作区itab中数据
WRITE: / itab-col1, itab-col2.
2.读取内表数据时没有用同名工作取做中转站,而是用的另外定义的工作区wa
REPORT demo_int_tables_append .
* append ... to
*occurs是ABAP3.0之前声明内表的关键字 *这样声明即定义了一个内表WA,
*同时WA又带了一个同名的工作区(itab[]代表内表,itab代表工作区) DATA: BEGIN OF itab occurs 10, col1(1) TYPE c, col2 TYPE i, END OF itab. *定义工作区wa
data:wa like itab. DO 3 TIMES.
itab-col1 = sy-index. itab-col2 = sy-index ** 2. APPEND itab. ENDDO.
itab-col1 = 'x'. itab-col2 = 100.
*输出工作区itab中的数据
WRITE: / itab-col1, itab-col2. skip.
*loop后边的不管是itab[],还是itab都是内表,
*因为工作区(表头行)只有一行,所以是不用循环读取的, LOOP AT itab into wa.
WRITE: / wa-col1, wa-col2. ENDLOOP. skip.
*输出工作区itab中数据
WRITE: / itab-col1, itab-col2.
初始化内表:
初始化内表的作用是清空内表所有的数据行,将内表恢复到填充或赋值之前的状态。初始化内表要注意的问题仍然是初始化有表头行和无表头行的内表的区别,以及初始化内表和表头行的区别。
1. Clear 用法:clear itab 。“这样做将清空内表中所有
数据,同时清空该内表的表头行中的所有数据。如果想只清空内表中数据,而保留表头行中数据,则应该用clear itab[]。”上边的话是《
SAP程序设
计》中135页的话,其实是错误的。正确的应该是:对与一个有工作区的内表itab,clear itab清空的是工作区,而不清空内表;clear itab[]是清空内表,而不清空工作区。
REPORT demo_int_tables_append . * append ... to DATA: BEGIN OF wa ,
col1(1) TYPE c, col2 TYPE i, END OF wa.
DATA itab LIKE standard table of wa with header line. DO 3 TIMES.
itab-col1 = sy-index. itab-col2 = sy-index ** 2. APPEND itab. ENDDO.
LOOP AT itab.
WRITE: / itab-col1, itab-col2. ENDLOOP.
skip.
*不是说带表头行的内表,itab代表表头行(工作区),itab[]才代表内表吗?
*在loop at循环中itab就代表内表,而不是表头行(工作区) loop at itab into wa.
write: / wa-col1,wa-col2. endloop. skip.
*不管什么时候itab[]都代表内表本身 loop at itab[] into wa. write: / wa-col1,wa-col2. endloop. skip.
*在不在loop循环中的时候才是itab代表表头行,而itab[]代表内表本身 write : / itab-col1, itab-col2. skip.
*对与有表头行的内表,clear itab 和 clear itab[]的区别 clear itab. clear itab[]. LOOP AT itab.
WRITE: / itab-col1, itab-col2. ENDLOOP.
*下边会多输出一个零,是工作区中的默认值(字符型默认值为空,数值型默认值为0)
write : / itab-col1, itab-col2.
2. Refresh
Free
这两个关键字的作用基本相同,都是只能清空内表中的数据,而不能清空内表同名工作区中的数据。区别就是refresh并不会同时将预先分配给内表的内存释放,而free则同时释放了预先分配给内表的内存(默认的是8K)。clear也不释放掉内存。
REPORT demo_int_tables_append .
* append ... to * 定义工作区wa DATA: BEGIN OF wa,
col1(1) TYPE c, col2 TYPE i,
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库内表的操作(2)在线全文阅读。
相关推荐: