ABAP

2018-10-31 11:01

2008年01月23日

ABAP 内表(internal table) 标题行(header line) 工作区(work area) 简介

- [SAP]

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://zhouwubin.blogbus.com/logs/14351256.html

刚开始学ABAP的时候,学到iternal table时,感觉一阵混乱.

搞不清楚什么是work area,什么是header line,以及occurs是干什么用的. 今天终于差不多搞明白了(我还是太弱啊...BS自己一下) 所以还是记录下来..省得自己以后再忘记...

先是用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,而不是内表.

因为\这样的声明, 已经隐式声明了一个与内表同名的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的区别.

这样一想,简单明了~~

作者:Maoting.xia 时间:2010-4-30 9:30

这几天一直在跟同事讲内表和工作区的问题,网上介绍这方面的资料也比较多,今天顺便就这个问题整理下了自己的思路,希望对您在这个问题上有所帮助。

1、首先,我们应该先了解下:内表(internal table) 标题行(header line) 工作区(work area) 这三个不同概念(具体定义请自行查找,这里只讲思路)。在当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(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 INSERT INTO TABLE . COLLECT INTO . READ TABLE … INTO . MODIFY TABLE FROM … MODIFY FROM …WHERE … DELETE TABLE FROM . LOOP AT ITAB INTO … APPEND TO . INSERT INTO … MODIFY FROM … Operations with header line INSERT TABLE ITAB. COLLECT . READ TABLE … MODIFY TABLE … MODIFY … WHERE … DELETE TABLE . LOOP AT ITAB … APPEND . INSERT … MODIFY … Operations for all Table Types Operations for Index Tables 但是这种用隐式的工作区简洁的写法的代码很难理解(系统对于隐式工作区的处理),所以还是定义另外一个不同名的工作来使用易于理解。

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

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

Tags: ABAP

发表于: 星期五, 04月 30th, 2010 9:46 am 归类于:ABAP , 默认文章分类 Trackback:

http://scnblogs.techweb.com.cn/xmtcanfly/archives/2.html/trackback

ABAP读书笔记--工作区和内表select优化

ABAP开发 2009-11-06 16:18:28 阅读159 评论0 字号:大中小

1、ST05是用于在开发ABAP程序时,对应事务码取得的字段是“数据结构”而不是“透明表”的时候,通过

ST05的“SQL跟踪”来获得相关“Select”的语句;一般查看“REC”列耗时比较多的“Select”语句; 2、跟踪时如果有涉及到“数量”这类有对数据表进行更新或插入操作的,则直接去查Update和Insert的SQL

语句;

3、在跟踪后,直接双击“对象名”列的名称,点选“表格字段”转到“SE11”的表字段表;

4、ABAP程序开头的Tables:“数据表名”,只有在屏幕中有用到的表,才需要声明;在程序中用到的表则不

需要进行在Tables内声名;

5、抓SAP“文本”字段的数据,要先自定义变量,然后通过SE37的函数“FUNCTION ?ZREAD_TEXT?”取回

文本数据;

6、新建的ABAP程序,在测试运行的时候要先进行“激活”,才能测试运行;

7、SE93:把ABAP写好的程序指定一个事务码执行;

8、abap引号内的字符??必须要是大写;

9、ABAP select 里面的语句,不能像mssql有那么丰富的函数使用,需要导到内表后再对数据进行操作;

10、?EQ?是单个数据值,?BT?是between区间的意思。

11、在写select inner join 里面,要注意是否需要加上销售组织的条件;on 条件1 and 销售组织条件。

12、SELECTION-SCREEN,里面有两个子项,PARAMETERS和select-options。

PARAMETERS一般是用于必输项的屏幕参数设置,如果这个参数不是必输项的,就要用select-options。在select ...where条件里,用PARAMETERS的条件语法是“数据字段 = 屏幕字段”;而select-options的

条件语法是“数据字段 in 屏幕字段”。

13、在where判断一个日期型数据是空,不是DEAKT = ??,也不是DEAKT is initial,而应该写成DEAKT

= ?00000000? (8个0)。

14、一对多的inner join,如果取出的数据有重复,前面加上distinct,用法和MSSQL相同。 15、sy-subrc,指上一个语句执行是否成功;执行成功返回0,执行不成功返回非0。用if判断。 16、如果一个语句中,该名称同时可能代表内表或者同名表工作区,则需要在内表名称之后加“[]”指明当前操作的是内表对象。不提倡使用带有表头行的内表,而是应该总是声明结构相同的其他数据对象作为显示

工作区进行内表行操作。 come from a PLMM blog , thank you

: http://space.flash8.net/space/?177700/action_viewspace_itemid_284523.html

如何调整ABAP程序的性能(copy)

1、使用where语句

不推荐 Select * from zflight.

Check : zflight-airln = ?LF? and zflight-fligh = ?BW222?.

Endselect. 推荐

Select * from zflight where airln = ?LF? and fligh = ?222?.

Endselect.


ABAP.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:焦作市人民政府关于市区棚户区改造的意见

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: