现在的位置: 首页 > 综合 > 正文

ABAP 内表总结-2 整体内表的操作

2013年12月13日 ⁄ 综合 ⁄ 共 7903字 ⁄ 字号 评论关闭

一、内表是什么

 

 

用处:当程序中处理有固定结构的数据时候,就需要使用内表,特别是内表是在程序中存储数据库表的载体

内表:Internal memory table 内存中的表,是外设(屏幕、磁盘,打印机等)和数据库表数据交换的中介。

 

 

注意:  在ABAP语言中不提供二维数组,内表相当于二维数组, 它是一个表示内存的二维数据结构(m行*n列)。与传统二维数组的区别,二维数组的m*n 在编译期就已经确定多少个房间了,而内表的行数量是可以动态拓展的.

     

 

 

二、内表的属性

 

      内表和其他ABAP数据结构一样,包括数据类型(data types)和数据对象(data objects)。内表类型是内表在程序或者字典库(ABAP dictionary)的抽象描述,可以用内表类型来创建一个具体的内表对象。

 

         ABAP中有两种数据类型:内表和结构体(structure)。一个内表的数据类型包括:行类型(line type)、主键(key)、表类型(table type)。

 

          (一)、Line type 内表行类型 

1.         确定行类型 就是确定行中的 字段 和 字段类型

2.         用结构体 或 透明表 可以作为内表的 行类型

3.         内表可以当成数组.

4.         采用只有一个字段的结构体 或 一个不可再分的类型作为行类型,此内表就相当于一个数组

   (二)、Key definition.键定义(和主键很像)

1.      Table key 表键

2.      Table key:unique(唯一) / non-unique(不唯一,区别数据库,可以有重复记录)

3.       Components :构成键的字段,顺序敏感 , 顺序不同  table key也就不一样

 

   (三)、Data access type 数据访问类型

1.         Index access根据行号访问

2.         Key access 根据table key访问

 

 

 

 

 

 

三、内表的三种类型

 

 

 

 

1.         Standard table

      适合通过index访问表的每条记录情形。访问时间和表的记录数目大小成线性关系。

      访问: index access(推荐) , key access

       Table key: non-unique

2.         Sorted table

       适合当你输入记录时就根据主键排序的情形。

       天生就有排序的功能,插入数据后就会按照 table key排序

       访问: index access , key access(推荐)

       Table key: unique / non-unique

 

      

 

3.         Hashed table

 

       适合于通过主键来访问操作表的记录的情形。无论表记录的多少,访问时间是常量。当你想要创建一个类似数据库表的内表时,就使用Hashed table。数据量相当大时考虑用这种内表。

       访问: only key access

       Table key :unique.

      

 

 

 

 

四、内表的操作

 

 

 

(一)、创建内表

 

 

 

     DATA: BEGIN OF TY_OUTLIST,

         USER       LIKE  AGR_USERS-UNAME,         "用户名

         NAME       LIKE  ADRP-NAME2,              "用户姓名

         DEPART     LIKE  ADCP-DEPARTMENT,         "部门

         ROLENAME   LIKE  AGR_USERS-AGR_NAME,      "用户角色

         ROLETEXT   LIKE  AGR_TEXTS-TEXT,          "角色描述

       END OF TY_OUTLIST.

DATA: T_OUTLIST LIKE STANDARD TABLE OF TY_OUTLIST WITH HEADER LINE.

 

(二)、整个内表的操作

 

 

 

 

   1、内表赋值

 

内表的整体赋值

如果想一次 将内表的全 部内容复制 到另一内表 中,请使用 MOVE 语句或赋值 操作符 (=),用 法如下:

MOVE <itab1> TO <itab2>. 该语句等价于:

<itab2> = <itab1>.

 

 

report:zdz.

DATA: BEGIN OF LINE,

         COL1,

         COL2,

      END OF LINE.

DATA ETAB LIKE LINE OCCURS 10 WITH HEADER LINE.

DATA FTAB LIKE LINE OCCURS 10.

LINE-COL1 = 'A'. LINE-COL2 = 'B'.

APPEND LINE TO ETAB.

*因为ETAB是带表头行的,所以ETAB[]才是内表,ETAB是工作区

*所以 MOVE ETAB TO FTAB.会报错(类型不匹配)

MOVE ETAB[] TO FTAB.

LOOP AT FTAB INTO LINE.

   WRITE: / LINE-COL1, LINE-COL2.

ENDLOOP.

 

 

 

 

   2、内表初始化

 

 

 

    初始化内表的作用是清空内表所有的数据行,将内表恢复到填充或赋值之前的状态。初始化内表要注意的问题仍然是初始化有表头行无表头行的内表的区别,以及初始化内表和表头行的区别。

 

      (1).     Clear 用法:clear itab 。

 

正确的应该是:对与一个有工作区的内表itab,clear itab清空的是工作区,而不清空内表;clear itab[]是清空内表,而不清空工作区。

 

REPORT demo_int_tables_append .

* append ... to

DATA: BEGIN OF wa ,

        col1(1) TYPE c,

        col2 TYPE i,

      END OF wa.

DATA itab LIKE standard table of wa with header line.

DO 3 TIMES.

    itab-col1 = sy-index. itab-col2 = sy-index ** 2.

  APPEND itab.

ENDDO.

LOOP AT itab.

  WRITE: / itab-col1, itab-col2.

ENDLOOP.

skip.

*不是说带表头行的内表itab代表表头行工作区),itab[]才代表内表吗

*在loop at循环中itab就代表内表,而不是表头行(工作区)

loop at itab into wa.

  write: / wa-col1,wa-col2.

endloop.

skip.

*不管什么时候itab[]都代表内表本身

loop at itab[] into wa.

  write: / wa-col1,wa-col2.

endloop.

skip.

*在不在loop循环中的时候才是itab代表表头行itab[]代表内表本身

write : / itab-col1, itab-col2.

skip.

*对与有表头行的内表clear itab  clear itab[]的区别

clear itab.

clear itab[].

LOOP AT itab.

  WRITE: / itab-col1, itab-col2.

ENDLOOP.

*下边会多输出一个零,是工作区中的默认值(字符型默认值为空,数值型默认值为0)

write : / itab-col1, itab-col2.

 

(2) . Refresh和Free

 

这两个关键字的作用基本相同,都是只能清空内表中的数据,而不能清空内表同名工作区中的数据。区别就是refresh并不会同时将预先分配给内表的内存释放,free则同时释放了预先分配给内表的内存(默认的是8K)。clear也不释放掉内存。

 

REPORT demo_int_tables_append .

* append ... to

定义工作区wa

DATA: BEGIN OF wa,

        col1(1) TYPE c,

        col2 TYPE i,

      END OF wa.

*下边定义了一个内表itab,(no work area, no header line)

DATA itab LIKE standard TABLE OF wa with header line.

DO 3 TIMES.

    wa-col1 = sy-index. wa-col2 = sy-index ** 2.

  APPEND wa TO itab.

ENDDO.

LOOP AT itab INTO wa.

  WRITE: / wa-col1, wa-col2.

ENDLOOP.

itab-col1 = 'x'.

itab-col2 = 100.

*refresh和free一样都只是清空内表中数据,而不清工作区

refresh itab.

*free itab只是清空了内表中数据,没清空工作取中数据

*free itab.

*用if itab is not initial来判别内表工作区是否为空

if itab is not initial.

write / 'itab is not empty'.

endif.

*if itab[] is initial来判别内表是否为空

if itab[] is initial.

write / 'itab[] is  empty'.

endif.

write: / itab-col1,itab-col2.

 

 

 

 

  3、内表比较

 

  

 

“内表的表关键字在访问内表和内表排序中起着相当重要的作用,在内表定义语句中,使用WITH key指定内表关键字,该项为可选项,如果不指定,则系统会使用默认(标准)关键字,如果程序员指定,则有以下形式:

 

 

 

1.             如果内表行是结构体,则可以指定结构体中的某几个字段作为内表关键字,该字段不能是内表或者引用类型,但是可以是嵌套的结构体。

REPORT demo_structure.

 

types: BEGIN OF name,

         title(5)       TYPE c,

         first_name(10) TYPE c,

         last_name(10)  TYPE c,

       END OF name.

 

types: BEGIN OF mylist,

         client         TYPE name,

         number         TYPE i,

       END OF mylist.

DATA :list type table of mylist 

      with non-unique key number

      with header line.

 

     2.  如果内表的整行都是由基本类型字段组成,则可以将内表的整个行定义为表关键字。如果内表字段本身是结构化类型,则不宜指定整行作为关键字段。所以下边的做法是不好的。

 REPORT demo_structure.

 

types: BEGIN OF name,

         title(5)       TYPE c,

         first_name(10) TYPE c,

         last_name(10)  TYPE c,

       END OF name.

 

types: BEGIN OF mylist,

         client         TYPE name,

         number         TYPE i,

       END OF mylist.

DATA :list type table of mylist 

      with non-unique key table line

      with header line.

 

      3.如果不指定任何关键字,则系统会默认的选择关键字段。(扁平结构内表的默认关键字段为非数字和非内表的组件字段)如果内表行是由单个基本类型组成,则默认关键字为整个行。如果内表行中包含有内表类型字段,则没有默认关键字。

 

      4.关键UNIQUE KEY (不可以出现关键字相同的数据行)/ NON-UNIQUE KEY(可以出现关键字相同的数据行)是决定了内表中具有相同关键字的数据行是否可以重复出现,在标准内表中不能用UNIQUE KEY,而且不需要特别指定NON-UNIQUE KEY。所以这个关键字在标准内表中一般都不需要写。

REPORT:ZDZ.

DATA: BEGIN OF ITAB OCCURS 10,

         LAND(3)  TYPE C,

         NAME(10) TYPE C,

         AGE      TYPE I,

         WEIGHT   TYPE P DECIMALS 2,

      END OF ITAB.

ITAB-LAND = 'USA'. ITAB-NAME   = 'Nancy'.

ITAB-AGE  = 35.    ITAB-WEIGHT = '45.00'.

APPEND ITAB.

ITAB-LAND = 'USA'. ITAB-NAME   = 'Howard'.

ITAB-AGE  = 40.    ITAB-WEIGHT = '95.00'.

APPEND ITAB.

ITAB-LAND = 'GB'.  ITAB-NAME   = 'Jenny'.

ITAB-AGE  = 18.    ITAB-WEIGHT = '50.00'.

APPEND ITAB.

ITAB-LAND = 'F'.   ITAB-NAME   = 'Michele'.

ITAB-AGE  = 30.    ITAB-WEIGHT = '60.00'.

APPEND ITAB.

ITAB-LAND = 'G'.   ITAB-NAME   = 'Karl'.

ITAB-AGE  = 60.    ITAB-WEIGHT = '75.00'.

APPEND ITAB.

SORT ITAB.

LOOP AT ITAB.

   WRITE: / ITAB-LAND, ITAB-NAME, ITAB-AGE, ITAB-WEIGHT.

ENDLOOP.

SKIP.

SORT ITAB DESCENDING BY LAND WEIGHT ASCENDING.

LOOP AT ITAB.

   WRITE: / ITAB-LAND, ITAB-NAME, ITAB-AGE, ITAB-WEIGHT.

ENDLOOP.

 

在此创建有 表头行的内 表 ITAB 并用 5 行对其进行 填充。首先 根据其标准 关键字(LAND 和 NAME) 进行排序。 然后根据定 义为 LAND 和 WEIGHT 的排序关键 字进行排序 。一般排序 顺序定义为 降序,但对 于 WEIGHT, 定义为升序 。这就是为 什么在第二 个 SORT 语句之后包 含 NAME 字段“NANCY” 的行在包含 NAME 字段“HOWARD” 的行之前输出。

 

 

  4、内表排序

 

<itab1> <operator> <itab2> 

 

对于 <operator>, 可以使用 比较所有字段类型中的表格内 列出的所有 操作符

(EQ、 =、 NE、 <>、 ><、 GE、 >=、 LE、 <=、 GT、 >、 LT、 <)。

进行内表比 较的第一个 条件是它们 包含的行数 。内表包含 的行数越多 ,则内表就 越大。如果 两个内表行 数相同,则 逐行、逐个 组件进行比 较。如果表 格行的组件 本身就是内 表,则进行 递归比较。 如果使用等 于操作符以 外的操作符 ,则系统找 到一对不相 等的组件后 就立即停止 比较并返回 该结果。

对于有表头 行的内表, 则可在表格 名之后使用 方括号 ([]) 以将表格工 作区域和表 格体区别开来。

 

DATA: BEGIN OF LINE,
         COL1 TYPE I,
         COL2 TYPE I,
      END OF LINE.

DATA: ITAB LIKE LINE OCCURS 10,
      JTAB LIKE LINE OCCURS 10.

DO 3 TIMES.
   LINE-COL1 = SY-INDEX.
   LINE-COL2 = SY-INDEX ** 2.
   APPEND LINE TO ITAB.
ENDDO.

MOVE ITAB TO JTAB.

LINE-COL1 = 10. LINE-COL2 = 20.
APPEND LINE TO ITAB.

IF ITAB GT JTAB.
   WRITE / 'ITAB GT JTAB'.
ENDIF.

APPEND LINE TO JTAB.

IF ITAB EQ JTAB.
   WRITE / 'ITAB EQ JTAB'.
ENDIF.

LINE-COL1 = 30. LINE-COL2 = 80.
APPEND LINE TO ITAB.

IF JTAB LE ITAB.
   WRITE / 'JTAB LE ITAB'.
ENDIF.

LINE-COL1 = 50. LINE-COL2 = 60.
APPEND LINE TO JTAB.

IF ITAB NE JTAB.
   WRITE / 'ITAB NE JTAB'.
ENDIF.

IF ITAB LT JTAB.
   WRITE / 'ITAB LT JTAB'.
ENDIF.

其输出为:

ITAB GT JTAB

ITAB EQ JTAB

JTAB LE ITAB

ITAB NE JTAB

ITAB LT JTAB

在此创建两 个内表:ITAB 和 JTAB。 用 3 行填充 ITAB 并将其复制 到 JTAB 中。然后将 另一行附加 给 ITAB 并且第一个 逻辑表达式 测试 ITAB 是否大于 JTAB。 在将同一行 附加给 JTAB 之后,第二 个逻辑表达 式测试两个 表格是否相 等。然后将 另一行附加 给 ITAB ,第三个逻 辑表达式测 试 JTAB 是否小于或 等于 ITAB。 然后将一行 附加给 JTAB, 其此组件内 容与 ITAB 最后一行中 组件的内容 不相等。下 一逻辑表达 式测试 ITAB 是否与JTAB 不相等。从 中找到 ITAB 和 JTAB 不同之处的 第一个组件 是最后一个 表格行中的 COL1。 ITAB 是30 列而 JTAB 则是50 列。因此在 最后一个逻 辑表达式中 ,ITAB 小于 JTAB。

 

 

 

 5、内表属性

 

如果在处理过程中想知道内表一共包含多少行 ,或者想知道定义的 OCCURS 参数的大小 ,请使用 DESCRIBE 语句。

 

 

DATA: BEGIN OF LINE,

         COL1 TYPE I,

         COL2 TYPE I,

      END OF LINE.

DATA ITAB LIKE LINE occurs 10.

DATA: LIN TYPE I,

      OCC TYPE I.

DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.

WRITE: / LIN, OCC.

DO 1000 TIMES.

  LINE-COL1 = SY-INDEX.

  LINE-COL2 = SY-INDEX ** 2.

  APPEND LINE TO ITAB.

ENDDO.

DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.

WRITE: / LIN, OCC.

http://blog.csdn.net/wengyupeng/article/details/6568564

抱歉!评论已关闭.