工作区域跟变量一样,是用来保存数据的。区别是变量只能从中保存一个数据。而工作区域可以存放多个。把多个数据合在一起就成工作区域了。下面我们来看看工作区域是如何定义的吧。定义有四种方法,如下:
1,直接定义
DATA: BEGIN OF WA_EKBE,
MATNR TYPE MARA-MATNR,
MAKTX TYPE MAKT-MAKTX,
END OF WA_EKBE.
上面是以BEGIN和END关键字开始,在其中的就是其工作区域的内容。它存放的内容也就是这两个。

2,参照表或结构
DATA: WA_LFA1   TYPE    LFA1.
DATA: WA_LFA2   TYPE    ZXXEKBE_S01.
上面就是定义WA_LFA1的结构跟表LFA1一样,WA_LFA2的结构跟结构ZXXEKBE_S01一样。

3,如何我们定义的结构一部分是结构,一部分是自定义的变量的话,可以这么定义
DATA: BEGIN OF WA_EKBE.
            INCLUDE STRUCTURE ZXXEKBE_S01.
DATA:   EBELP        TYPE EKKN-EBELP,
      END OF WA_EKBE.
这样工作区域WA_EKBE的结构就是结构ZXXEKBE_S01加上EBELP了。

4,参看内部表

DATA  L_WA_EKBE      LIKE LINE OF IT_EKBE.
这里IT_EKBE是个内部表

上面就是工作区域的定义,注意工作区域只能存放一组数据,不像内部表可以存放N组,为什么要定义这个东西呢,它是为了后面我们处理内部表服务的。

ABAP里存放数据的不是数组,而是内部表。我们从DB里把数据取出来就是放在内部表里的。然后通过对内部表的数据进行处理,最后再显示出来的。处理的时候是通过LOOP循环把内部表的数据放到工作区域。然后一个一个的时行处理。下面我们来看看内部表吧。
一,内部表的定义
1,参照工作区域,前面先定义好工作区域。
DATA  IT_EKBE  LIKE TABLE OF WA_EKBE.

2,参照DB表
DATA: WA_LFA1  TYPE  LFA1.
那么我们就可以这样定义内部表
DATA  IT_LFA1        TYPE TABLE OF LFA1.
DATA  IT_LFA1        LIKE TABLE OF WA_LFA1.
上面两种定义的方法是相同的。

二,内部表的类型
1,STANDARD内部表。定义的方法如下
DATA  IT_EKKO  TYPE STANDARD TABLE OF EKKO (WITH NON-UNIQUE KEY EBELN.).
这个是基本型,STANDARD 一般情况下是可以省略的。查询语句查询此表时是从第一个数开始按顺序开始查的,所以其效率不是很高。可以用LOOP把所有的数据都找出来。可以在后面指定WITH NON-UNIQUE KEY EBELN

2,SORTED  内部表。定义的方法如下
DATA  IT_EKPO  TYPE SORTED   TABLE OF EKPO WITH NON-UNIQUE KEY EBELN EBELP.
查询的时候此类表会根据KEY值排序,然后进行二分法查询,所以其效率很好。上面的NON-UNIQUE换成UNIQUE也是一样的。

3,HASHED内部表。定义的方法如下

DATA  IT_MAKT  TYPE HASHED   TABLE OF MAKT WITH UNIQUE KEY MATNR.
查询此类表的时候会用哈希算法进行查询,所以其效率也是高的,这种表定义的时候KEY 是必须的。这种表只能被用来让READ读取,此表还有一个特征就是表内的数值为以KEY为单位进行合计。

常用的还是第一种STANDARD内部表

下面具体说一下这工作区,内表和标题行

先是用TYPES关键字定义一个行(row)的类型.如下:
TYPES: BEGIN OF line,
  field1 TYPE i,
  field2 TYPE i,
END OF line.
这里的line,就相当于一个自定义的类型,表示一行(row)的字段(field).
这里一行有两个字段field1和field2.

然后是声明一个work area:
DATA wa TYPE line.

接着是声明一个每一行的类型是line的internal table:
DATA itab TYPE line OCCURS 0.
在这暂时把OCCURS作为了区别工作区和内表的标志.
当我们用以上这个方法来声明一个iternal table时,可以选择是否有无header line.
上面这句就是没有header line的.改成如下就有了:
DATA itab TYPE line OCCURS 0 WITH HEADER LINE.
有无header line的区别就是,header line可以当作一个work area来使用

有一下两种方式操作itab:
1).
wa-field1 = 1.
wa-field2 = 2.
APPEND wa TO itab.
2).
itab-field1 = 1.
itab-field2 = 2.
APPEND itab.
这里wa就是上面那个已经定义的work area.
有header line的时候,这两种都可以.
无header line的时候,只能用第1种.
第2种里,itab的意义是一个header line,而不是内表.
因为“DATA itab TYPE line OCCURS 0 WITH HEADER LINE.”这样的声明,
已经隐式声明了一个与内表同名的header line.
所以OCCURS用来声明内表可能造成二义性(ambiguous).
于是,OCCURS被认为是old的东西,采用以下方式声明一个内表比较好:
DATA itab TYPE STANDARD TABLE OF line.

还有一种声明内表的方法:
DATA: BEGIN OF itab OCCURS 0,
              field1 TYPE i,
              field2 TYPE i,
           END OF itab.
这样的itab就自动有了一个同名的header line.
好像不会有 WITHOUT HEADER LINE 或者 NOT WITH HEADER LINE 这样的用法…
如果没有OCCURS 0,比如这样:
DATA: BEGIN OF itab,
              field1 TYPE i,
              field2 TYPE i,
          END OF itab.
那么这个itab就不是内表,只是一个structure,可以作为itab的work area.

写到这里发现,归根到底就是TYPES和DATA这两个关键字的区别和有无OCCURS的区别

当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(header line),这是一个隐式的(implicit) 的工作区,当然在你定义内表的时候也可以选择无标题行。那么这个工作区是做什么用的呢?因为在对内表操作时,比如增加或者取回一条记录.我们必须暂时保存这条记录,而这条记录就保存在工作区里。来看一个例子:

data: begin of itab occurs 10,
        ab type c,
        cd type i,
      end of itab.

Itab是一个内表,且有标题行(也有这样的理解:直接定义了内表itab,不使用工作区,系统自动产生同名工作区(itab)来处理数据,这总说法可能不容易能理解),这里所说的同名工作区即指标题行。

再看一个显示的(explicit)声明一个工作区:

data: wa_itab like itab。

用SAP library的说法,如果一个内表有标题行,则对其进行操作的ABAP语句会简洁一些,因为这些语句会自动认为标题行是一个隐式的工作区,来看下SAP library的例子:

Operations without header line

Operations with header line

Operations for all Table Types

INSERT INTO TABLE .

INSERT TABLE ITAB.

COLLECT INTO .

COLLECT .

READ TABLE … INTO .

READ TABLE …

MODIFY TABLE FROM …

MODIFY TABLE …

MODIFY FROM …WHERE …

MODIFY … WHERE …

DELETE TABLE FROM .

DELETE TABLE .

LOOP AT ITAB INTO …

LOOP AT ITAB …

Operations for Index Tables

APPEND TO .

APPEND .

INSERT INTO …

INSERT …

MODIFY FROM …

MODIFY …

但是这种用隐式的工作区简洁的写法的代码很难理解(系统对于隐式工作区的处理),所以还是定义另外一个不同名的工作来使用易于理解。

到这里相信你对于标题行和工作区的理解已经清楚了。来总结一下:标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行,用于存放被操作的纪录,是内表的缺省的工作区。

再回头看下一个没有标题的内表:

data: itab1 like itab occurs 10.

类似这种like/like table of 定义的内表 如没有用with header line(声明标题行)则没有标题行。

那么occurs n 又是怎么回事呢?

因为在定义内表时系统会给你的内表分配空间,而occurs 就是用来定义这个大小的。

例如:当你知道可能每次用Select命中或交换的纪录数N时,可指明 occursN. 但如用occurs0声明时, buffers 由系统自动分配。

ABAP工作区,内表,标题行的定义和区别的更多相关文章

  1. 转载: ABAP动态内表操作

    顾名思义,动态表的列是可以根据数据的变化而变化的,会使报表显示更简洁漂亮. 以下是实现方法. ------------------------------------------- 1, 创建动态内表 ...

  2. 六十四、SAP中的内表的9种定义方式

    一.内表一共有9种定义方式,如下: 二.执行如下 *&--------------------------------------------------------------------- ...

  3. 转ABAP将内表行列转换实例(动态内表) .

    把内表的行列转换,网上的例子很多,但是新人想看懂,几乎很难,所以总结下我是怎么完成的. 比如:你的内表如图: 你想让内表最后展示成这样:如图: 那么完成之后会是这样: 完成这个过程,得用到动态内表.看 ...

  4. ABAP 动态内表 动态ALV

    DATA: DY_TABLE TYPE REF TO DATA, DY_WA TYPE REF TO DATA. FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE ...

  5. ABAP 动态内表添加单元格颜色字段

    *动态内表alv显示时要求某些单元格显示颜色 *wa_fldcat-datatype不能添加LVC_T_SCOL类型,在创建好内表之后,再添加颜色列. DATA: wa_fldcat TYPE lvc ...

  6. SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器

    今天接到一个FTP的需求,就是每天晚上把当天某个报表的数据自动保存excel上传到FTP服务器. SAP已经有现成的FTP函数使用,可以通过函数的方式来实现,实现前先准备一些数据: User:登录FT ...

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

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

  8. ABAP 内表 详解

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

  9. Abap 内表的语法

    ABAP中的内表相当于其他程序设计语言中的二维数组,存储多行结构相同的数据 不同于二维数组,内表在创建后,列结构与列数是固定不变的,而行数是动态增长的  内表支持循环对每行数据进行操作,也支持整体操作 ...

随机推荐

  1. C——数组下标与间址运算符

    只说一句,数组下标与间址运算符*是等价的,即:a[i] = *(a+i),看代码: int main(int argc, char* argv[]) { ] = {, , , , }; int i; ...

  2. JVM 虚拟机 内存说明

    Java虚拟机所管理的内存图: 1程序计数器: 该模块作用是记录线程执行字节码的位置,记录程序执行状态,以便该线程下次获得CPU时继续执行.程序里的每个线程程序计数器相互独立,互不影响,该内存区也称“ ...

  3. spark 1.5.2配置记录

    1)slaves # A Spark Worker will be started on each of the machines listed below. dataNode 2)spark-env ...

  4. Eclipse中10个最有用的快捷键组合

    Eclipse中10个最有用的快捷键组合 (转) 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. ...

  5. java筛选法求素数

    这本身没什么,代码一堆 发来纪念下而已 本来刚学习java,编写输出100以内的素数 对于我这个有代码运行性能洁癖的人(但是本身又不懂算法)来说,不能忍 于是看了些资料 参考: http://blog ...

  6. Storm进程通信机制

    storm的worker进程之间消息传递机制图: 每个worker都有一个独立的监听进程,监听配置文件中配置过的端口列表supervisor.slots.ports,topology.receiver ...

  7. java 中的SimpleDateFormat、Date函数以及字符串和Date类型互转

    SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期)和规范化. SimpleDateFor ...

  8. pickle 序列化反序列化

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  9. hdu, KMP algorithm, linear string search algorithm, a nice reference provided 分类: hdoj 2015-07-18 13:40 144人阅读 评论(0) 收藏

    reference: Rabin-Karp and Knuth-Morris-Pratt Algorithms By TheLlama– TopCoder Member https://www.top ...

  10. inside the C++ Object model总结

    一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...