SAP局部数据类型是什么 数据类型的概念

局部数据类型

一、核心概念

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程序内部定义‌ 使用数据字典(SE11)创建,存储在系统级数据字典中‌
存储位置 随程序加载到应用服务器内存,生命周期与程序执行周期一致 存储在数据库表DD*系列中,独立于应用程序存在‌
可见性 仅在定义程序或包含程序中可见 全局可见,可被所有ABAP程序和数据库表引用
修改影响 修改后仅影响当前程序,需重新激活程序生效 修改会级联影响所有引用对象,需执行批量激活
传输控制 自动包含在程序传输请求中,随程序一起迁移 需要单独创建数据字典传输请求,独立于程序传输
版本管理 版本记录在程序版本历史中,与程序代码同步管理 拥有独立版本历史,支持跨系统版本比对
典型场景 临时数据结构/程序专用逻辑处理 跨系统通用结构(如财务凭证头、物料主数据)

五、高级类型构建

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. 类型选择原则

  • ✅ 优先使用全局类型:
    • 需要跨程序共享数据结构时
    • 需建立数据库表字段关联时
  • ✅ 适用局部类型场景:
    • 临时计算结果容器
    • 程序内部专用逻辑处理结构

8.2. 类型转换规范

abap 复制代码
" 局部类型转全局类型示例
DATA: ls_local TYPE ty_local_structure.  " 局部结构
MOVE-CORRESPONDING ls_local TO gs_global.  " 全局结构(SE11定义)

九、完整示例

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.

ABAP学习网站 ABAP环境准备 ABAP 开发包(Package)详解 ABAP 开发中的软件组件(Software Component)详解

相关推荐
myloveasuka2 分钟前
信号操作集函数
linux·运维·服务器·c语言·c++·vscode
亦舒.5 分钟前
宝塔面板Nginx手动配置负载均衡实战指南
运维·nginx·负载均衡
舒克起飞了2 小时前
linux系统编程——Makefile、GDB调试
linux·运维·服务器
deming_su2 小时前
轻松上手:使用Nginx实现高效负载均衡
运维·nginx·负载均衡
降世神童3 小时前
华为云Flexus+DeepSeek征文| 使用华为云CCE容器部署Dify-LLM高可用方案的验证与测试
运维·华为云·aigc
降世神童3 小时前
华为云Flexus+DeepSeek征文| 基于华为云Dify-LLM高可用平台开发运维故障处理智能体
运维·华为云·aigc
好名字更能让你们记住我5 小时前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos
门思科技5 小时前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网
学习编程的gas5 小时前
Linux开发工具——gcc/g++
linux·运维·服务器
dessler6 小时前
Kafka-消费者(Consumer)和消费者组(Consumer Group)
linux·运维·kafka