21.[SAP ABAP] DATA关键字详解

21.SAP ABAP DATA关键字详解

文章目录

DATA是ABAP中最基础,最常用的声明关键字之一,用于 声明变量常量内表结构体对象应用 等数据对象。本文将从语法、分类、各种用法。

一、DATA的本质

ABAP中,DATA用于在程序的声明部分(通常是TOP包含或子程序开头)创建数据对象。它告诉运行时系统:

  1. 分配多大的内存
  2. 数据的类型是什么
  3. 数据对象的名称(标识符)

DATA是声明语句,不是可执行语句(虽然可以出现在过程内,但运行时不做动作,只在编译期生效)。

二、基本语法

ABAP 复制代码
DATA <name> [TYPE <type> | LIKE <obj>] [VALUE <val>] [LENGTH <len>] [DECIMALS <n>] [READ-ONLY]

各部分说明:

  1. TYPE:按类型声明
  2. LIKE:按已有数据对象声明
  3. VALUE:赋初值
  4. LENGTH:指定长度(主要用于C、N、X等)
  5. DECIMALS:指定小数位
  6. 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().

八、注意

  • 内联声明的位置决定了作用域(在 IFLOOPMETHOD 内声明的只在该块内有效)
  • 不能在内联声明中指定 VALUELENGTHDECIMALS
  • 类型推断依据右侧表达式
相关推荐
修电脑的猫14 小时前
在中国使用 Claude Code 解决 403 错误(VS CODE)
ai·sap
Henry-SAP19 小时前
SAP PP模块核心机制解析
人工智能·云原生·sap·erp
ChampaignWolf4 天前
在 SAP S/4HANA 内部基于 ICF Handler 从零实现 ABAP MCP Server:架构、代码与踩坑实录
c++·架构·sap·abap·mcp
slacker-kian4 天前
[实践]-本地大模型 + MCP + Agent 对接 SAP OData API 实现Web Chart APP
ai·llm·sap·agent·mcp·odata·chart bot
ChampaignWolf4 天前
YAAI 生态一周年:把 ABAP 变成 Agent 工具栈的开源组合拳
开源·abap·mcp·开源ai·yaai
爱喝水的鱼丶4 天前
SAP-ABAP:隐式/显式增强开发规范与避坑指南:10 类典型错误与运维方案
运维·性能优化·sap·abap·增强·经验交流
ChampaignWolf4 天前
abapgit-agent:用 Git 当中介,让 Claude Code 自己完成 ABAP 闭环开发
git·ai·abap·claude·abapgit·mcp
ChampaignWolf4 天前
Joule Unit Test 深度集成:ABAP 单元测试的 AI 六件套全解析
人工智能·单元测试·sap·abap·joule·单元测试ai
slacker-kian5 天前
[实践]-本地大模型Agent使用自定义MCP服务实现与SAP系统集成(二)
ai·llm·sap·agent·mcp·odata·qwen-agent