Skip to content

局部数据类型

一、核心概念

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.