Appearance
定义其他变量
一、常量
1.定义与作用
- 核心概念: ABAP 常量通过 CONSTANTS 关键字定义,用于存储固定值,在程序生命周期内不可修改。
- 应用价值: 提升代码可读性(如用 gc_tax_rate 代替数值 0.13) 简化维护流程(修改时只需调整声明处的值)
2.常量声明语法
abap
CONSTANTS: lc_pi TYPE p DECIMALS 5 VALUE '3.14159'. " 数值常量
CONSTANTS: lc_hr TYPE string VALUE 'Human Resources'. " 字符常量
3.参数说明:
- TYPE:指定数据类型(如 i、p、string 等)
- VALUE:必须赋初始值(不可省略)
- DECIMALS:用于定点数类型(p)的小数位声明(可选)
示例:
abap
CONSTANTS: gc_pi TYPE p DECIMALS 5 VALUE '3.14159', " 数值常量
gc_curr TYPE string VALUE 'USD', " 字符串常量
gc_tax TYPE p DECIMALS 2 VALUE '0.13'. " 税率常量
4.常量使用场景
- 配置参数:存储系统参数(如税率、汇率)
abap
CONSTANTS: gc_exchange_rate TYPE p DECIMALS 4 VALUE '0.1512'. " 汇率常量
- 数学常量:定义固定数值(如 π、重力加速度)
- 业务标识:统一业务代码(如订单状态 STATUS_OPEN = '01')
5.使用优势对比
场景 | 常量使用 | 直接值使用 |
---|---|---|
可读性 | 高(语义明确,通过常量名自解释) | 低(需额外注释解释数值含义) |
维护性 | 修改一处即可全局生效 | 需全局搜索替换,易遗漏 |
错误风险 | 低(类型安全检查,避免非法赋值) | 高(易误赋值错误类型/范围的值) |
6.命名规范建议
- 前缀标识:推荐使用 gc_ 前缀(如 gc_max_count)
- 语义清晰:名称需反映用途(如避免 gc_num1 等模糊命名)
- 调试提示:通过 /h 激活调试模式可观察常量值传递过程
二、静态变量
1.概述
静态变量(Static Variables)在ABAP中特指类级别变量,具有以下核心特性:
特性 | 说明 |
---|---|
生命周期 | 随类加载时创建,程序终止时销毁(独立于对象实例) |
存储位置 | 分配在SAP应用服务器的共享内存区域 |
访问方式 | 可通过类名直接访问(无需创建对象实例) |
数据共享性 | 被所有类实例共享(修改一处全局生效) |
2.静态变量定义方法
类中声明语法
abap
CLASS lcl_utils DEFINITION.
PUBLIC SECTION.
CLASS-DATA:
gv_counter TYPE i, " 简单类型静态变量
gt_cache TYPE TABLE OF mara. " 内表类型静态变量
ENDCLASS.
初始化方式
abap
CLASS lcl_utils IMPLEMENTATION.
" 使用类构造函数初始化
CLASS-METHODS class_constructor.
METHOD class_constructor.
gv_counter = 0.
SELECT * FROM mara INTO TABLE gt_cache.
ENDMETHOD.
ENDCLASS.
3.静态变量使用场景
场景1:全局计数器
abap
CLASS lcl_order_mgr DEFINITION.
PUBLIC SECTION.
CLASS-DATA gv_order_count TYPE i. " 订单创建计数器
CLASS-METHODS create_order.
ENDCLASS.
CLASS lcl_order_mgr IMPLEMENTATION.
METHOD create_order.
gv_order_count = gv_order_count + 1. " 所有订单创建均递增同一计数器
" 创建订单逻辑...
ENDMETHOD.
ENDCLASS.
场景2:缓存共享数据
abap
CLASS lcl_material_cache DEFINITION.
PUBLIC SECTION.
CLASS-DATA gt_mara_cache TYPE SORTED TABLE OF mara WITH UNIQUE KEY matnr.
CLASS-METHODS get_material_info IMPORTING iv_matnr TYPE matnr
EXPORTING es_mara TYPE mara.
ENDCLASS.
CLASS lcl_material_cache IMPLEMENTATION.
METHOD get_material_info.
READ TABLE gt_mara_cache INTO es_mara WITH KEY matnr = iv_matnr.
IF sy-subrc <> 0.
SELECT SINGLE * FROM mara INTO es_mara WHERE matnr = iv_matnr.
INSERT es_mara INTO TABLE gt_mara_cache.
ENDIF.
ENDMETHOD.
ENDCLASS.
4.与实例变量对比
维度 | 静态变量(CLASS-DATA) | 实例变量(DATA) |
---|---|---|
声明方式 | 使用 CLASS-DATA 关键字声明 | 使用 DATA 关键字声明 |
内存分配 | 类加载时分配内存(全局唯一) | 对象实例化时分配内存(每个对象独立) |
访问方式 | 通过 => 操作符访问(如 lcl_utils=>gv_counter ) | 通过 -> 操作符访问(需先实例化对象) |
数据隔离性 | 所有类实例共享同一份数据 | 每个对象实例拥有独立的数据副本 |
5.使用注意事项
线程安全问题
- 风险:多用户并发访问时可能导致数据不一致
- 解决方案:使用ENQUEUE/DEQUEUE进行锁管理
abap
CALL FUNCTION 'ENQUEUE_EZLOCK'
EXPORTING
mode_mara = 'E'
mandt = sy-mandt
matnr = lv_matnr.
内存管理
- 避免存储大型数据集(如百万级内表)
- 定期清理过期数据(建议使用CLEAR或FREE)
初始化时机
- 优先在CLASS_CONSTRUCTOR中初始化
- 避免在方法中重复初始化
6.最佳实践建议
- 命名规范:使用gv_前缀标识类全局变量(如gv_cache_hit)
- 访问控制:将静态变量声明在PRIVATE SECTION并通过方法访问
abap
CLASS lcl_security DEFINITION.
PRIVATE SECTION.
CLASS-DATA gv_license_key TYPE string.
PUBLIC SECTION.
CLASS-METHODS get_license_key RETURNING VALUE(rv_key) TYPE string.
ENDCLASS.
性能优化:对高频访问的静态变量启用缓冲
abap
CLASS-DATA gt_config TYPE TABLE OF zconfig
MEMORY ID 'GLOBAL_CONFIG'.
调试提示:使用事务码S_MEMORY_INSPECTOR可查看静态变量内存占用情况
三、TABLES定义
1. 表格类型定义
abap
TYPES: BEGIN OF ty_material,
matnr TYPE matnr, " 物料编号
maktx TYPE maktx, " 物料描述
meins TYPE meins, " 基本单位
mtart TYPE mtart, " 物料类型
END OF ty_material.
DATA: gt_material TYPE TABLE OF ty_material. " 内表定义
2. 数据填充方法
abap
SELECT matnr maktx meins mtart
FROM mara
INTO TABLE gt_material
WHERE mtart = 'FERT'. " 读取生产物料数据
3.常用事务码
- SE11:数据字典维护(透明表/结构体定义)
- SE16N:表数据浏览器
- SE37:函数模块开发(表格处理逻辑)