ABAP 开发笔记:结构体介绍与使用

867 阅读7分钟

什么是结构体

定义

一个结构体(结构化类型)包含不同的组件字段。是具有结构化数据类型的数据对象(这是一种复杂的数据类型,因为它是由其他数据类型组成的)。

由任何数据类型的组件序列组成,也就是说,结构的组件可以是,例如,基本数据对象、结构本身、内部表格或引用。

用来组合属于不同的数据对象。一个典型的例子是一个地址。它有几个组成部分,如名称、街道、城市等等,它们都属于一个结构体。

一个组件可以引用一个基本类型(通过数据元素或自定义类型,通过直接在结构定义中指定数据类型和长度),也可以引用另一个结构或表类型。

而且,一个结构可以嵌套到任意深度。但是通常不建议这样做,数据处理起来会比较麻烦。

这种结构化类型定义通常在链式语句中组合在一起,即 TYPES 后跟一个冒号,组件由逗号分隔,ABAP 语法:

TYPES|DATA:BEGIN OF STRUCTURE,

    field1[TYPE type]|[LIKE obj]...,

    field2[TYPE type]|[LIKE obj]...,

    ......

    fieldn[TYPE type]|[LIKE obj]...,

END OF STRUCTURE.

您可以对组件类型使用 TYPE 和 LIKE 添加。您可以使用 LINE OF 添加来引用表类型或内部表。如使用:  TYPES|DATA STRUCTURE TYPE str_type|LIKE str_dob.

TYPES: BEGIN OF struc_type,
         comp1 TYPE i,                 "elementary type           
         comp2 TYPE c LENGTH 5,        "elementary type
         comp3 TYPE structured_type,   "structured type
         comp4 TYPE itab_type,         "internal table type
         comp5 TYPE ddic_type,         "DDIC type
         comp6 TYPE REF TO i,          "data reference
         comp7 LIKE data_object,       "deriving type from a data object                  
         comp8 TYPE LINE OF itab_type, "component has structured type, type derived from internal table type 
         comp9 LIKE LINE OF itab,      "component has structured type, type derived from internal table
         comp10,                       "no TYPE/LIKE specification: component is of type c length 1          
         ...,
       END OF struc_type.
       

作用

结构体被用来定义模块池和屏幕之间的接口数据以及函数模块的参数类型。结构化类型在内部表和数据库表的范围内发挥着重要作用。结构化类型作为这些表的行类型。

大多数跨 ABAP 程序的内部表可能有结构化的行类型。对于数据库表来说,除了结构化行类型,没有其他选择。

可以在 ABAP 程序中本地创建结构化行类型。你也可以在 ABAP 字典中作为全局 DDIC 结构来创建它们。这样的 DDIC 结构定义了一个全局可用的结构化类型(DDIC 类型) 。 注意:还有其他全局可用的结构化类型,它们可能是 ABAP 程序中最常用的结构化类型:

  • 在 ABAP 词典中定义的数据库表可以像 ABAP 程序中的 DDIC 结构一样作为数据类型使用。这意味着,当你在 ABAP 程序中创建一个结构时,例如,你可以简单地使用数据库表的名称来解决该表的行类型。然后,你创建的结构将具有与数据库表相同的结构类型。通常情况下,你使用数据库表来创建这种类型的结构,或这种结构行类型的内部表,以处理结构或内部表中从数据库表读取的数据。
  • CDS 实体如 CDS 视图也代表一种结构化数据类型,在 ABAP 程序中也可以这样使用(但在 ABAP 字典中不可以)。这同样适用于仅在标准 ABAP 中可用的 DDIC 视图。
  • 结构和结构化数据类型也可以在全局类的公共可见性部分或全局接口中定义,然后全局使用。

Person 结构体

比如说 管理个人地址的数据可以表示为一个嵌套结构 PERSON:

  • 该结构包含组件(结构)NAMEADDRESS
    • 结构 NAME 包含组件(数据元素)FIRSTNAMELASTNAME
    • 结构 ADDRESS 包含组件(结构) STREETTOWN
      • 结构 STREET 包含组件(数据元素)STREETNAMEHOUSENO
      • 结构 TOWN 包含组件(数据元素)ZIPTOWNNAME

SDIC70_0_image002.png

SAP 中 BP 结构 BAPIBUS1006_CENTRAL_PERSON 字段如下:

image.png

结构体分类

SAP 中有三种不同的结构类型:扁平结构嵌套结构深层结构

扁平结构

扁平结构:只引用基本类型,嵌套结构引用至少一个进一步的结构,但不是表类型,而深层结构引用至少一个表类型。

扁平结构只包含有固定长度的基本类型,也就是说,没有内部表格、参考类型或字符串作为组件。在这种情况下,嵌套并不重要。即使是嵌套的结构也被认为是扁平的,除非一个子结构包含一个深层组件。

DATA: BEGIN OF structure,
        comp1 TYPE i,
        comp2 TYPE c LENGTH 15,
        comp3 TYPE p LENGTH 8 DECIMALS 2,
        ...,
      END OF structure.

基本类型是指简单的数据类型,如整数、字符和字符串等,而表类型则指具有多个行和列的数据结构,例如数据库表或电子表格。这些结构类型可以用于描述程序中的数据组织方式。

嵌套结构

嵌套结构:结构的至少一个组件是子结构,即它引用另一个结构。以下示例具有多个子结构。

DATA: BEGIN OF address_n,
        BEGIN OF name,
          title   TYPE string VALUE `Mr.`,
          prename TYPE string VALUE `Duncan`,
          surname TYPE string VALUE `Pea`,
        END OF name,
        BEGIN OF street,
          name   TYPE string VALUE `Vegetable Lane`,
          number TYPE string VALUE `11`,
        END OF street,
        BEGIN OF city,
          zipcode TYPE string VALUE `349875`,
          name    TYPE string VALUE `Botanica`,
        END OF city,
      END OF address_n.

深层结构

深层结构:至少包含一个内部表、引用类型或字符串作为一个组成部分。

DATA: BEGIN OF address_d,
        name    TYPE string VALUE `Mr. Duncan Pea`,
        street  TYPE string VALUE `Vegetable Lane 11`,
        city    TYPE string VALUE `349875 Botanica`,
        details TYPE TABLE OF some_table WITH EMPTY KEY,
      END OF address_d.

下面这个结构虽然看起来挺简单的,但它并不是一个扁平结构,而是一个深层结构,因为它包含了字符串。

DATA: BEGIN OF address,
        name   TYPE string VALUE `Mr. Duncan Pea`,
        street TYPE string VALUE `Vegetable Lane 11`,
        city   TYPE string VALUE `349875 Botanica`,
      END OF address.

SDIC70_0_image004.png

  • DDIC类型的数据类型都是扁平(非嵌套)结构。例外:可以包含字符串类型的组件。
  • ABAP SQL 语句的工作区不能包含除字符串之外的任何深层组件。
  • 特别是对于深层结构的分配和比较,必须考虑源结构和目标结构的兼容性。

内联方式声明结构体

使用 DATA(...) 通过内联声明创建结构:

  • 这对于在实际需要的操作数位置声明数据对象特别有用。
  • 这样,您可以避免在不同的上下文中额外声明结构。
  • 在较新的 ABAP 版本中,您可以使用 FINAL 声明运算符来创建不可变变量。
"Structures created inline instead of an extra declared variable
DATA struc_9 LIKE struc_1.
struc_9 = struc_1

"Type is derived from the right-hand structure; the content of struc is assigned, too.
DATA(struc_10) = struc_1.
FINAL(struc_11) = struc_9.

"Structures declared inline instead of an extra declared variable

"Example: SELECT statement
"Extra declaration
DATA struc_12 TYPE zdemo_abap_fli.

SELECT SINGLE *
  FROM zdemo_abap_fli
  WHERE carrid = 'LH'
  INTO @struc_12.

"Inline declaration
SELECT SINGLE *
  FROM zdemo_abap_fli
  WHERE carrid = 'LH'
  INTO @DATA(struc_13).

"Example: Loop over an internal table
DATA itab TYPE TABLE OF zdemo_abap_fli WITH EMPTY KEY.
... "itab is filled

"Extra declaration
DATA wa_1 LIKE LINE OF itab.

LOOP AT itab INTO wa_1.
  ...
ENDLOOP.

"Inline declaration
LOOP AT itab INTO DATA(wa_2).
  ...
ENDLOOP.

总结

本篇 ABAP 开发笔记介绍了结构体的概念,结构体是一种数据类型,可以用来组织和存储多个相关的数据项。结构体包含多个成员变量,每个成员变量可以是不同的数据类型,例如整数、字符或日期。结构体又可分为扁平结构、嵌套结构和深层结构。

在 ABAP 开发中,结构体常用于定义复杂的数据结构,方便程序的编写和维护。