好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

abap 解析内表、工作区、表头行的区别.doc

9页
  • 卖家[上传人]:第***
  • 文档编号:33478305
  • 上传时间:2018-02-15
  • 文档格式:DOC
  • 文档大小:66.50KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 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 line Operations 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 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: 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 : 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%’. [Page]Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’. Endse。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.