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

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

  1. ABAP 内表(internal table) 标题行(header line) 工作区(work area) 简介 - [SAP]

    刚开始学ABAP的时候,学到iternal table时,感觉一阵混乱.搞不清楚什么是work area,什么是header line,以及occurs是干什么用的.今天终于差不多搞明白了(我还是太弱 ...

  2. ABAP内表(internal table)有关的系统变量

    SY-TABIX – 内表当前行的索引号.SY-TABIX 的值可以被以下命令修改,但是只适用于索引表(index table).对于哈希表(Hashed table),这个系统变量的值为空或0. A ...

  3. [SAP ABAP开发技术总结]内表操作

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  5. [No0000138]软件开发基础知识

    1. 本文目的 本文目的在于,介绍软件开发的各种基础知识 以实现,看了之后,对于软件开发的很多领域的基础知识有所了解 如此在进行后续的真正的软件开发时,遇到各种细节知识,才会明白由来和背景知识 第 1 ...

  6. IM开发基础知识补课(七):主流移动端账号登录方式的原理及设计思路

    1.引言 在即时通讯网经常能看到各种高大上的高并发.分布式.高性能架构设计方面的文章,平时大家参加的众多开发者大会,主题也都是各种高大上的话题——什么5G啦.AI人工智能啦.什么阿里双11分分钟多少万 ...

  7. iOS开发——总结篇&IOS开发基础知识

    IOS开发基础知识 1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断 ...

  8. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...

  9. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

随机推荐

  1. IText 生成横向的doc文档

    IText生成doc文档需要三个包:iTextAsian.jar,iText-rtf-2.1.4.jar,iText-2.1.4.jar 亲测无误,代码如下: import com.lowagie.t ...

  2. 【疯狂Java讲义学习笔记】【数据类型与运算符】

    [学习笔记]1.8bit = 1byte,4byte = 1word.Java中的整型数据有byte(1字节),short(2字节),int(4字节),long(8字节).Java中的浮点数据有flo ...

  3. 多线程 (四)GCD

    学习GCD要掌握几个概念 任务:需要执行的代码块可以看作一个任务 队列:把任务放到队列里,遵循先进先出的原则 队列又分为串行队列和并行队列 串行队列:顺序执行 并发队列:同时执行多个任务 同步:在当前 ...

  4. BZOJ 1030 文本生成器

    很老的题目了,很早以前学AC自动机的时候就A过一次 今天算是复习啦 我们可以把问题转化成一个给定字符串都没出现的字符串有多少个 我们建立AC自动机,设dp[i][j]表示走了i步当前在j节点上 在DP ...

  5. c++ string assign =

    C++ string类的成员函数,用于拷贝.赋值操作,它们允许我们顺次地把一个string 对象的部分内容拷贝到另一个string 对象上. string &operator=(const s ...

  6. JMS基础(1)

    1.  消息中间件: 将信息以消息的形式,从一个应用程序传送到另一个或多个应用程序. 主要特点: (1) 消息异步接收: 消息发送者不需要等待消息接收者的响应 (2) 消息可靠接收: 确保消息在中间件 ...

  7. Flash Builder 4.6 基本设置

    Flash Builder 4.6 字体修改 打开Flash Builder4.6 -> 窗口 -> 首选项 -> 左边目录选择常规 -> 外观 -> 颜色和字体 -&g ...

  8. android 电容屏(二):驱动调试之基本概念篇

    平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...

  9. TreeList 实现多表头

    1. 先上图: 2. 再上代码: 原码

  10. 剑指Offer:打印从1到最大的n位数

    题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...