Mobile: 135 8576 5961 / WeChat: IM_WILLIAM_C / Mail: william.chen.cn@outlook.com /
分类: 其他平台
2015-05-16 10:21:12
工作区域跟变量一样,是用来保存数据的。区别是变量只能从中保存一个数据。而工作区域可以存放多个。把多个数据合在一起就成工作区域了。下面我们来看看工作区域是如何定义的吧。定义有四种方法,如下:
1,直接定义
DATA: BEGIN OF WA_EKBE,
MATNR TYPE MARA-MATNR,
MAKTX TYPE MAKT-MAKTX,
END OF WA_EKBE.
上面是以BEGIN和END关键字开始,在其中的就是其工作区域的内容。它存放的内容也就是这两个。
2,参照表或结构
DATA: WA_LFA1 TYPE LFA1.
DATA: WA_LFA2 TYPE ZXXEKBE_S01.
上面就是定义WA_LFA1的结构跟表LFA1一样,WA_LFA2的结构跟结构ZXXEKBE_S01一样。
3,如何我们定义的结构一部分是结构,一部分是自定义的变量的话,可以这么定义
DATA: BEGIN OF WA_EKBE.
INCLUDE STRUCTURE ZXXEKBE_S01.
DATA: EBELP TYPE EKKN-EBELP,
END OF WA_EKBE.
这样工作区域WA_EKBE的结构就是结构ZXXEKBE_S01加上EBELP了。
4,参看内部表
DATA L_WA_EKBE LIKE LINE OF IT_EKBE.
这里IT_EKBE是个内部表
上面就是工作区域的定义,注意工作区域只能存放一组数据,不像内部表可以存放N组,为什么要定义这个东西呢,它是为了后面我们处理内部表服务的。
里存放数据的不是数组,而是内部表。我们从DB里把数据取出来就是放在内部表里的。然后通过对内部表的数据进行处理,最后再显示出来的。处理的时候是通过LOOP循环把内部表的数据放到。然后一个一个的时行处理。下面我们来看看内部表吧。
2,参照DB表
二,
2,SORTED 内部表。定义的方法如下 3,HASHED内部表。定义的方法如下
DATA IT_MAKT TYPE HASHED TABLE OF MAKT WITH UNIQUE KEY MATNR.
常用的还是第一种STANDARD内部表
下面具体说一下这工作区,内表和标题行
先是用TYPES关键字定义一个行(row)的类型.如下:
然后是声明一个work area:
DATA wa TYPE line.
接着是声明一个每一行的类型是line的internal table:
有一下两种方式操作itab:
还有一种声明内表的方法: 写到这里发现,归根到底就是TYPES和DATA这两个关键字的区别和有无OCCURS的区别 当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(header line),这是一个隐式的(implicit) 的工作区,当然在你定义内表的时候也可以选择无标题行。那么这个工作区是做什么用的呢?因为在对内表操作时,比如增加或者取回一条记录.我们必须暂时保存这条记录,而这条记录就保存在工作区里。来看一个例子:
data: begin of itab occurs 10, Itab是一个内表,且有标题行(也有这样的理解:直接定义了内表itab,不使用工作区,系统自动产生同名工作区(itab)来处理数据,这总说法可能不容易能理解),这里所说的同名工作区即指标题行。 再看一个显示的(explicit)声明一个工作区: data: wa_itab like itab。 用SAP library的说法,如果一个内表有标题行,则对其进行操作的ABAP语句会简洁一些,因为这些语句会自动认为标题行是一个隐式的工作区,来看下SAP library的例子:
但是这种用隐式的工作区简洁的写法的代码很难理解(系统对于隐式工作区的处理),所以还是定义另外一个不同名的工作来使用易于理解。 到这里相信你对于标题行和工作区的理解已经清楚了。来总结一下:标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行,用于存放被操作的纪录,是内表的缺省的工作区。 再回头看下一个没有标题的内表: data: itab1 like itab occurs 10. 类似这种like/like table of 定义的内表 如没有用with header line(声明标题行)则没有标题行。 那么occurs n 又是怎么回事呢? 因为在定义内表时系统会给你的内表分配空间,而occurs 就是用来定义这个大小的。 例如:当你知道可能每次用Select命中或交换的纪录数N时,可指明 occursN. 但如用occurs0声明时, buffers 由系统自动分配。 |