ABAP 变量

ABAP 变量

ℹ️概述
变量是用于在程序的分配的存储区域中存储值的命名数据对象。顾名思义,用户可以在ABAP语句的帮助下更改变量的内容。ABAP中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局、可以存储在该存储器内的值的范围以及可以应用于该变量的一组操作。

📝 变量声明

您必须先声明所有变量,然后才能使用它们。变量声明的基本形式是:

1
DATA <f> TYPE <type> VALUE <val>.

参数说明

  • <f>:指定变量的名称(最多可包含30个字符)
  • <type>:指定变量的类型(具有完全指定的技术属性的任何数据类型)
  • <val>:指定变量的初始值
💡自动初始化
在定义基本固定长度变量的情况下,DATA语句会自动使用类型特定的初始值填充变量的值。

有效示例

1
2
3
DATA d1(2) TYPE C.
DATA d2 LIKE d1.
DATA minimum_value TYPE I VALUE 10.
📌示例说明
  • d1是C类型的变量(2个字符长度)
  • d2是d1类型的变量(继承d1的类型和长度)
  • minimum_value是ABAP整数类型的变量,初始值为10

🎭 ABAP变量类型

ABAP中有三种变量类型:

1. 静态变量 (Static Variables)

  • 在子程序、函数模块和静态方法中声明
  • 生命周期与声明的上下文相关联
  • 使用CLASS-DATA语句,可以在类中声明变量
  • 使用PARAMETERS语句声明链接到选择屏幕上的输入字段的基本数据对象
  • 使用SELECT-OPTIONS语句声明在选择屏幕上链接到输入字段的内部表

2. 参考变量 (Reference Variables)

  • 使用REF TO附加声明引用变量
  • 引用变量的静态类型限制其可以引用的对象集合
  • 静态类型总是更加通用或与动态类型相同

3. 系统变量 (System Variables)

  • ABAP系统变量可从所有ABAP程序访问
  • 这些字段实际上由运行时环境填充
  • 这些字段中的值指示系统在任何给定时间点的状态
  • 可以在SAP中的SYST表中找到系统变量的完整列表

📋 命名约定

以下是命名变量时使用的约定:

约束 说明
不能使用特殊字符 不能使用特殊字符(如”%”和”=”)来命名变量
不能更改预定义对象名称 无法更改预定义数据对象的名称
不能与关键字相同 变量的名称不能与任何ABAP关键字或子句相同
名称要有意义 变量的名称必须传达变量的含义,而不需要进一步的评论
避免使用连字符 连字符被保留以表示结构的组件,应避免在变量名中使用
使用下划线分隔 下划线字符可用于分隔复合词
💥PARAMETERS语句示例
1
2
3
4
5
REPORT ZTest123_01.
PARAMETERS: NAME(10) TYPE C,
CLASS TYPE I,
SCORE TYPE P DECIMALS 2,
CONNECT TYPE MARA-MATNR.

参数说明

参数 类型 描述
NAME C(10) 10个字符的字符串参数
CLASS I 整数类型的参数
SCORE P DECIMALS 2 具有两个小数位的打包十进制数
CONNECT MARA-MATNR 引用ABAP字典的MARA-MATNR类型

🔗 参考变量语法

声明引用变量的语法是:

1
DATA <ref> TYPE REF TO <type> VALUE IS INITIAL.

语法说明

  • REF TO:附加声明一个引用变量
  • 静态类型:指定引用变量的静态类型,限制其可以引用的对象集合
  • 动态类型:引用变量当前引用的数据类型或类
  • 静态类型总是更加通用或与动态类型相同

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
CLASS C1 DEFINITION.
PUBLIC SECTION.
DATA Bl TYPE I VALUE 1.
ENDCLASS.

DATA: Oref TYPE REF TO C1,
Dref1 LIKE REF TO Oref,
Dref2 TYPE REF TO I.

CREATE OBJECT Oref.
GET REFERENCE OF Oref INTO Dref1.
CREATE DATA Dref2.
Dref2->* = Dref1->*->Bl.
📌代码解析
  • 声明了对象引用Oref和两个数据引用变量Dref1和Dref2
  • 这两个数据引用变量都是完全类型化的
  • 可以使用取消引用运算符->*在操作数位置取消引用

🌐 系统变量

特点

  • ABAP系统变量可从所有ABAP程序访问
  • 这些字段实际上由运行时环境填充
  • 这些字段中的值指示系统在任何给定时间点的状态
  • 可以使用SYST-SY-访问SYST结构的各个字段

常用系统变量

系统变量 描述
SY-ABCDE 字母表
SY-DATUM 当前日期
SY-DBSYS 数据库系统
SY-HOST 主机名
SY-LANGU 语言
SY-MANDT 客户端
SY-OPSYS 操作系统
SY-SAPRL SAP版本级别
SY-SYSID 系统ID
SY-TCODE 事务代码
SY-UNAME 用户名
SY-UZEIT 当前时间

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
REPORT Z_Test123_01.

WRITE: /'SY-ABCDE', SY-ABCDE,
/'SY-DATUM', SY-DATUM,
/'SY-DBSYS', SY-DBSYS,
/'SY-HOST ', SY-HOST,
/'SY-LANGU', SY-LANGU,
/'SY-MANDT', SY-MANDT,
/'SY-OPSYS', SY-OPSYS,
/'SY-SAPRL', SY-SAPRL,
/'SY-SYSID', SY-SYSID,
/'SY-TCODE', SY-TCODE,
/'SY-UNAME', SY-UNAME,
/'SY-UZEIT', SY-UZEIT.

输出示例

1
2
3
4
5
6
7
8
9
10
11
12
SY-ABCDE ABCDEFGHIJKLMNOPQRSTUVWXYZ
SY-DATUM 12.09.2015
SY-DBSYS ORACLE
SY-HOST sapserver
SY-LANGU EN
SY-MANDT 800
SY-OPSYS Windows NT
SY-SAPRL 700
SY-SYSID DMO
SY-TCODE SE38
SY-UNAME SAPUSER
SY-UZEIT 14:25:48

🔄 ABAP变量类型关系图



graph TD
    A[ABAP变量] --> B[静态变量]
    A --> C[参考变量]
    A --> D[系统变量]
    
    B --> B1[子程序变量]
    B --> B2[函数模块变量]
    B --> B3[类静态变量]
    B --> B4[PARAMETERS变量]
    B --> B5[SELECT-OPTIONS变量]
    
    C --> C1[对象引用]
    C --> C2[数据引用]
    
    D --> D1[系统状态变量]
    D --> D2[运行时环境变量]
    D --> D3[常量系统字段]

💡 最佳实践

  1. 变量命名规范

    • 使用有意义的名称
    • 避免使用特殊字符
    • 使用下划线分隔单词
    • 不要使用连字符
  2. 变量声明

    • 先声明后使用
    • 指定适当的数据类型
    • 设置有意义的初始值
  3. 系统变量使用

    • 了解常用系统变量的含义
    • 在适当的地方使用系统变量
    • 注意系统变量的只读特性