ABAP开发基础知识:5) 内表(Internal Table)

foxting 2021-09-07 原文

    内表与结构体基本类似,它同样是程序运行中被临时创建的一个存储空间,它是一个可包含多条记录的数据表。

    内表共有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

     

   

发表于
2012-03-19 21:07 
KenNgai 
阅读(29454
评论(1
编辑 
收藏 
举报

 

版权声明:本文为foxting原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/foxting/archive/2012/03/19/2406830.html

ABAP开发基础知识:5) 内表(Internal Table)的更多相关文章

  1. Spring+CXF+Maven发布Webservice – KenNgai

    Spring+CXF+Maven发布Webservice 使用CXF发布WebService简单又快速,还可以 […]...

  2. JAVA SFTP文件上传、下载及批量下载 – KenNgai

    JAVA SFTP文件上传、下载及批量下载 JavaJsch  1.jsch官方API查看地址(附件为需要的j […]...

  3. DIV垂直居中对齐 – KenNgai

    DIV垂直居中对齐 效果图: CSS: #container{ display:table-cell; wid […]...

  4. ABAP开发基础知识:4) 结构体(Structure)

    ABAP开发基础知识:4) 结构体(Structure)       ABAP中除了简单类型之外,用户还可以在 […]...

  5. JAVA SFTP文件上传、下载及批量下载 – KenNgai

    JAVA SFTP文件上传、下载及批量下载 JavaJsch  1.jsch官方API查看地址(附件为需要的j […]...

  6. JAVA SFTP文件上传、下载及批量下载 – KenNgai

    JAVA SFTP文件上传、下载及批量下载 JavaJsch  1.jsch官方API查看地址(附件为需要的j […]...

  7. DIV垂直居中对齐 – KenNgai

    DIV垂直居中对齐 效果图: CSS: #container{ display:table-cell; wid […]...

  8. JAVA SFTP文件上传、下载及批量下载 – KenNgai

    JAVA SFTP文件上传、下载及批量下载 JavaJsch  1.jsch官方API查看地址(附件为需要的j […]...

随机推荐

  1. IP地址分类与子网划分

    TOP 本节内容 1.IP地址分类 1.介绍 2.IP分类 2.子网划分 1.概念介绍 2.划分原理 3.根据 […]...

  2. CRM客户关系管理系统(八) – zhang_derek

    CRM客户关系管理系统(八) 第八章、只读字段处理和filter_horizontal的实现  8.1.只读字 […]...

  3. MatLab2012b/MatLab2013b 分类器大全(svm,knn,随机森林等)

    train_data是训练特征数据, train_label是分类标签。Predict_label是预测的标签 […]...

  4. 关于路由设备上配置默认网关命令无效的问题

         我们在网络实验中经常把路由设备当成主机来模拟,这样就会出现一个问题,当我们在给这台模拟的主机配置默认 […]...

  5. Markdown语法

    Markdown学习 二级标题 三级标题 四级标题 五级标题 六级标题 最多到六级标题,井号#加空格,井号#个 […]...

  6. windows主线程等待子线程退出卡死问题

    在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在 […]...

  7. 特征工程1:特征的抽取

    特征工程 · 定义:特征工程是指将原始数据转换为特征向量。(比如一片文档包含文本等类型,将这些文本类型的数据转 […]...

  8. 领域驱动设计,让程序员心中有码(二)

                引子,软件工程没有银弹      上一篇博文,抛出了一个问题,领域驱动设计真的是万能的 […]...