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)详解

相关推荐
七夜zippoe11 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64813 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满13 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠13 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90313 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技14 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀15 小时前
Linux环境变量
linux·运维·服务器
zzzsde15 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º16 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~16 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化