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

(二)、整个内表的操作

 

 

 

 

   1、内表赋值

 

内表的整体赋值

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

MOVE TO . 该语句等价于:

= .

 

 

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

 

正确的应该是:对与一个有工作区的内表itabclear 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、内表排序

 

   

 

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

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.

 

 

你可能感兴趣的:(ABAP)