定义结构的 INCLUDE 和 TYPE 方法

举报
雨绸缪 发表于 2023/07/31 17:10:10 2023/07/31
【摘要】 语法结构INCLUDE { {TYPE struc_type} | {STRUCTURE struc} } [AS name [RENAMING WITH SUFFIX suffix]].该语句只能在结构定义中声明,并在 TYPES、DATA、CLASS-DATA和 STATICS 等语句的 BEGIN OF 和 END OF 中添加内容。它将结构类型 struc_type ...

语法结构

INCLUDE { {TYPE struc_type} | {STRUCTURE struc} }
        [AS name [RENAMING WITH SUFFIX suffix]].

该语句只能在结构定义中声明,并在 TYPESDATACLASS-DATASTATICS 等语句的 BEGIN OFEND OF 中添加内容。

它将结构类型 struc_type 或指定位置的结构 struc 的所有组件复制到当前结构定义中。INCLUDE 语句并不创建子结构,这意味着组件被插入,就像它们被单独包括在 INCLUDE 语句中一样。

请注意,特别是在使用语句链(冒号和逗号)时,INCLUDE 是一个单独的语句,而不是对 DATA、TYPES 等语句的添加。

struc_type 可以是本地结构化类型,全局类或全局接口的可见结构化类型,或 ABAP 字典中的结构。struc 必须是同一程序的结构或全局类或全局接口的可见属性。

由于以下原因,这里描述的 INCLUDE 语句不应该再被使用:

  • 如果使用 INCLUDE 语句将更多的结构组件添加到现有的组件中,或者在一个结构中使用多个 INCLUDE 语句,这可能会由于命名冲突而产生语法错误。如果在同一个程序中没有定义的结构被包括进来,而这些结构将在以后被改变,这就特别有问题。
  • 包含的结构不能不受限制地被处理。
  • 对于所包含结构的每个组件,将再次存储必要的元数据,而子结构组件的元数据仅在定义子结构时存储一次。
  • 与真正的子结构相反,使用 INCLUDE 包含的结构在嵌入时不能被声明为静态框。

在可能的情况下,应该创建真正的子结构而不是使用 INCLUDE 语句。然而,应该使用附加的后缀重命名,以防止命名冲突。这个建议也适用于 ABAP 字典中结构的包含,特别是数据库表的结构不能包含任何真正的子结构。

  • 在 ABAP 对象之外,还可以使用 STRUCTURE 为 struc 指定平面结构、数据库表或 ABAP 字典中的视图。
  • 在使用 CONSTANTS 定义的常量结构中,不能使用 INCLUDE 包含任何组件,因为这些组件不能被赋予起始值。
  • 就其对齐而言,使用 INCLUDE 包含的结构的行为类似于子结构,这意味着对齐间隙可能发生在第一个组件之前或最后一个组件之后。直接声明组件时,不会发生这些情况。
  • 使用 INCLUDE 包含的结构由 RTTICL_ABAP_STRUCTDESCR 的方法 GET_COMPONENTS 处理,处理方式与子结构相同。返回的组件表仅包含包含结构的一行。组件类型由 CL_ABAP_STRUCTDESCR 中的对象表示,但AS_INCLUDE 列包含值 “X”。该方法 GET_INCLUDED_VIEW_TAB 可用于解析所包含结构的组件。
  • 将静态框从一个结构复制到另一个结构时,也会复制其盒装组件属性。

例如在程序中,可以这样使用:

DATA BEGIN OF rec.  
        INCLUDE STRUCTURE s.  
DATA END OF rec.

或者这样:

TYPES: begin of types ty_itab,
                     <fld1> type <ty1>,
                     <fld2> type <ty2>.
                     include type <struc>.
TYPES:            End of types ty_itab

... AS name 用法

通过在添加 AS 后指定名称名称,可以使用名称名称一起寻址所包含结构 struc_type 或 struc 的所有组件,或者可以使用结构组件选择器 (-) 对单个组件进行寻址。名称名称在包含组件的结构中必须是唯一的。这意味着不能有其他组件具有此名称,并且不能在 AS 之后的其他 INCLUDE 语句中指定它。

  • AS 之后指定名称的包含组件的寻址方式与寻址为子结构名称的组件的方式相同。
  • 使用 AS 名称指定的名称名称仅用作寻址选项,在诸如 MOVE-CORRESPONDINGSELECT INTO 对应 等语句中将被忽略。使用“带后缀重命名”重命名的组件实际上具有此名称,因此不会被忽略。

... RENAMING WITH SUFFIX suffix

... RENAMING WITH SUFFIX suffix 使得每个单独的组件都通过添加扩展后缀来重命名,这可以防止同名组件之间的命名冲突。必须直接指定后缀。

在下面的程序中,通过重复使用结构化类型 t_day 的组件来定义结构周。周的组成部分都处于同一级别,可以按如下方式解决:week-monday-work, week-monday-free, week-tuesday-work 等。

TYPES: BEGIN OF t_day,
         work TYPE c LENGTH 8,
         free TYPE c LENGTH 16,
       END OF t_day.

DATA BEGIN OF week.
  INCLUDE TYPE t_day AS monday    RENAMING WITH SUFFIX _mon.
  INCLUDE TYPE t_day AS tuesday   RENAMING WITH SUFFIX _tue.
  INCLUDE TYPE t_day AS wednesday RENAMING WITH SUFFIX _wed.
  ...
DATA END OF week.

参考链接:INCLUDE - TYPE, STRUCTURE

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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