Appearance
局部数据类型
一、核心概念
1.1 定义与特征
局部数据类型是通过 TYPES
语句在程序内部定义的数据结构,具有以下特征:
- 程序级可见性:仅在定义它的程序/函数组内有效
- 动态生命周期:随程序启动创建,程序终止销毁
- 轻量级存储:不占用DDIC存储空间
- 类型复用:支持在程序内部多次引用
1.2 生命周期图示
text
程序启动 -> 类型加载到内存 -> 变量实例化 -> 程序运行 -> 程序终止 -> 类型销毁
二、类型声明语法
2.1 基础声明格式
abap
TYPES:
<type_name> TYPE <existing_type> [OPTIONS],
<type_name> LIKE <existing_data_object>.
2.2 完整声明矩阵
类型分类 | 语法示例 | 说明 |
---|---|---|
基本类型 | TYPES ty_counter TYPE i. | 基于ABAP基础类型(如i, c, p等)的直接定义 |
结构体类型 | TYPES: BEGIN OF ty_student, id TYPE n, name TYPE string, END OF ty_student. | 多字段组合结构,支持嵌套定义 |
内表类型 | TYPES tt_sales TYPE TABLE OF ty_student WITH KEY id. | 标准表类型,需指定主键(UNIQUE/NON-UNIQUE) |
范围表类型 | TYPES tr_matnr TYPE RANGE OF matnr. | 用于WHERE条件筛选的特殊表类型,包含SIGN/OPTION字段 |
类型继承 | TYPES ty_tax TYPE ty_base. | 继承现有类型的所有属性,支持扩展增强 |
指针类型 | TYPES ty_ref TYPE REF TO data. | 通用数据引用类型,支持动态数据操作 |
三、作用域规则
3.1 可见性层级
text
全局程序 -> 包含程序 -> 子程序 -> 代码块
↑
局部类型作用域边界
3.2 跨作用域限制示例
abap
REPORT ZMAIN.
TYPES ty_local TYPE c. " 主程序类型
INCLUDE ZSUB. " 包含子程序
FORM subform.
DATA lv_var TYPE ty_local. " ✅ 可访问
ENDFORM.
abap
" ZSUB 包含程序
DATA lv_sub TYPE ty_local. " ❌ 编译错误:类型未定义
四、ABAP 局部类型与全局类型对比分析
对比维度 | 局部类型 (TYPES) | 全局类型 (SE11) |
---|---|---|
特性 | 通过TYPES 语句在ABAP程序内部定义:ml-citation | 使用数据字典(SE11)创建,存储在系统级数据字典中:ml-citation |
存储位置 | 随程序加载到应用服务器内存,生命周期与程序执行周期一致:ml-citation | 存储在数据库表DD*系列中,独立于应用程序存在:ml-citation |
可见性 | 仅在定义程序或包含程序中可见:ml-citation | 全局可见,可被所有ABAP程序和数据库表引用:ml-citation |
修改影响 | 修改后仅影响当前程序,需重新激活程序生效:ml-citation | 修改会级联影响所有引用对象,需执行批量激活:ml-citation |
传输控制 | 自动包含在程序传输请求中,随程序一起迁移:ml-citation | 需要单独创建数据字典传输请求,独立于程序传输:ml-citation |
版本管理 | 版本记录在程序版本历史中,与程序代码同步管理:ml-citation | 拥有独立版本历史,支持跨系统版本比对:ml-citation |
典型场景 | 临时数据结构/程序专用逻辑处理:ml-citation | 跨系统通用结构(如财务凭证头、物料主数据):ml-citation |
五、高级类型构建
5.1 嵌套结构体
abap
TYPES:
BEGIN OF ty_address,
street TYPE c LENGTH 40,
city TYPE c LENGTH 30,
END OF ty_address,
BEGIN OF ty_employee,
id TYPE n LENGTH 6,
name TYPE c LENGTH 30,
address TYPE ty_address, " 嵌套结构
salary TYPE p DECIMALS 2,
END OF ty_employee.
5.2 复杂内表类型
abap
TYPES:
tt_sales TYPE SORTED TABLE OF ty_employee
WITH UNIQUE KEY id
WITH NON-UNIQUE SORTED KEY name_idx COMPONENTS name.
5.3 动态类型生成
abap
DATA:
lv_type_name TYPE string VALUE 'DYNAMIC_TYPE',
lo_type TYPE REF TO cl_abap_typedescr.
cl_abap_structdescr=>create(
EXPORTING
p_components = VALUE abap_component_tab(
( name = 'FIELD1' type = cl_abap_elemdescr=>get_string( ) )
( name = 'FIELD2' type = cl_abap_elemdescr=>get_i( ) )
)
RECEIVING
p_result = lo_type
).
TYPES: ty_dynamic TYPE HANDLE lo_type. " 动态类型定义
六、最佳实践
6.1 命名规范
abap
" ✅ 推荐格式
TYPES:
ty_employee_data TYPE ..., " 类型前缀 ty_
tt_sales_table TYPE ..., " 表类型前缀 tt_
tr_material_range TYPE RANGE OF matnr. " 范围表前缀 tr_
6.2 性能优化
避免在循环内重复定义相同类型 复杂结构优先使用 INCLUDE TYPE
而非逐字段定义
abap
TYPES:
BEGIN OF ty_base,
created_by TYPE sy-uname,
created_at TYPE sy-datum,
END OF ty_base.
TYPES:
BEGIN OF ty_sales.
INCLUDE TYPE ty_base. " 包含基础字段
sales_id TYPE n,
END OF ty_sales.
七、调试技巧
7.1 运行时类型检查
abap
DATA(lo_type) = cl_abap_typedescr=>describe_by_name( 'TY_EMPLOYEE' ).
IF lo_type->kind = cl_abap_typedescr=>kind_struct.
" 处理结构体类型
ENDIF.
7.2 内存分析工具
使用事务码 S_MEMORY_INSPECTOR 查看:
- 类型定义占用的内存空间
- 类型引用计数
- 实例化对象的内存分布
八、开发实践建议
8.1. 类型选择原则
- ✅ 优先使用全局类型:
- 需要跨程序共享数据结构时:ml-citation
- 需建立数据库表字段关联时:ml-citation
- ✅ 适用局部类型场景:
- 临时计算结果容器:ml-citation
- 程序内部专用逻辑处理结构:ml-citation
8.2. 类型转换规范
abap
" 局部类型转全局类型示例
DATA: ls_local TYPE ty_local_structure. " 局部结构
MOVE-CORRESPONDING ls_local TO gs_global. " 全局结构(SE11定义):ml-citation{ref="3,8" data="citationList"}
九、完整示例
9.1 销售报表类型系统
abap
REPORT z_sales_report.
* 主数据结构定义
TYPES:
BEGIN OF ty_sales_header,
doc_number TYPE vbeln,
doc_date TYPE erdat,
total_amt TYPE wrbtr,
END OF ty_sales_header,
BEGIN OF ty_sales_item,
doc_number TYPE vbeln,
material TYPE matnr,
quantity TYPE menge,
unit_price TYPE wrbtr,
END OF ty_sales_item,
* 内表类型定义
tt_header TYPE SORTED TABLE OF ty_sales_header
WITH UNIQUE KEY doc_number,
tt_items TYPE STANDARD TABLE OF ty_sales_item
WITH KEY doc_number material.
* 程序逻辑
DATA:
lt_header TYPE tt_header,
lt_items TYPE tt_items.
* 数据填充示例
APPEND VALUE #(
doc_number = '000001'
doc_date = sy-datum
total_amt = 5000
) TO lt_header.
APPEND VALUE #(
doc_number = '000001'
material = 'MAT001'
quantity = 100
unit_price = 50
) TO lt_items.
* 金额汇总逻辑
LOOP AT lt_header ASSIGNING FIELD-SYMBOL(<header>).
LOOP AT lt_items ASSIGNING FIELD-SYMBOL(<item>)
WHERE doc_number = <header>-doc_number.
<header>-total_amt += <item>-quantity * <item>-unit_price.
ENDLOOP.
ENDLOOP.
9.2 类型继承示例
abap
TYPES:
ty_base TYPE p DECIMALS 2,
BEGIN OF ty_extended.
INCLUDE TYPE ty_base AS base_amount. " 包含并重命名
tax_rate TYPE p DECIMALS 1,
END OF ty_extended.
DATA:
lv_calculation TYPE ty_extended.
lv_calculation-base_amount = 1000.00.
lv_calculation-tax_rate = 7.5.