Skip to content

定义其他变量

一、常量

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‌:函数模块开发(表格处理逻辑)‌