Abap 内表的语法

摘要:
ABAP中的内部表相当于其他编程语言中的二维数组。具有相同行结构的数据的存储不同于二维阵列。创建内部表后,列结构和列数是固定的,而行数是动态增长的。内部表支持循环中每行数据的操作,也支持整体操作。内部表是具有行和列的表结构。然而,它与数据库表不同,内部表仅在程序运行期间将数据存储在内存中。ABAP中有三种类型的内部表:标准表、哈希表、排序表-ABAP内部表数据类型内部表数据对象是实际的内部表,可以用数据填充

ABAP中的内表相当于其他程序设计语言中的二维数组,存储多行结构相同的数据
不同于二维数组,内表在创建后,列结构与列数是固定不变的,而行数是动态增长的
 内表支持循环对每行数据进行操作,也支持整体操作
 内表是具有行和列的表结构,然而,不同于数据库表,内表仅在程序运行期间在内存中存储数据
ABAP中有三种内表类型:标准表,哈希表,排序表

- ABAP内表数据类型
 内表数据对象是实际的内表,可以用数据进行填充
 内表数据类型是用于定义内表数据对象的抽象数据类型(ADT)
 

可以使用的内表数据类型有:
 Structure
 数据库表

 用户自定义数据类型

-ABAP内表声明

1>

TYPES: BEGIN OF line,

       field1 TYPE i,

       field2 TYPE i,

       END OF line.

* 声明一个数据类型

DATA: ITAB_WA TYPE(LIKE) line.    “ 声明一个内表工作区

DATA: ITAB TYPE(LIKE) line OCCURS 0.  “ 声明一个无工作区的内表

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0.   “ 声明一个有工作区的内表

DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE.

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE.

2>

DATA:  BEGIN OF line,

       field1 TYPE i,

       field2 TYPE i,

       END OF line.

* 声明一个line对象,该对象可以作为工作区使用

* 用DATA定义的line本身也是一个结构类型,也可再声明一个工作区

DATA: ITAB_WA TYPE(LIKE) line.   “ 声明一个工作区

DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE.  “ 声明一个带工作区的内表

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE . “ 声明一个带工作区的内表

3> 直接定义内表,这个内表是有工作区的

DATA: BEGIN OF ITAB OCCURS 0 ,

      CARR1 LIKE SPFLI-CARRID,

      CONN1 LIKE SPFLI-CONNID,

      END OF ITAB.

* DATA: ITAB1 TYPE ITAB.(错误的,实践证明,定义出来的什么都不是)。

正确方法:ITAB1 TYPE ITAB OCCURS 0.(这样定义后的是一个无工作区的内表)。

DATA: ITAB1 LIKE ITAB OCCURS 0 WITH HEADER LINE.  “定义一个带工作区内表

4> type ref to 定义内表

type ref to 属于ABAP中面向对象的编程。它是定义一个类的对象。

 

5>通过数据库表定义

data itab1 type table of sflight . “ 定义一个不带内表的工作区

data wa1 like line of sflgit  .    “ 定义一个内表工作区

data itab1 type table of sflight with header line . “定义一个带内表的工作区

两种内表定义方式的主要区别在于是否有隐式表头行

内表是按行进行访问的,然而,程序对内表的行操作不能直接进行,必须使用一种接口来传输,这个接口就是工作区(Work Area)
 

--内表操作

填充内表行
append <wa> to <itab>   “ 不带表头行的填充
append <itab>                “ 带隐式表头行的填充

插入内表行
insert <wa> into <itab> [INDEX idx]    “
insert <itab> [INDEX idx ]                   “ 隐式表头行插入内表
-- 如果没有指定INDEX ,则默认插入到内表最后一行

读取内表行
read <itab> into <wa> [INDEX idx] 
read <itab> [INDEX IDX] 

修改内表行
modify <itab> from <wa> [INDEX idx]
modify <itab> [INDEX idx]
-- read itab index 3 .
-- itab-XX = ‘xxx’ .
-- modify itab index 4 .

删除内表行
delete <itab> [INDEX idx] .
-- 带表头行和不带表头行语法一致 。

内表循环
Loop at <itab> into <wa> .
   <statement block>
endloop.                                     “ 带表头行的内表循环操作

Loop at <itab> .
  <statement block>
endloop.                                     “ 不带表头行内表操作

-- 循环体的MODIFY,DELETE等语句不必指定INDEX项,系统默认处理当前行 .
-- 如果不需要读取所有的内表行,可以使用WHERE选项进行限制
-- LOOP AT <itab> [WHERE <conditions>]

清空内表
clear <itab> . “清空不带表头行内表

clear<itab>[] . “清空带表头行内表

内表排序
SORT <itab> [ASCENDING | DESCENDING] [AS TEXT]
--ASCENDING和DESCENDING指定升序还是降序排列,如果不指定,缺省排序方式是升序
--AS TEXT影响字符字段的排序方式,如果不使用该选项,系统将按字符平台相应内部编码进行排序,否则,系统根据当前语言按字母顺序排序字符字段

删除重复行
DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING <comp>].
-- 删除重复行之前须对内表进行排序

判断内表行数
DESCRIBE TALBE <itab> LINES <count>.

将内表中部分或全部的数据行整体插入另一内表
INSERT LINES OF <itab1> [FROM n1] [TO n2] INTO [TABLE] <itab2> [INDEX <idx>].
-- insert lines of itab1 from 1 to 100 into itab2 . “ 将内表1前100行数据附加到内表2 .
-- 两个内表必须具有相同的或可转换的行结构

将内表中部分或全部的数据行整体填充到另一内表
APPEND LINES OF <itab1> [FROM n1] [TO n2] TO <itab2>.

按照条件或者索引删除一组选定行
DELETE <itab> [FROM n1] [TO n2] [WHERE <condition>].
-- delete itab1 from 1 to 100 where age >30 . "删除内表前100行中年龄大于30 的记录 。

整体复制内表,目标内表原有内容被覆盖
MOVE <itab1> TO <itab2>                            不带表头行的内表之间进行复制
MOVE <itab1>[] TO <itab2>[].                      带表头行的内表之间进行复制
MOVE <itab1> TO <itab2>[].                        不带表头行的内表复制到带表头行的内表
MOVE-CORRESPONDING <itab1> TO <itab2> 复制内表1中与内表2具有相同结构的字段进行复制,同样适用于工作区

免责声明:文章转载自《Abap 内表的语法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Flexigrid详解Windows下Redmine 的安装步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HTML5 Canvas指纹及反追踪介绍

HTML5 Canvas指纹及反追踪介绍 1 Canvas指纹的简介很多网站通过Canvas指纹来跟踪用户。browserleaks[1]是一个在线检测canvas指纹的网站。一般的指纹实现原理即通过canvas画布绘制一些图形,填写一些文字,随后获取图形的base64编码,再经过hash后得到最终的指纹。 下面是一个简单的例子,最终调用toDataUrl...

链表的基础操作1

1.链表的重要操作 我们知道,链表的基础单位是一个个节点,那么第一步便是创建节点。 struct node{ typename data; //typename data 这里是数据域 node* next ; //指针域 }; 有一点要注意的是在C++中,是可以直接使用node的,而在C语言中,则需要使用struct node 不然会显示...

(六)Android中Service通信

一、启动Service并传递参数 传递参数时只需在startService启动的Intent中传入数据便可,接收参数时可在onStartCommand函数中通过读取第一个参数Intent的内容来实现 1.MainActivity.java package com.example.shiyanshi.serviceconnected;import andro...

Vue与Django数据交互

首先配置路由信息,理论上都会添加二级路由:所以会有请求转发 1 from django.conf.urls import url,include 2 3 url(r'^api/(?P<version>w+)/',include("api.urls")), 此时请求会转发给二级路由:api.urls 1 url(r'^course/$'...

abap将内表数据导出为excel文件

一个不错的方案:  WHEN 'EXPORT'. "导出数据   DATA : GT_TEMP TYPE TABLE OF TY_ITEM WITH HEADER LINE.  LOOP AT GT_IMERR INTO GT_TEMP.   APPEND GT_TEMP. ENDLOOP.   INCLUDE...

前端http请求和常见的几个请求技术做具体的讲解

对于前端来说,请求是前端日常工作必备的,通过请求才能与后端进行数据交互,尤其在现在前后端分离的开发模式下,请求显得就更加重要。因此,对于前端开发者来说,掌握请求就很重要。下面将从http请求和常见的几个请求技术做具体的讲解 一、XMLHttpRequest         XMLHttpRequest一开始只是微软浏览器提供的一个接口,后来各大浏览器纷纷效...