左边啊

不努力,哪有光明

工作区、内表的定义与区别

首先说一下工作区与内表的组成关系,内表是由多个工作区组成的。工作区顾名思义,它是一个工作区间,可由多个变量组成的。只可以存放一组数据,这一组数据可以是由多个字段变量组成的。比如描述一个学生的基本信息有:学号、姓名、性别、年龄这些字段。此时工作区的只能存放一名学生的基本信息,而存放多名学生信息时就需要有内表来解决这个问题了。下面介绍一下工作区和内表的定义方法:

一、定义工作区有如下四种方法:

*定义工作区. EKBE采购订单历史,MARA常规物料数据,MAKT物料描述,EKKN 采购凭证中的帐户设置
*MATNR 物料编号,MAKTX 物料描述, EBELP 采购凭证项目编号

*---1、直接定义
*DATA: BEGIN OF WA_EKBE,
*  MATNR TYPE MARA-MATNR,
*  MAKTX TYPE MAKT-MAKTX,
*  END OF WA_EKBE.

*---2、参照表或结构   工作区WA_EKBE结构与表EKBE一样
*  DATA: WA_EKBE TYPE EKBE.

*---3、定义的工作区一部分是结构,一部分是自定义的  (这里是随便找的一个结构:存客户主数据的)
*DATA: BEGIN OF w a_ekbe.
*        INCLUDE STRUCTURE kna1_fs.
*DATA: ebelp TYPE ekkn-ebelp,
*END OF wa_ekbe.

*---4、参看内部表(需要现有个内表IT_EKBE)
DATA IT_EKBE TYPE TABLE OF EKBE.
DATA WA_EKBE LIKE LINE OF IT_EKBE.

 

 二、在ABAP中我们一般使用内表来存放数据的。我们从DB中将数据取出来放入内表中,然后通过对内表进行处理最后再显示出来。处理的时候一般通过LOOP循环将数据放到工作区中,然后一个一个进行行处理。

 

*****定义内表
*1、参照工作区,前面已经定义好工作区WA_EKBE
* DATA IT_EKBE LIKE TABLE OF WA_EKBE.

*2(1)、先用TYPES定义一个行(row)的类型
TYPESBEGIN OF line,
  field1 TYPE i,
  field2 TYPE i,
  END OF line.

*(2)、声明一个工作区
DATA wa TYPE line.

*(3)、声明内表
*  DATA IT_EKBE TYPE LINE OCCURS 0.
*  有HADER LINE 就是隐式声明了一个与内表同名的工作区,可以用来存取数据
DATA itab TYPE line OCCURS WITH HEADER LINE.

***对内表的操作有如下两种方式
*(1)没有HEADER LINE 时,只能用这一种
wa-field1 1.
wa-field2 2.
APPEND wa TO itab.

*(2)有无 HADER LINE 时都可以用这一种。 这里的 ITAB 相当一个工作区。
itab-field1 3.
itab-field2 4.
APPEND itab.

***还有一种定义内表的方式
**这样定义的内表自动有了一个同名的 HEADER LINE(标题行). 这里所说的同名工作区即是标题行。
DATABEGIN OF itab_two OCCURS 0,
  ab(8TYPE c,
  cd TYPE i,
END OF itab_two.

 

补充说明:

一、内部表的类型
1、STANDARD内部表。定义的方法如下
DATA  IT_EKKO  TYPE STANDARD TABLE OF EKKO (WITH NON-UNIQUE KEY EBELN.).
这个是基本型,STANDARD 一般情况下是可以省略的。查询语句查询此表时是从第一个数开始按顺序开始查的,所以其效率不是很高。可以用LOOP把所有的数据都找出来。可以在后面指定WITH NON-UNIQUE KEY EBELN 

2、SORTED  内部表。定义的方法如下
DATA  IT_EKPO  TYPE SORTED   TABLE OF EKPO WITH NON-UNIQUE KEY EBELN EBELP.
查询的时候此类表会根据KEY值排序,然后进行二分法查询,所以其效率很好。上面的NON-UNIQUE换成UNIQUE也是一样的。

3、HASHED内部表。定义的方法如下

DATA  IT_MAKT  TYPE HASHED   TABLE OF MAKT WITH UNIQUE KEY MATNR.
查询此类表的时候会用哈希算法进行查询,所以其效率也是高的,这种表定义的时候KEY 是必须的。这种表只能被用来让READ读取,此表还有一个特征就是表内的数值为以KEY为单位进行合计。

常用的还是第一种STANDARD内部表

二、定义内表有无HEADER LINE 时的区别:

用SAP library的说法,如果一个内表有标题行,则对其进行操作的ABAP语句会简洁一些,因为这些语句会自动认为标题行是一个隐式的工作区,来看下SAP library的例子:

Operations without header line

Operations with header line

Operations for all Table Types

INSERT 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 Tables

APPEND TO .

APPEND .

INSERT INTO …

INSERT …

MODIFY FROM …

MODIFY …

但是这种用隐式的工作区简洁的写法的代码很难理解(系统对于隐式工作区的处理),所以还是定义另外一个不同名的工作来使用易于理解。

总结:

1、标题行是一个和内表主题有着一样结构的字段的串,标题行只有一行,用来存放被操作的记录,是内表的缺省的工作区。

再回头看下一个没有标题的内表:

data: itab1 like itab occurs 10.

类似这种like/like table of 定义的内表 如没有用with header line(声明标题行)则没有标题行。

2、OCCURS 作用:

在定义内表时,系统会给你的内表分配存储空间,OCCURS 就是用来定义这个空间大小的。

当你知道SELECT 每次命中或交换的记录数为N 时,可以直接用 OCCURS N来定义;不知道所需的大小时,就用 OCCURS 0 来定义,这时系统自动分配空间。

posted on 2017-12-25 09:58  左佐佐  阅读(2740)  评论(1编辑  收藏  举报

导航