结构与表类型 (★★★★)

结构与表类型 (★★★★)

#abap #abap-dictionary #abap-data-types

概览表

Type (类型) Dimension (维度) Description (描述)
Flat Structure (扁平结构) 一维 组件均为数据元素
Nested Structure (嵌套结构) 一维 包含子结构作为组件
Deep Structure (深层结构) 混合 至少包含一个内表组件
Table Type (表类型) 二维 描述内表结构

Structure(结构)

结构由**组件(Components)**组成,组件可以是:

1
2
3
4
5
6
7
Structure
├── Data Elements (数据元素) — 基本字段
├── Built-in Types (内置类型) — 直接类型定义
├── Other Structures (其他结构) — 子结构
├── Internal Tables (内表/表类型) — 深层组件
├── DB Tables / Views (数据库表/视图) — 仅取扁平字段
└── Table Types (表类型) — 内表组件
📌扁平化规则
即使 Include 了数据库表或视图(二维对象),生成的数据对象仍是一维的

扁平结构 (Flat Structure)

最简单的结构形式——组件全部是数据元素:

1
2
3
4
ZPERSON
├── FIRSTNAME (data element)
├── LASTNAME (data element)
└── BIRTHDAY (data element)
  • 地址方式: wa_person-firstname

嵌套结构 (Nested Structure)

包含子结构作为组件:

1
2
3
4
5
6
ZPERSON
├── NAME (ZNAME 结构) ← 嵌套
│ ├── FIRSTNAME
│ └── LASTNAME
├── STREET (data element)
└── CITY (data element)
  • 地址方式: wa_person-name-firstname

Include 结构

使用 .INCLUDE 关键字将一个结构的字段直接展开到父结构中:

1
2
3
4
5
6
7
ZPERSON
├── .INCLUDE ZADDRESS ← 字段直接展开(无嵌套层级)
│ ├── STREET
│ ├── NR
│ ├── ZIP
│ └── CITY
├── NAME (ZNAME 结构) ← 嵌套(有层级)
💡Include vs 嵌套的区别
  • Include: wa_person-street(扁平访问,无前缀)
  • 嵌套: wa_person-name-firstname(层级访问)
  • Include 实际上把子结构的字段拷贝到父结构中

深层结构 (Deep Structure)

包含至少一个内表组件的结构:

1
2
3
4
5
6
ZPERSON (Deep Structure)
├── NAME (ZNAME 结构)
├── .INCLUDE ZADDRESS
└── PHONE (ZIT_PHONE_NUMBER 表类型) ← 内表组件
├── P_TYPE
└── P_NUMBER
  • 访问内表: LOOP AT wa_person-phone INTO wa_phone.
  • 可以多层嵌套:内表的行类型本身也可以是深层结构
⚠️数据库表限制
数据库表只能包含扁平结构,不能有深层结构中的内表组件。

Table Type(表类型)

表类型描述**内表(Internal Table)**的结构,在 ABAP 程序中创建二维数组。

定义要素

Element (要素) Options (选项)
Line Type (行类型) 数据元素、结构、DB 表、视图、其他表类型
Access Type (访问方式) Standard / Sorted / Hashed
Key Type (键类型) Unique / Non-unique
Key Definition (键定义) Standard Key / Key Components

访问方式对比

Access Type 特点 适用场景
Standard Table 线性搜索,无序 小数据量,不需排序
Sorted Table 按 key 排序,二分搜索 需要排序访问
Hashed Table 哈希索引 大数据量按键查找

创建示例

1
2
3
4
5
6
SE11 → Data Type → Create → Table Type
├── Short Description: "Sorted table for SFLIGHT"
├── Line Type: SFLIGHT (数据库表)
├── Access Type: Sorted Table
├── Key Type: Non-unique
└── Key Components: FLDATE

在 ABAP 中使用:

1
2
3
4
5
6
DATA it_flight TYPE zit_sflight##.
DATA wa_sflight TYPE sflight.
SELECT * FROM sflight INTO TABLE it_flight WHERE carrid = 'JL'.
LOOP AT it_flight INTO wa_sflight.
WRITE: / wa_sflight-carrid, wa_sflight-fldate.
ENDLOOP.

考试/测试模式

Scenario/Keyword (场景/关键词) Answer (答案)
“深层结构的定义条件?” 包含至少一个内表组件
“数据库表能用深层结构吗?” 不能,只能用扁平结构
“Include 和嵌套的区别?” Include 扁平展开,嵌套增加层级
“Include 链中的数据库表?” 只能有一个(就是表本身)