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

相关推荐
搬码临时工36 分钟前
什么是内网映射?如何将内网ip映射到外网访问?
运维·服务器·网络·网络协议·tcp/ip·智能路由器
千里镜宵烛1 小时前
Linux--进程概念
linux·运维·服务器
中云时代-防御可测试-小余1 小时前
高防服务器价格高原因分析
运维·服务器·tcp/ip·安全·web安全·udp·ddos
IT葛大侠3 小时前
OSPF域间路由
运维·网络·计算机网络
搬码临时工3 小时前
有公网ip但外网访问不到怎么办?内网IP端口映射公网连接常见问题和原因
运维·服务器·网络·网络协议·tcp/ip·php·远程工作
huangyuchi.3 小时前
【Linux】编译器gcc/g++及其库的详细介绍
linux·运维·服务器·笔记·编译器·gcc·g++
egoist20235 小时前
【Linux仓库】冯诺依曼体系结构与操作系统【进程·壹】
linux·运维·服务器·开发语言·操作系统·冯诺依曼体系结构
白总Server6 小时前
Golang 依赖注入:构建松耦合架构的关键技术
linux·运维·服务器·macos·架构·golang·xcode
机械心6 小时前
Docker容器使用手册
运维·docker·容器
FreeBuf_7 小时前
黑客利用GitHub现成工具通过DevOps API发起加密货币挖矿攻击
运维·github·devops