zoukankan      html  css  js  c++  java
  • ABAP开发基础知识:内表(Internal Table)

    http://www.cnblogs.com/foxting/archive/2012/03/19/2406830.html
    内表与结构体基本类似,它同样是程序运行中被临时创建的一个存储空间,它是一个可包含多条记录的数据表。

        内表共有3种类型:

        1)Standard:标准表

        2)Sorted:排序表

        3)Hashed:哈希表,一般用的比较少

        本篇文件将重点介绍Standart型内表的定义及功能

        1.内表的定义

        通过关键字DATA对内表进行创建,内一的定义可以直接参考结构体或者其它内表及透明表,也可以直接定义字段,其中关键字如下:

        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 [VALID BETWEEN f1 AND f2]。

        FOR EXAMPLE:

        TABLES:USER21.  “参考某一透明表时,必须先引用定义。类型于C#的USING。

        TYPES:BEGIN OF EMP,

                  NAME LIKE USER21-BNAME,

                  TELNUM  LIKE USER21-PERSNUMBER,

                  ADDR  LIKE USER21-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 TMPTAB INITIAL SIZE 20.

        *该方法定义初始化值为10,并有HEADER LINE的内表

        DATA:EMPTAB3 LIKE EMPTAB OCCURS10.

         *定义一个排序表,以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 UNIQYE KEY NAME WITH HEADER LINE.

        通过第三种方式定义的内表可指定具体字段及初始化大小,默认内表存在HEADER LINE。

        TABLES:USER21.

        TYPES:BEGIN OF EMP OCCURS 0,

                 NAME LIKE USER21-BNAME,

          TELNUM   LIKE USER21-PERSNUMBER,

          ADDR  LIKE USER21-ADDRNUMBER,

          END OF EMP.

     

         2.内表的赋值

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

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

           FOR EXAMPLE:

           TABLES:USER21.

           DATA:BEGIN OF EMP OCCURES 0,

          NAME  LIKE USER21-BNAME,

          TELNUM  LIKE USER21-PERSNUMBER,

          ADDR  LIKE USER21-ADDRNUMBER,

           END OF EMP.

           EMP-NAME='JERY'.

           EMP-TELNUM='010-123888'.

       EMP-ADDR='BEIJING'.

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

     

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

           TABLES:USER21.

           DATA:BEGIN OF EMPTAB,

            NAME  LIKE USER21-BNAME,

          TELNUM  LIKE USER21-PERSNUMBER,

            ADDR  LIKE USER21-ADDRNUMBER,

            END OF TMPTAB.

            DATA:EMP LIKE STANDART TABLE OF EMPTAB.

            EMP-NAME='JERY'.

            EMP-TELNUM='010-123888'.

        EMP-ADDR='BEIJING'.

            APPEND EMPTAB TO EMP.  ”数据被赋给WORK AREA后再APPEND到表中。

     

           除了上述的赋值方式外,还可以通过OPEN SQL将数据表中的数据按条件查询后放入内表中,对于OPEN SQL的具体用法,将后在后面介绍。

           FOR EXAMPLE:

           TABLES:USER21.

           DATA:BEGIN OF EMP OCCURES 0,

                    NAME LIKE USER21-BNAME,

                    TELNUM  LIKE USER21-PERSNUMBER,

                    ADDR   LIKE  USER21-ADDRNUMBER,

           END OF EMP.

           SELECT BNAME AS NAME PERSNUMBER AS TELNUM  ADDRNUMBER   AS ADDR

           INTO TABLE EMP FROM USER21.  "通过OPEN SQL将从数据表中抓取的数据直接复制给内表。

     

          3.内表数据管理

          1.内表的清空

          对内表数据的清空共包括4种模式

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

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

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

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

          FOR EXAMPLE:

          TABLES:USER21.

          DATA:BEGIN OF EMP OCCURS 0,

                   NAME LIKE USER21-BNAME,

                   TELNUM  LIKE  USER21-PERSNUMBER,

                   ADDR  LIKE  USER21-ADDRNUMBER,

           END OF EMP.

           SELECT BNAME AS NAME PERSNUMBER AS TELNUM  ADDRNUMBER AS ADDR INTOTABLE EMP FROM USER21.

           USER21-BNAME='JERY'.

           REFRESH EMP FROM TABLE USER21. "清除EMP的存储空间,并从USER21中查找数据填充到内表。

           2.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].

           FOR EXAMPLE:

           TABLES:USER21.

           DATA:BEGIN OF EMP OCCURS 0,

                    NAME LIKE USER21-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 USER21.

          INSERT LINES OF EMPTAB2 FROM 10 INTO EMP."将数据表EMPTAB2从第10行开始的所有数据插入到表EMP中。

          

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

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

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

          FOR EXAMPLE:

          TABLES:USER21.

       DATA:BEGIN OF EMP OCCURS 0,

             NAME LIKE USER21-BNAME,

           TELNUM LIKE USER21-PERSNUMBER,

       END OF EMP.

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

           EMP-NAME='JERY'.

        EMP-TELNUM='010-888888'.

        MODIFY EMP INDEX 1."修改内表第一行数据为设定值

        

        EMP-TELNUM='0755-888888'.

           *查找内表中NAME等于TOM的数据,并按设定修改其TELNUM字段,有多行值时会同时修改。

           MODIFY EMP TRANSPORTING TELNUMBER WHERE NAME='TOM'.

     

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

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

            COLLECT [wa INTO] itab.

            FOR EXAMPLE:

            TYPES:BEGIN OF COMPANY,

                      NAME(20) TYPE C,

           SALES TYPE n,

        ENF OF COMPANY.

            DATA:COMP 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.

     

          5.SORT(内表数据排序)

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

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

     

        6.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 可以提高内表数据查找的速度,但是使用前必须先对内表进行排序。

     

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

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

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

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

           FOR EXAMPLE:

       TABLES:USER21.

       DATA:BEGIN OF EMP OCCURS 0,

          NAME LIKE USER21-BNAME,

          TELNUM LIKE USER21-PERSNUMBER,

       END OF EMP.

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

       *读取内表的1-10行数据。

           LOOP AT EMP FROM 1 TO 10.

        WRITE:EMP.

            ENDLOOP.

           *按NAME条件读取内表。

        LOOP AT EMP WHERE NAME='JERY'.

           WRITE:EMP.

        ENDLOOP.

     

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

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

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

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

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

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

     

        9.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.:删除重复数据,执行此条件前必须先排序。

     

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

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

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

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

           FOR EXAMPLE:

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

       DATA:BEGIN OF EMP OCCURS 10,

           NAME LIKE USER21-BNAME,

           TELNUM LIKE USER21-PERSNUMBER,

           END OF EMP.

           DESCRIBE TABLE EMP LINES N1. ”表中无数据,回执为0

           DESCRIBE TABLE EMP OCCURS N2. “表初始化大小为10,回执为10

       DESCRIBE TABLE EMP KIND K. ”默认为STANDARD表,回执为T

  • 相关阅读:
    最小生成树(二)Prim算法
    红黑树
    最短路径:Dijstra(迪杰斯特拉)算法
    30岁的程序员,未来之路-写于疫情笼罩下的北京-中国-地球
    Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(一)引子
    A left join B B表有多条记录,max(create_time)取最新一条
    最新idea破解码,亲测可用
    Spring Cloud Gateway简单使用
    开源的C#实现WebSocket协议客户端和服务器websocket-sharp组件解析
    简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析
  • 原文地址:https://www.cnblogs.com/prvin/p/3368298.html
Copyright © 2011-2022 走看看