zoukankan      html  css  js  c++  java
  • 工作区、内表的定义与区别

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

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

    *定义工作区. 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 来定义,这时系统自动分配空间。

  • 相关阅读:
    实验九:异常的抛出、捕获并处理
    声明圆锥体类,实现Area和Volume接口,计算表面积和体积,按体积比较大小。
    实验7:Student类继承Person类,并增加查找,统计功能
    类的封装:实现银行账户信息的开户,存款,取款,查询,销户操作
    输入包含十个整形类型数据的数组,将其升序排序,并输出其中的素数
    采用两个一维数组输出等腰三角形的杨辉三角
    log4net
    分页
    C#多线程编程(1):线程的启动
    把一个项目a生成后放在另一个项目b使用(b项目是例子中的ScreenWebPage_Tool)
  • 原文地址:https://www.cnblogs.com/zuoting-haoxue/p/8086400.html
Copyright © 2011-2022 走看看