




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ABAP 内表(internal table) 标题行(header line) 工作区(work area) 简介 - SAP先是用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的区别. 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 lineOperations with header lineOperations for all Table TypesINSERT 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 TablesAPPEND TO .APPEND .INSERT INTO INSERT MODIFY FROM MODIFY 但是这种用隐式的工作区简洁的写法的代码很难理解(系统对于隐式工作区的处理),所以还是定义另外一个不同名的工作来使用易于理解。到这里相信你对于标题行和工作区的理解已经清楚了。来总结一下:标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行,用于存放被操作的纪录,是内表的缺省的工作区。 2、再回头看下一个没有标题的内表:data: itab1 like itaboccurs 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: /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 : /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. 2、使用聚合函数 不推荐 Maxnu = 0. Select * from zflight where airln = LF and cntry = IN. Check zflight-fligh maxnu. Maxnu = zflight-fligh. Endselect. 推荐 Select max( fligh ) from zflight into maxnu where airln = LF and cntry = IN.3、使用视图代替基本表查询 不推荐 Select * from zcntry where cntry like IN%. PageSelect single * from zflight where cntry = zcntry-cntry and airln = LF. Endselect. 推荐 Select * from zcnfl where cntry like IN% and airln = LF. Endselect.4、使用INTO table 代替select endselect 不推荐 Refresh: int_fligh. Select * from zflight into int_fligh. Append int_fligh. Clear int_fligh. Endselect. 推荐 Refresh: int_fligh. Select * from zflight into table int_fligh.5、使用批量修改内表代替逐行修改 不推荐 Loop at int_fligh. If int_fligh-flag is initial. Int_fligh-flag = X. Endif. Modify int_fligh. Endloop. 推荐 Int_fligh-flag = X. Modify int_fligh transporting flag where flag is initial.6、使用二分法查询,提高查询内表数据速度 不推荐 Read table int_fligh with key airln = LF. 推荐 Read table int_fligh with key airln = LF binary search.7、两个内表添加使用批量增加代替逐行 不推荐 Loop at int_fligh1. Append int_fligh1 to int_fligh2. Endloop. 推荐 Append lines of int_fligh1 to int_fligh2.8、使用table buffering Use of buffered tables is recommended to improve the performance considerably. The buffer is bypassed while using the following statementsSelect distinct Select for update Order by, group by, having clause Joins Use the Bypass buffer addition to the select clause in order to explicitly bypass the buffer while selecting the data.9、 使用FOR ALL Entries 不推荐 Loop at int_cntry. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. Append int_fligh. Endloop. 推荐 Select * from zfligh appending table int_fligh For all entries in int_cntry Where cntry = int_cntry-cntry.10、正确地使用where语句,使查询能使用索引When a base table has multiple indices, the where clause should be in the order of the index, either a primary or a secondary index To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that has the same order of the fields. One more tip is that if a table begins with MANDT, while an index does not, there is a high possibility that the optimizer might not use that index.11、正确地使用MOVE语句Instead of using the move-corresponding clause it is advisable to use the move statement instead. Attempt should be made to move entire internal table headers in a single shot, rather than moving the fields one by one.12、正确地使用inner joinLet us take an example of 2 tables, zairln and zflight. The table zairln has the field airln, which is the airline code and the field lnnam, which is the name of the airline. The table zflight has the field airln, the airline code and other fields which hold the details of the flights that an airline operates. PageSince these 2 tables a re logically joined by the airln field, it is advisable to use the inner join. Select aairln alnnam bfligh bcntry into table int_airdet From zairln as a inner join zflight as b on aairln = bairln. In order to restrict the data as per the selection criteria, a where clause can be added to the above inner join.13、使用sort by 代替order by14、避免使用SELECT DISTINCT语句 使用的 ABAP SORT + DELETE ADJACENT DUPLICATES 代替.定义内表与工作区最方便的方法*定义 名为 ITAB 的内表, 内表结构 参照表 TABLE 。DATA: ITAB TYPE TABLE OF TABLE. *定义 名为 WA 的工作区, 其 行结构与 内表 ITAB 相同 。DATA: WA LIKE LINE OF ITAB. -1.使用occurs 0,定义的不再是对象,而是internal table 2.使用with header line后缀,定义为internal table的同时也定义了一个同名对象,因此可以用以下语句: LOOP AT STH. WRITE: / STH. ENDLOOP. 3.TYPE后面接结构,LIKE后面接对象 4.OBLIGATORY为必输字段 5.DATA SEPARATER . = DATA SEPARATER TYPE C. 6.关于内表的结构描述,它的当前记录数据是放在header line中的,Occurs 是分配数据缓冲区,大小不重要,系统会自动分配。但定义内表不用occurs就需要用with header line,occurs语句记得是为了向下兼容。 7.occurs 指明的數量是有一點學問的. 1.當你知道可能每次用Select命中或交換的紀錄數xxx時,可指明 occurs xxx. 2.如用occurs 0 聲明時, buffers 由系統自動分配. 8.SELECT在into时记得一般都要加上table,不然是into一个工作区,即wa,而工作区要写入内表,则需要再append,所以直接定放内表即可,内表和工作区的区别就在于工作区就相当于表头,是有一行,data定义begin of itab时不加occurs就是工作区,加了就是内表,occurs *,后面表示
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB61T 509.4-2011 秦岭猪苓菌种
- DB61T 382.7-2018 魔芋标准综合体 第7部分:魔芋林下栽培技术规程
- 江西省抚州市南城县第一中学2025年数学高三第一学期期末经典试题
- 辽宁省阜新市2025-2026学年数学高三上期末综合测试试题
- 2025秋九年级上册历史上课课件 第1课 古代埃及
- 药物质量标准制定
- 法宣知识竞赛试题及答案
- 2025年河北张家口涿鹿县硕博人才引进9名考试参考试题及答案解析
- 2025云南省保山市昌宁县湾甸傣族乡招聘编外人员(1人)备考练习题库及答案解析
- 2025年甘肃陇南康县支持未就业普通高校毕业生到基层就业项目专场招聘会(75人)备考练习题库及答案解析
- T/QX 005-2021加油站油罐机械清洗作业规范
- T/CECS 10226-2022抗裂硅质防水剂
- 农村拆迁转让协议书
- 人教鄂教版科学 四年级上册 第一单元 多样的动物 单元教学解读
- 限制类医疗技术管理
- 新商标法修订解读:知识产权课件-商标法更新
- 食品行业标准化管理体系
- 快递驿站合作合同协议
- 街道文体中心管理制度
- 初中历年会考试卷及答案
- T-CNAS 18-2020 成人住院患者跌倒风险评估及预防
评论
0/150
提交评论