SAP ABAP 数据类型和常量基础

SAP ABAP 数据类型和常量基础
在 ABAP 开发中,数据类型决定变量可以保存什么样的数据,常量则用于保存程序运行期间不应再改变的固定值。掌握 DATA、TYPES 和 CONSTANTS 的基本用法,是编写 ABAP 程序的第一步。
1. 变量定义:DATA
ABAP 中使用 DATA 定义变量。变量可以直接指定基础类型,也可以引用数据元素、表字段或自定义类型。
DATA lv_name TYPE c LENGTH 20. "定长字符
DATA lv_age TYPE i. "整数
DATA lv_price TYPE p LENGTH 8 DECIMALS 2. "定点小数,常用于金额或数量
DATA lv_date TYPE d. "日期,格式 YYYYMMDD
DATA lv_time TYPE t. "时间,格式 HHMMSS
DATA lv_text TYPE string. "动态字符串
DATA lv_flag TYPE abap_bool. "布尔值
变量名通常按用途加前缀,例如:
| 前缀 | 常见含义 |
|---|---|
lv_ | local variable,局部变量 |
ls_ | local structure,结构变量 |
lt_ | local table,内表 |
gv_ | global variable,全局变量 |
gc_ | global constant,全局常量 |
2. ABAP 常用基础数据类型
| 类型 | 含义 | 常见写法 | 说明 |
|---|---|---|---|
C | 定长字符 | TYPE c LENGTH 10 | 适合固定长度文本 |
N | 数字字符 | TYPE n LENGTH 6 | 内容看起来是数字,但本质仍是字符 |
I | 整数 | TYPE i | 用于计数、序号等整数值 |
P | 压缩数 | TYPE p LENGTH 8 DECIMALS 2 | 常用于金额、数量、小数 |
F | 浮点数 | TYPE f | 用于浮点计算,但金额场景一般不用它 |
D | 日期 | TYPE d | 内部格式为 YYYYMMDD |
T | 时间 | TYPE t | 内部格式为 HHMMSS |
STRING | 动态字符串 | TYPE string | 长度可变的文本 |
X | 十六进制字节 | TYPE x LENGTH 4 | 固定长度字节数据 |
XSTRING | 动态字节串 | TYPE xstring | 长度可变的字节数据 |
实际项目中,金额和数量字段常用 P 类型,并明确指定小数位;日期使用 D,时间使用 T,普通文本可根据是否定长选择 C 或 STRING。
3. 自定义类型:TYPES
TYPES 用于定义可复用的数据类型。它本身不创建变量,只是创建一个类型模板,后续变量可以基于这个类型声明。
TYPES ty_name TYPE c LENGTH 30.
DATA lv_customer_name TYPE ty_name.
定义结构类型
结构类型可以把多个字段组合在一起,常用于保存一行业务数据。
TYPES: BEGIN OF ty_customer,
id TYPE kunnr,
name TYPE name1,
city TYPE ort01,
END OF ty_customer.
DATA ls_customer TYPE ty_customer.
定义内表类型
内表用于保存多行数据。可以基于结构类型定义表类型。
TYPES tt_customer TYPE STANDARD TABLE OF ty_customer WITH EMPTY KEY.
DATA lt_customer TYPE tt_customer.
这里的 WITH EMPTY KEY 表示使用空表键。在较新的 ABAP 语法中,显式写出表键更清晰,也能避免默认键带来的误解。
4. 常量定义:CONSTANTS
常量用 CONSTANTS 定义,定义时必须指定初始值。程序运行期间,常量的值不能再被修改。
CONSTANTS gc_company_code TYPE bukrs VALUE '1000'.
CONSTANTS gc_max_count TYPE i VALUE 100.
CONSTANTS gc_currency TYPE waers VALUE 'CNY'.
常量适合保存固定配置、状态值、业务代码、默认币种、最大次数等内容。命名上通常使用 gc_ 作为全局常量前缀,让读代码的人一眼知道它不是普通变量。
5. 布尔值常量
ABAP 没有传统意义上的独立布尔基础类型,项目中常用 abap_bool,并配合系统常量 abap_true 和 abap_false。
DATA lv_active TYPE abap_bool.
lv_active = abap_true.
lv_active = abap_false.
判断时可以这样写:
IF lv_active = abap_true.
WRITE: / 'Active'.
ENDIF.
6. TYPE 和 LIKE 的区别
TYPE 用于指定一个明确的数据类型;LIKE 用于参考已有变量或表字段的类型。
DATA lv_matnr TYPE matnr. "使用数据元素类型
DATA lv_matnr2 LIKE mara-matnr. "参考数据库表字段类型
一般建议优先使用 TYPE。当变量确实需要跟随某个已有字段的类型变化时,再使用 LIKE。
常见选择原则:
| 写法 | 适合场景 |
|---|---|
TYPE matnr | 使用明确的数据元素或类型定义 |
TYPE ty_customer | 使用自定义类型 |
LIKE mara-matnr | 变量要严格参考某个已有字段 |
LIKE lv_value | 变量要参考另一个变量的类型 |
7. 完整示例:计算税额
下面的例子演示了常量、金额变量和计算逻辑的基本组合。
REPORT zdemo_type_const.
CONSTANTS gc_tax_rate TYPE p LENGTH 5 DECIMALS 2 VALUE '0.13'.
DATA lv_amount TYPE p LENGTH 10 DECIMALS 2 VALUE '100.00'.
DATA lv_tax TYPE p LENGTH 10 DECIMALS 2.
lv_tax = lv_amount * gc_tax_rate.
WRITE: / '金额:', lv_amount,
/ '税额:', lv_tax.
这个例子中:
| 对象 | 说明 |
|---|---|
gc_tax_rate | 税率常量,运行期间不应被修改 |
lv_amount | 金额变量,使用 P 类型并保留两位小数 |
lv_tax | 税额变量,由金额乘税率计算得到 |
8. 小结
ABAP 中可以简单记住三句话:
DATA用来定义变量。TYPES用来定义可复用的数据类型。CONSTANTS用来定义常量。
初学时重点掌握 C、I、P、D、T、STRING 这些常用类型。金额和数量优先考虑 P 类型,日期使用 D,时间使用 T,长文本使用 STRING。在实际业务开发中,尽量使用 SAP 数据元素或自定义类型来声明变量,这样代码更贴近业务含义,也更容易维护。
