ABAP occurs 0 和 type/like standard table of 的区别

举报
雨绸缪 发表于 2023/05/29 16:47:49 2023/05/29
【摘要】 带标题行的内表带标题行的内表的第一行作为工作区。如下图所示: OCCURS 0当我们声明内表或变量或常量时,系统将在运行时根据对象的大小为每个分配内存。对于变量和常量,我们可以从定义中确定大小。对于内表,大小将等于所有字段大小的总和。即一行的大小等于所有字段大小的总和。表的大小等于每行的大小 * 行数。OCCURS 语句用于为程序区内表记录分配初始空间。OCCURS 语句用于在定义内部表时...

带标题行的内表

带标题行的内表的第一行作为工作区。如下图所示:

1.png

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 nn 中指定的值标识内表中的预期记录数。如果记录数超过,则系统将为接下来的 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.

运行:

image.png

image.png

image.png

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.

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。