ABAP occurs 0 和 type/like standard table of 的区别
带标题行的内表
带标题行的内表的第一行作为工作区。如下图所示:
OCCURS 0
当我们声明内表或变量或常量时,系统将在运行时根据对象的大小为每个分配内存。
对于变量和常量,我们可以从定义中确定大小。
对于内表,大小将等于所有字段大小的总和。即一行的大小等于所有字段大小的总和。表的大小等于每行的大小 * 行数。
OCCURS
语句用于为程序区内表记录分配初始空间。OCCURS
语句用于在定义内部表时定义一个称为标题行的隐式工作区。
例如:
DATA:ls_out LIKE mara.
上面的定义 ls_out
是 mara 物料表类型的结构。它只能存储一条数据记录。对比:
DATA: lt_out LIKE mara OCCURS 0 WITH HEADER LINE.
这条语句中的 OCCURS 0
可以为内表分配 8KB 的初始内存。
如果数据加载到 lt_out
超过 8 KB,另外 8 KB 的内存是自动分配的过程。我们也可以用 1, 2, … 代替 0,直到 OCCURS n
,n
中指定的值标识内表中的预期记录数。如果记录数超过,则系统将为接下来的 n
条记录分配内存。如果 n
的值为零,则意味着您不知道将获得多少条记录。所以系统会默认分配 8KB 的内存。仅当您确定您的表内容在某个时候超过 8KB 时才建议使用 OCCURS 0
。否则在执行程序时只会浪费资源(内存)。
示例:
DATA : BEGIN OF ty_vbak OCCURS 0,
vbeln TYPE vbak-vbeln,
erdat TYPE vbak-erdat,
ernam TYPE vbak-ernam,
netwr TYPE vbak-netwr,
END OF ty_vbak.
SELECT-OPTIONS : s_vbeln FOR ty_vbak-vbeln.
SELECT vbeln
erdat
ernam
netwr FROM vbak INTO TABLE ty_vbak[] WHERE vbeln IN s_vbeln.
LOOP AT ty_vbak .
WRITE : / ty_vbak-vbeln , ty_vbak-erdat , ty_vbak-ernam , ty_vbak-netwr.
ENDLOOP.
运行:
TYPE/LIKE STARDARD TABLE OF
但是现在 SAP 的建议是不要使用 OCCURS,因为它在 OOPS 概念中已经过时了。此外,如果我们使用 OCCURS,则内部表的名称和标题行将相同。所以会混淆哪个是工作区,哪个是标题行。所以需要总是去明确的工作区。
TYPE/LIKE STANDARD TABLE OF
功能也可以更多一点,因为它可以是 LIKE HASHED TABLE OF
(去重),或者 LIKE SORTED TABLE OF
(排序)。 因此,更推荐下面定义内部表格的有效方法:
TYPES: BEGIN OF t_vbap, "Structure
vbeln TYPE vbap-vbeln,
posnr TYPE vbap-posnr,
matnr TYPE vbap-matnr,
END OF t_vbap.
DATA: i_vbak TYPE STANDARD TABLE OF t_vbak, "Internal table
wa_vbak TYPE t_vbak. "Explicit Work area
TYPES : BEGIN OF ty_mat,
name(12) TYPE c,
age TYPE i,
place(20) TYPE c,
END OF ty_mat.
DATA: it_mat TYPE TABLE OF ty_mat WITH HEADER LINE.
it_mat-name = 'Alex'.
it_mat-age = 23.
it_mat-place = 'Paris'.
APPEND it_mat .
CLEAR it_mat.
it_mat-name = 'Alice'.
it_mat-age = 18.
it_mat-place = 'London'.
APPEND it_mat .
CLEAR it_mat.
LOOP AT it_mat .
WRITE : / it_mat-name ,it_mat-age ,it_mat-place.
ENDLOOP.
- 点赞
- 收藏
- 关注作者
评论(0)