SAP ABAP 工作区,内表,标题行的定义和区别

"---------------工作区定义------------

"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_table.

"这里IT_TABLE是个内部表

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


"------------内表的定义------------
"1,参照工作区域,前面先定义好工作区域。

DATA  it_table  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.

"上面两种定义的方法是相同的。

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

"①先是用TYPES关键字定义一个行(row)类型.如下:

TYPES: BEGIN OF line,
  field1 TYPE i,
  field2 TYPE i,
END OF line.

"这里的line相当于一个自定义的行类型,这里一行有两个字段field1和field2.

"②声明工作区:

DATA: wa TYPE line.

"③接着声明一个每一行的类型都是是line的内表:
DATA: itab TYPE line OCCURS 0.   "OCCURS作为区别工作区和内表的标志.
"当我们用以上这个方法来声明一个内表时,可以选择是否有无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就是上面那个已经定义的工作区.
"itab有header line的时候,这两种都可以.
"itab无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.

"如果一个内表有标题行,则对其进行操作的abap语句会简洁一些,因为这些语句会自动认为标题行是一个隐式的工作区

"标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行,用于存放被操作的纪录,是内表的缺省的工作区。


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

DATA: itab1 LIKE itab OCCURS 10.

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

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

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

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

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值