ABAP-12 内表

1.内表的用处

就是程序内的表。意即只有程序运行时内表才存在。程序用完即摧毁。
在ABAP语言里面用到内表,除了对内表一些特性的理解。还有就是对ABAP语言的使用。语言这东西,都是在应用中才能理解和贯通。就像学英语,光去背,不去用也是不行的。语法这些光去记,不去实战也是不行的。
程序中我们定义工作区间和内表。工作区间是独立于内表的一块空间,但是结构上也就是内表的一行。(在工作区间出现以前,ABAP用的是内表和内表的Header line,也就是说以前不是独立的空间)
工作区间只有一行,内表可以有很多行。(最大存储空间2G)但是为了程序运行快,还是不要搞太大的内表。大家程序都用内表。你搞这么大,系统还能运行的起来么。所以就是说一般往内表里填数的时候,别什么都往里面塞。

内表可以用来存放你的计算值或者单纯存放数据。比从数据库读取数据快多了。
而且内表有一个好处就是它可以是很多结构的组合,你定义很多个structure,然后组合起来。

在读或者写的时候,会先从内表读一行到工作区间,然后进行操作。
或者写入的时候,先写入工作区间,然后再传到内表。

内表和SAP自建表不同的在于,要在程序里面现场建。SAP建好了我们用tables语句来引用。
但是在程序里的内表需要DATA声明,然后还要给个work area。

2. 内表的分类

数据字典的表和内表的不同之处:
数据字典建表需要分配主键来唯一确定记录行。
而内表还可以确定非主键。也就是说可以有重复条目。
内表一般有哪几类呢?
在这里插入图片描述

2.1 标准表

通过表键或者索引访问数据。
通过表键访问,当内表数据量巨大的时候,就会花费很长时间。
那这时候就要建索引。
标准表没办法建唯一键,所以说会有重复行。
但是由于没有唯一键,系统不需要去检查标准表是不是有重复行,所以它写入的时候是非常快的。
但是就是对于读来说,会慢很多。因为没有唯一主键。

2.2 排序表

在排序表里就可以建唯一键了。排除所有重复值。
排序表同样可以用表键或者索引访问。排序表的读取相对于标准表就会快很多了。

2.3 HASH表

HASH表不用索引,会有一个唯一键。速度巨快。(当你的内表非常大的时候)
用HASH算法。

3. 内表的创建

3.1 标准表

有标题行

DATA: BEGIN OF it_tab OCCURS 0, 用DATA声明,用BEGINOF表示开始 OCCURS 0表示从0行开始(这个是旧方式,表示用header line来做工作区)。
        gender LIKE ZEMPLOYEE-gender, 内表字段名要和参照表一致。为啥,当你用move-corresponding to的时候好用。能直接匹配。
        userid LIKE ZEMPLOYEE-userid,
       END OF it_tab. ENDOF表示内表的结束。

工作区

TYPES: BEGIN OF ty_tab,
          gender LIKE ZEMPLOYEE-gender,
          userid LIKE ZEMPLOYEE-userid,
        END OF ty_tab.
DATA: it_tab02 TYPE STANDARD TABLE OF wa_tab. 无主键的标准表

3.2 排序表

TYPES: BEGIN OF ty_tab,
          gender LIKE ZEMPLOYEE-gender,
          userid LIKE ZEMPLOYEE-userid,
        END OF ty_tab.
DATA: it_tab02 TYPE SORTED TABLE OF wa_tab WITH UNIQUE KEY gender,userid. 无主键的标准表类型


3.3 表声明语句

* Table declaration (old method)
DATA: BEGIN OF tab_ekpo OCCURS 0,             "itab with header line
  ebeln TYPE ekpo-ebeln,
  ebelp TYPE ekpo-ebelp,
 END OF tab_ekpo.

*Table declaration (new method)     "USE THIS WAY!!!
TYPES: BEGIN OF t_ekpo,
  ebeln TYPE ekpo-ebeln,
  ebelp TYPE ekpo-ebelp,
 END OF t_ekpo.
DATA: it_ekpo TYPE STANDARD TABLE OF t_ekpo INITIAL SIZE 0,      "itab
      wa_ekpo TYPE t_ekpo.                    "work area (header line)

* Build internal table and work area from existing internal table
DATA: it_datatab LIKE tab_ekpo OCCURS 0,      "old method
      wa_datatab LIKE LINE OF tab_ekpo.

* Build internal table and work area from existing internal table,
* adding additional fields
TYPES: BEGIN OF t_repdata.
        INCLUDE STRUCTURE tab_ekpo.  "could include EKKO table itself!!
TYPES: bukrs  TYPE ekpo-werks,
       bstyp  TYPE ekpo-bukrs.
TYPES: END OF t_repdata.
DATA: it_repdata TYPE STANDARD TABLE OF t_repdata INITIAL SIZE 0,   "itab
      wa_repdata TYPE t_repdata.                 "work area (header line)
<u>Example with select statament</u>

*Code to demonstrate select command
*Code to demonstrate select into internal table command
TYPES: BEGIN OF t_bkpf,
*  include structure bkpf.
  bukrs LIKE bkpf-bukrs,
  belnr LIKE bkpf-belnr,
  gjahr LIKE bkpf-gjahr,
  bldat LIKE bkpf-bldat,
  monat LIKE bkpf-monat,
  budat LIKE bkpf-budat,
  xblnr LIKE bkpf-xblnr,
  awtyp LIKE bkpf-awtyp,
  awkey LIKE bkpf-awkey,
 END OF t_bkpf.
DATA: it_bkpf TYPE STANDARD TABLE OF t_bkpf INITIAL SIZE 0,
      wa_bkpf TYPE t_bkpf.

TYPES: BEGIN OF t_bseg,
*include structure bseg.
  bukrs     LIKE bseg-bukrs,
  belnr     LIKE bseg-belnr,
  gjahr     LIKE bseg-gjahr,
  buzei     LIKE bseg-buzei,
  mwskz     LIKE bseg-mwskz,         "Tax code
  umsks     LIKE bseg-umsks,         "Special G/L transaction type
  prctr     LIKE bseg-prctr,         "Profit Centre
  hkont     LIKE bseg-hkont,         "G/L account
  xauto     LIKE bseg-xauto,
  koart     LIKE bseg-koart,
  dmbtr     LIKE bseg-dmbtr,
  mwart     LIKE bseg-mwart,
  hwbas     LIKE bseg-hwbas,
  aufnr     LIKE bseg-aufnr,
  projk     LIKE bseg-projk,
  shkzg     LIKE bseg-shkzg,
  kokrs     LIKE bseg-kokrs,
 END OF t_bseg.
DATA: it_bseg TYPE STANDARD TABLE OF t_bseg INITIAL SIZE 0,
      wa_bseg TYPE t_bseg.


*Select directly into an internal table
SELECT bukrs belnr gjahr buzei mwskz umsks prctr hkont xauto koart
       dmbtr mwart hwbas aufnr projk shkzg kokrs
  FROM bseg
  INTO TABLE it_bseg.


* Select directly into an internal table where fields are in a
* different order or not all fields are specified 
SELECT bukrs belnr gjahr buzei mwskz umsks prctr hkont xauto koart
       dmbtr mwart hwbas aufnr projk shkzg kokrs
  FROM bseg
  INTO CORRESPONDING FIELDS OF TABLE it_bseg.


*Select... endselect command
SELECT bukrs belnr gjahr buzei mwskz umsks prctr hkont xauto koart
       dmbtr mwart hwbas aufnr projk shkzg kokrs
  FROM bseg
  INTO wa_bseg.

  APPEND wa_bseg TO it_bseg.
ENDSELECT.


*Select FOR ALL ENTRIES command
SELECT bukrs belnr gjahr bldat monat budat xblnr awtyp awkey
  UP TO 100 ROWS
  FROM bkpf
  INTO TABLE it_bkpf.

IF sy-subrc EQ 0.
* The FOR ALL ENTRIES comand only retrieves data which matches
* entries within a particular internal table.
  SELECT bukrs belnr gjahr buzei mwskz umsks prctr hkont xauto koart
         dmbtr mwart hwbas aufnr projk shkzg kokrs
    FROM bseg
    INTO TABLE it_bseg
    FOR ALL ENTRIES IN it_bkpf
    WHERE bukrs EQ it_bkpf-bukrs AND
          belnr EQ it_bkpf-belnr AND
          gjahr EQ it_bkpf-gjahr.
ENDIF.

4. 内表的填充

从数据库表直接一次性填充到内表。没有end select.

select * from zcustomer 
         into corresponding fields of it_tab02.

一条一条填充,那么就是一个循环了,select去一条一条的找,一直执行,要endselect来结束。

select * from zcustomer.
         MOVE-CORRESPONDING zcustomer to wa_tab02. (这个是一条一条的move,所以要endselect,还得要append)
append wa_tab02 to it_tab02.
endselect.
         
select gender, userid from zcustomer into wa_tab02. (这个是一条一条的move,所以要endselect,还得要append)
append wa_tab02 to it_tab02.
endselect.
         

5. 内表的数据获取

不同于ABAP数据字典表,我们用select来获取数据。而这个存在在内存里的内表。我们用loop来取数。
loop和endloop实际上就相当于select和endselect。
现在都是用工作区间不用header line了。相对好理解一点吧。

5.1 Modify

LOOP AT itab01 INTO wa_itab01.
  If wa_itab01-gender = 'female'.
     wa_itab01-gender = 'male'.
     Modify itab01 FROM wa_itab01.
   ENDIF.
 ENDLOOP.

5.2 Describe & Insert

DESCRIBE TABLE itab01 LINES lines.
INSERT wa_itab01 INTO itab01 INDEX lines.

5.3 Read

就是一次读一条,要么指定index,要么确定条件去读。然而都是读一条。多条满足条件的,只会去读一条。

READ TABLE itab01 INDEX 5 INTO wa_itab01.
***
READ TABLE itab01 INTO wa_itab01 WITH KEY gender = 'female'.

5.4 Delete

DELETE itab01 INDEX 5.
*** 
 LOOP AT itab01 INTO wa_itab01.
  If wa_itab01-gender = 'female'.
    Delete itab01 FROM wa_itab01.
   ENDIF.
 ENDLOOP.

5.5 CLEAR/REFRESH

CLEAR itab01.
CLEAR wa_itab01.

REFRESH itab01.
REFRESH wa_itab01.

FREE itab01.
FREE wa_itab01.


猜你喜欢

转载自blog.csdn.net/weixin_45689053/article/details/121511115