21.SAP ABAP DATA关键字详解
文章目录
- [21.SAP ABAP DATA关键字详解](#21.[SAP ABAP] DATA关键字详解)
-
- 一、DATA的本质
- 二、基本语法
- 三、常见用法分类
-
- [1. 基于内置类型声明](#1. 基于内置类型声明)
- [2. 基于数据字典类型声明](#2. 基于数据字典类型声明)
- [3. 不指定类型时的默认行为](#3. 不指定类型时的默认行为)
- 四、声明结构体
- 五、声明内表
- 六、DATA的作用域
- 七、内联声明(ABAP7.40+)
- 八、注意
DATA是ABAP中最基础,最常用的声明关键字之一,用于 声明变量 、 常量 、 内表 、 结构体 、 对象应用 等数据对象。本文将从语法、分类、各种用法。
一、DATA的本质
在ABAP中,DATA用于在程序的声明部分(通常是TOP包含或子程序开头)创建数据对象。它告诉运行时系统:
- 分配多大的内存
- 数据的类型是什么
- 数据对象的名称(标识符)
DATA是声明语句,不是可执行语句(虽然可以出现在过程内,但运行时不做动作,只在编译期生效)。
二、基本语法
ABAP
DATA <name> [TYPE <type> | LIKE <obj>] [VALUE <val>] [LENGTH <len>] [DECIMALS <n>] [READ-ONLY]
各部分说明:
- TYPE:按类型声明
- LIKE:按已有数据对象声明
- VALUE:赋初值
- LENGTH:指定长度(主要用于C、N、X等)
- DECIMALS:指定小数位
- READ-ONLY:声明只读变量
三、常见用法分类
1. 基于内置类型声明
ABAP
DATA gv_char TYPE c LENGTH 10. " 字符类型,长度10
DATA gv_num TYPE n LENGTH 10. " 数字文本,长度10
DATA gv_int TYPE i VALUE 100. " 整型,初始值100
DATA gv_dec TYPE p LENGTH 10 DECIMALS 3. " 压缩数值,总长10位含3位小数
DATA gv_date TYPE d VALUE '20260315'. " 日期类型(YYYYMMDD格式)
DATA gv_time TYPE t VALUE '143000'. " 时间类型(HHMMSS格式)
DATA gv_str TYPE string VALUE 'Hello'. " 可变长度字符串
DATA gv_hex TYPE x LENGTH 4. " 十六进制字节类型
2. 基于数据字典类型声明
ABAP
DATA gv_maktx TYPE maktx. " 参照数据元素声明
DATA gs_mara TYPE mara. " 参照数据库表结构声明(整个表结构)
3. 不指定类型时的默认行为
ABAP
DATA gv_default. " 默认为 CHAR 类型,长度为1
DATA gv_c TYPE c. " 默认长度为1
DATA gv_length(10). " 直接指定长度,默认为 CHAR 类型
四、声明结构体
使用BENGIN OF ... END OF语法声明内联结构体:
ABAP
DATA: BEGIN OF gs_employee,
emp_id TYPE i,
emp_name TYPE string,
salary TYPE p LENGTH 10 DECIMALS 2,
END OF gs_employee.
五、声明内表
ABAP
" 标准表
DATA gt_mara TYPE STANDARD TABLE OF mara.
" 带工作区
DATA:gt_orders TYPE STANDARD TABLE OF zorder,
gs_order TYPE zorder.
六、DATA的作用域
ABAP中DATA的作用域取决于声明位置:
- 全局(TOP包含) 作用域整个程序可见
- 子程序FORM内 作用域仅该FORM内
- 函数模块FUNCTION内 作用域仅该FM内
- 方法METHOD内 作用域方法内
- 类定义CLASS...DEFINITION 作用域类属性(用DATA声明实例/静态属性)
七、内联声明(ABAP7.40+)
7.40之后引入了内联声明,可以在使用处直接声明,不必提前在TOP里写:
ABAP
" 内联DATA
DATA(lv_name) = 'SAP'.
DATA(lv_age) = 18.
" 内联在SELECT中
SELECT SINGLE * FROM zemployee INTO DATA(ls_emp).
" 循环中内联
LOOP AT lt_emp INTO DATA(ls_line).
WRITE ls_line-id.
ENDLOOP.
" 内联内表
DATA(lt_emp) = VALUE zemployee_tab().
八、注意
- 内联声明的位置决定了作用域(在
IF、LOOP、METHOD内声明的只在该块内有效) - 不能在内联声明中指定
VALUE、LENGTH、DECIMALS - 类型推断依据右侧表达式