zoukankan      html  css  js  c++  java
  • 内表

    1.内表有3种类型 :

       Standard:标准表

       Sorted:排序表

       Hashed:哈希表.

     

    2. 内表的定义:

        UNIQUE|NON-UNIQUE:指定关键字,只能应用于排序表或者哈希表。

        INITIAL SIZE n:指定初始化内表大小。

        WITH HEADER LINE:定义内表是否有表头。

        * DATA <内表名> TYPE <结构类型> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。

        * DATA <内表名> LIKE TABLE OF <内表或者透明表> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。

        * DATA: BEGIN OF itab OCCURS n,

                     ......

           END OF itab .

    例如:

    TABLESUSR21."参考某一透明表时,必须先引用定义
    TYPES:BEGIN OF EMP,
          NAME    LIKE  USR21-BNAME,
          TELNUM  LIKE  USR21-PERSNUMBER,
          ADDR    LIKE  USR21-ADDRNUMBER,
    END OF EMP.

    *参考结构定义一个初始化大小为10,并有HEADER LINE的内表.
    DATA:EMPTAB TYPE STANDARD TABLE OF EMP INITIAL SIZE 10 WITH HEADER LINE.

    *参考上例已建内表,定义大小为20并没有HEADER LINE的内表
    DATA:EMPTAB2 LIKE STANDARD TABLE OF EMPTAB INITIAL SIZE 20.

    *该方法定义初始化值为10,并有HEADER LINE的内表
    DATA:EMPTAB3 LIKE EMPTAB OCCURS 10.

    *定义一个排序表,以NAME为关键字,该内表中NAME字段数据不能生重复
    DATA:EMPTAB4 LIKE SORTED TABLE OF EMPTAB
          WITH UNIQUE KEY NAME INITIAL SIZE 10
          WITH HEADER LINE.

    *定义一个初始化值为0的哈希表
    DATA:EMPTAB5 LIKE HASHED TABLE OF EMPTAB
          WITH UNIQUE KEY NAME
          WITH HEADER LINE.

    3.内表的赋值

        内表分为有无HEADER LINE两种。对于有HEADER LINE的内表,可以通过填充HEADER LINE数据后或通过外部的Work Area向内表存储空间中追加数据,相关语法如下:

         APPEND (<work area> into) <ITAB>.

        对于没有HEADER LINE的内表,只能通表外部WORK AREA来传递数据,如下所示:

    TABLESUSR21.
    DATA:BEGIN OF EMP OCCURS 0,
          NAME    LIKE  USR21-BNAME,
          TELNUM  LIKE  USR21-PERSNUMBER,
          ADDR    LIKE  USR21-ADDRNUMBER,
    END OF EMP.

    EMP-NAME 'jery'.
    EMP-TELNUM '010-12345678'.
    EMP-ADDR 'beijin'.

    APPEND EMP."数据据被赋给内表HEADER LINE 后再APPEND 到表中最后一行.

     

       除了上面的赋值方法外,还可以通过OPEN SQL将数据表中的数据按条件查询是后放入内表中,如下所示:

    TABLESUSR21.

    DATA:BEGIN OF EMP OCCURS 0,
         NAME    LIKE  USR21-BNAME,
         TELNUM  LIKE  USR21-PERSNUMBER,
         ADDR    LIKE  USR21-ADDRNUMBER,
    END OF EMP.

    SELECT BNAME      AS NAME
           PERSNUMBER AS TELNUM
           ADDRNUMBER AS ADDR

    INTO TABLE EMP  FROM USR21."通过OPEN SQL将从数据表中抓

     

     

    4.内表的清空

       内表的清空包括以下4种模式:

    CLEAR  <ITAB>:仅清空HEADER LINE,对内表数据存储空间不影响。

    REFRESH <ITAB>:清空内表数据存储空间,对HEADER LINE不影响。

    PRFRESH <itab> FROM TABLE <datab>:清空内表存储空间,填充从数据库表所获数据。

    FREE <ITAB> :清空内表数据存储空间,对HEADER LINE不影响。

     例如:

    TABLESUSR21.
    DATA:BEGIN OF EMP OCCURS 0,
         NAME    LIKE  USR21-BNAME,
         TELNUM  LIKE  USR21-PERSNUMBER,
         ADDR    LIKE  USR21-ADDRNUMBER,
    END OF EMP.

    SELECT BNAME      AS NAME
           PERSNUMBER AS TELNUM
           ADDRNUMBER AS ADDR
    INTO TABLE EMP  FROM USR21.

    USR21-BNAME 'SANLLY'.
    REFRESH EMP FROM TABLE USR21."清空EMP的存储空间,并从USER中查找数据填充到内表

     

    5.INSERT (向内表插入数据)

    可按内表的具体字段向表中插入一行或多行数据,具休语法如下:

         INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx].

         INSERT [wa INTO|INITIAL LINE INTO] TABLE itab.

         INSERT LINES OF itab1 [FROM idx] [TO idx2] INTO itab2 [INDEX idx3].

    例如:

    TABLESUSR21.
    DATA:BEGIN OF EMP OCCURS 0,
         NAME LIKE USR21-BNAME,
    END OF EMP.

    DATA:EMPTAB1 LIKE EMP.
    DATA:EMPTAB2 LIKE EMP OCCURS 10.

    EMP 'JERY'.
    INSERT EMP INDEX 1."若内表有多行数据,该语句将新记录新增到第一行

    EMPTAB1 'TOM'.
    INSERT EMPTAB1 INTO TABLE EMP."将结构休中数据新增到内表

    SELECT BNAME AS NAME INTO TABLE EMPTAB2 FROM USR21.
    INSERT LINES OF EMPTAB2 FROM 10 INTO EMP."将数据表EMPTAB2从第10行开始的所有数据插入到表EMP中

    6.MODIFY(直接修改内表数据)

       按内表位置或具体内表字段值等条件修改内表数据

      MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1...fn] WHERE cond.

    例如:

    TABLESUSR21.
    DATA:BEGIN OF EMP OCCURS 0,
         NAME    LIKE  USR21-BNAME,
         TELNUM  LIKE  USR21-PERSNUMBER,
    END OF EMP.

    SELECT BNAME AS NAME
           PERSNUMBER AS TELNUM
    INTO TABLE EMP FROM USR21.

    EMP-NAME 'Jery'.
    EMP-TELNUM '010-123456'.
    MODIFY EMP INDEX 1."修改内表第一行数据为设定值

    EMP-TELNUM '0755-123456'.
    MODIFY EMP TRANSPORTING TELNUM WHERE NAME 'tom'."查找内表中NAME等于TOM的数据,并按设定修改其TELNUM字段,有多行值时会同时修改。

     

    7.COLLECT(内表数据的分类汇总)

       将内表中相同的字段合并,若有类型为I的字段,则将其值加总。

        COLLECT [wa INTO] itab.

    例如:
    TYPES:BEGIN OF COMPANY,
           NAME(20TYPE C,
           SALES    TYPE N,
    END OF COMPANY.

    DATACOMP    TYPE COMPANY,
          COMPTAB TYPE COMPANY OCCURS 0.

    COMP-NAME 'MOBILE'.
    COMP-SALES 10.
    COLLECT COMP INTO COMPTAB.


    COMP-NAME 'NOTEBOOK'.
    COMP-SALES 20.
    COLLECT COMP INTO COMPTAB.

    COMP-NAME 'MOBILE'.
    COMP-SALES 30.
    COLLECT COMP INTO COMPTAB.

     

    輸出結果:

    NAME   |   SALES

    MOBILE   |   40

    NOTEBOOK   |   20

     

     

    8.SORT(內表數據排序)

      对内表进行排序,可以指定具体的排序字段、排序方式(升/降),语法如下:

      SORT itab [BY f2 f2...fn] [ASCENDING/DESCENDING]

       升序 sort itab (ascending),降序 sort itab descending.

     

     

    9.READ(读取内表数据)

      依据具体行数或字段值等条件读取某一内表的数据。

      READ TABLE itab FROM wa.

      READ TABLE itab WITH [TABLE] KEY k1=v1...kn=vn [BINARY SEARCH].

     READ TABLE itab INDEX i.

       使用READ操作的表必须有HEADER LINE作为查找出的数据存储窗口,BINARY SEARCH 可以提高内表数据查找的速度,但是使用前必须先对内表进行排序。

     

     

    10.LOOP…ENDLOOP(循环读取内表数据)

       循环读取内表数据,在循环中使用系统变量SY-TABIX可获取当前所执行的行数。

      LOOP AT ITAB FROM n1 TO n2.:读取内表具体行数间数据。

      LOOP AT ITAB WHERE logexp.:按具体字段条件读取内表。

    例如:
    TABLES:USR21.
    DATA:BEGIN OF EMP OCCURS 0,
         NAME   LIKE USR21-BNAME,
         TELNUM LIKE USR21-PERSNUMBER,
    END OF EMP.

    SELECT BNAME AS NAME
           PERSNUMBER AS TELNUM
    INTO TABLE EMP FROM USR21.

    LOOP AT EMP FROM TO 10."读取内表的第1到10行
      WRITE:EMP.
    ENDLOOP.

    LOOP AT EMP WHERE NAME 'IBM-ANNY'.
    WRITE:EMP.
    ENDLOOP.

     

     

    11. AT...ENDAT(设置内表循环触发条件)

      该语法为事件控制函数,应用于LOOP循环语句中,用于获取内表的数据变化事件。

       AT NEW f.:当某个字段数据与上一行数据值不同时触发该事件。

         AT END OF f.:当内表中某个字段当前行值与下一行值不同时触发该事件。

         AT FIRST.:当执行内表第一行时触发该事件。

       AT LAST.:当执行内表最后一行时触发该事件。

     

    12. AT…DELETE(删除内表数据)

    DELETE TABLE itab WITH TABLE KEY  k1 = v1…kn= vn. 按具体值刪除.

    DELETE TABLE itab FROM wa.  參照其他內表值刪除.

    DELETE  itab INDEX idx.  刪除具体行數据.

    DELETE  itab FROM idx1 to idx2.  删除具体行数范围间矩

    DELETE  ADJACENT  DUPLICATES   FROM itab.删除重复数据前必须先排序

     

     

    13.DESCRIBE(获取内表的具体属性)

    DESCRIBE TABLE itab LINES n : 获取内表当前总行数,n为整数类型。

    DESCRIBE TABLE itab OCCURS n: 获取内表初始化行数,n为整数类型。

    DESCRIBE TABLE  itab KIND K.获取内表类型T:Standard,  S:SORTED,  H:HASHED.

    例如:

    DATA:N1 TYPE I,
         N2 TYPE I,
         K  TYPE C.

    DATA:BEGIN OF EMP OCCURS 10,
         NAME   LIKE USR21-BNAME,
         TELNUM LIKE USR21-PERSNUMBER,
    END OF EMP.

    DESCRIBE TABLE EMP LINES N1"表中无数据,回执为0
    DESCRIBE TABLE EMP OCCURS N2."表初始化大小为10,回执为10
    DESCRIBE TABLE EMP KIND K.   "默认为STANDARD表,回执为T

  • 相关阅读:
    2021暑假模拟赛6
    2021暑假模拟赛5
    2021暑假模拟赛4
    2021暑假模拟赛3
    2021暑假模拟赛2
    umi提速方案之 mfsu
    Nginx (可为容器)配置 BasicAuth 与访问
    Mango 漫画管理器体验
    blivechat 在 OBS 中使用 BasicAuth URL 登录
    Electron 实现最小化到托盘
  • 原文地址:https://www.cnblogs.com/sanlly/p/3227369.html
Copyright © 2011-2022 走看看