EAB011 This report does not support sub-number summarization.
📌消息使用建议
错误消息(E):通常用于阻止用户做不应该做的事情
警告消息(W):通常用于提醒用户他们的行动的后果
信息消息(I):给用户有用的信息
🔄 ABAP基本语句流程图
graph TD
A[程序开始] --> B[REPORT语句]
B --> C{是否有语句?}
C -->|是| D[执行语句]
C -->|否| E[程序结束]
D --> F{是否需要输出?}
F -->|是| G[使用WRITE输出]
F -->|否| C
G --> H{是否需要格式化?}
H -->|是| I[使用SKIP/ULINE格式化]
H -->|否| C
DATA: lv_name TYPE string VALUE '张三', lv_age TYPE i VALUE 25, lv_result TYPE string.
* 调用带参数的子程序 PERFORM display_info USING lv_name lv_age CHANGING lv_result.
WRITE: / lv_result.
FORM display_info USING iv_name TYPE string iv_age TYPE i CHANGING cv_result TYPE string. DATA: lv_info TYPE string. CONCATENATE '姓名:' iv_name ', 年龄:' iv_age INTO lv_info. cv_result = lv_info. WRITE: / lv_info. ENDFORM. " display_info
🎯 子程序的优势
1. 代码重用
1 2 3 4 5 6 7 8 9
* 多次调用同一子程序 PERFORM calculate_tax USING 1000 CHANGING lv_tax1. PERFORM calculate_tax USING 2000 CHANGING lv_tax2. PERFORM calculate_tax USING 3000 CHANGING lv_tax3.
FORM calculate_tax USING iv_amount TYPE p CHANGING cv_tax TYPE p. cv_tax = iv_amount * 0.10. ENDFORM.
CREATE TABLE, CREATE INDEX, DROP TABLE, ALTER TABLE
ABAP与字典的关系
ABAP程序:处理SQL的DML部分
ABAP字典:处理SQL的DDL部分
🗃️ ABAP字典概念
字典定义
ABAP字典是驻留在SAP数据库中的元数据(即关于数据的数据)以及由数据库维护的元数据。
字典功能
graph TB
A[ABAP字典] --> B[创建和管理数据定义]
A --> C[创建表结构]
A --> D[创建数据元素]
A --> E[创建域]
A --> F[创建视图]
A --> G[定义类型]
🔧 字典中的基本类型
三种基本类型
类型
描述
用途
数据元素
定义数据类型、长度和小数位数
描述基本数据类型
结构
可以具有任何类型的组件
复合数据类型
表类型
描述内部表的结构
内部表定义
全局区域概念
字典被称为全局区域,因为:
字典中的对象对所有ABAP程序都是全局的
ABAP程序中的数据可以通过引用这些Dictionary全局对象来声明
避免了数据定义的重复
🎯 字典的主要任务
实现的功能
强制数据完整性
确保数据的一致性和有效性
实施业务规则和约束
管理数据定义
避免数据定义的冗余
统一数据标准
紧密集成
与ABAP开发工作台紧密集成
提供统一的开发环境
🏗️ 数据结构示例
客户数据结构示例
graph TD
A[客户结构] --> B[名称]
A --> C[地址]
A --> D[电话]
B --> B1[名字]
B --> B2[姓氏]
C --> C1[街道]
C --> C2[城市]
C --> C3[邮编]
D --> D1[电话号码1]
D --> D2[电话号码2]
D --> D3[电话号码3]
类型说明
组件
类型
说明
名称
结构
包含名字和姓氏
地址
结构
包含街道、城市、邮编
电话
表类型
客户可以有多个电话号码
🔍 字典支持的编辑工具
搜索工具
搜索帮助:帮助用户输入有效数据
输入帮助:提供数据选择功能
锁定工具
锁定对象:保护数据完整性
锁机制:防止并发访问冲突
📝 对象激活机制
自动创建过程
当对象被激活时:
字典对象在底层数据库中自动创建
生成相应的数据库结构
创建索引和约束
开发工作台集成
graph LR
A[ABAP开发工作台] --> B[ABAP字典]
B --> C[数据定义]
B --> D[数据库对象]
B --> E[编辑工具]
💡 字典使用场景
1. 功能模块接口
1 2 3 4
* 功能模块接口参数类型定义 TYPES: customer_type TYPE scustom, address_type TYPE scustom-address, phone_table TYPE TABLE OF scustom-phones.
2. 数据库表定义
1 2
* 使用字典类型定义数据库表 TABLES: scustom.
3. 数据类型声明
1 2 3
* 引用字典中的数据元素 DATA: customer_name TYPE scustom-name, city TYPE scustom-address-city.
DATA: BEGIN OF itab01 OCCURS 0, customer LIKE zcustomers1-customer, name LIKE zcustomers1-name, title LIKE zcustomers1-title, dob LIKE zcustomers1-dob, END OF itab01.
* 使用MOVE-CORRESPONDING自动复制 SELECT * FROM zcustomers1. MOVE-CORRESPONDING zcustomers1 TO itab01. APPEND itab01. ENDSELECT.
* 输出结果 LOOP AT itab01. WRITE: / itab01-name, itab01-dob. ENDLOOP.
输出示例
1 2 3 4 5
MARK 21.05.1981 JAMES 14.08.1977 AURIELE 19.06.1990 STEPHEN 22.07.1985 MARGARET 02.11.1994
MOVE-CORRESPONDING特点
自动匹配:自动匹配同名字段
简洁高效:只需一个语句完成所有匹配字段的移动
类型安全:要求两个字段具有匹配的数据类型和长度
⚠️ 重要注意事项
字段匹配要求
使用MOVE-CORRESPONDING时,需要确保两个字段都具有匹配的数据类型和长度
在示例中,这已经用LIKE语句预先完成
字段名称影响
graph LR
A[源表字段] --> B[名称匹配]
B --> C[数据复制]
B --> D[跳过不匹配]
C --> C1[成功复制]
D --> D1[保持原值]
错误预防
1 2 3 4 5 6 7 8
* 检查字段是否存在 IF line_exists( itab01 WITH TABLE KEY name = 'Test' ). " 字段存在,可以复制 MOVE-CORRESPONDING source TO itab01. ELSE. " 字段不存在,处理错误 WRITE: / '字段不存在'. ENDIF.
💡 复制方法对比
特性
MOVE
MOVE-CORRESPONDING
控制粒度
字段级
结构级
代码量
多(每个字段都要写)
少(一个语句)
灵活性
高(可选择部分字段)
低(只能匹配字段)
性能
中等
高(批量操作)
适用场景
精确控制字段移动
批量复制结构数据
🎯 最佳实践
1. 使用MOVE进行选择性复制
1 2 3 4 5 6
* 只复制需要的字段 SELECT * FROM zcustomers1. MOVE zcustomers1-name TO itab01-name. MOVE zcustomers1-dob TO itab01-dob. APPEND itab01. ENDSELECT.
2. 使用MOVE-CORRESPONDING进行批量复制
1 2 3 4 5 6
* 自动复制所有匹配字段 SELECT * FROM zcustomers1 UP TO 10 ROWS. MOVE-CORRESPONDING zcustomers1 TO itab01. APPEND itab01. ENDSELECT.
3. 错误处理
1 2 3 4 5 6 7 8 9 10 11 12 13
* 复制前检查数据类型 DATA: lv_name TYPE string, lv_dob TYPE d.
SELECT SINGLE name dob FROM zcustomers1 INTO (lv_name, lv_dob) WHERE customer = '100001'.
IF sy-subrc = 0. MOVE lv_name TO itab01-name. MOVE lv_dob TO itab01-dob. APPEND itab01. ENDIF.
4. 性能优化
1 2 3 4 5 6 7 8 9 10 11 12
* 使用批量复制而不是循环内复制 DATA: lt_source TYPE TABLE OF zcustomers1, lt_target LIKE itab01.
* 批量读取 SELECT * FROM zcustomers1 INTO TABLE lt_source.
* 批量复制 LOOP AT lt_source INTO DATA(wa_source). MOVE-CORRESPONDING wa_source TO wa_target. APPEND wa_target TO lt_target. ENDLOOP.
🔗 高级复制技术
1. 使用ASSIGN进行动态复制
1 2 3 4 5 6 7 8 9
FIELD-SYMBOLS: <fs_source> ANY, <fs_target> ANY.
ASSIGN COMPONENT 'NAME' OF STRUCTURE zcustomers1 TO <fs_source>. ASSIGN COMPONENT 'NAME' OF STRUCTURE itab01 TO <fs_target>.
IF <fs_source> IS ASSIGNED AND <fs_target> IS ASSIGNED. MOVE <fs_source> TO <fs_target>. ENDIF.
2. 使用CORRESPONDING关键字(ABAP 7.4+)
1 2 3 4 5
* 更简洁的写法(ABAP 7.4+) SELECT * FROM zcustomers1 INTO TABLE @DATA(lt_temp).
lt_target = CORRESPONDING #( lt_temp ).
⚠️ 常见错误
1. 字段不匹配
1 2
* 错误示例:字段名称不匹配 MOVE zcustomers1-full_name TO itab01-name. * 字段名不匹配
2. 数据类型不兼容
1 2
* 错误示例:数据类型不匹配 MOVE zcustomers1-amount TO itab01-name. * 金额不能赋值给姓名
3. 目标表未初始化
1 2
* 错误示例:目标表未定义 MOVE-CORRESPONDING zcustomers1 TO itab01. * itab01未定义
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[常量系统字段]
CLASS my_class DEFINITION. PRIVATE SECTION. DATA: internal_data TYPE string. PROTECTED SECTION. METHODS: internal_method. PUBLIC SECTION. METHODS: public_method. ENDCLASS.
最小暴露原则
只暴露必要的接口
避免暴露内部实现细节
限制外部访问权限
接口设计
设计稳定且易于理解的接口
保持接口的向后兼容性
避免频繁变更公共接口
📋 设计检查清单
设计原则
实践方式
数据隐藏
使用private修饰符保护数据
接口稳定
避免频繁修改公共接口
功能内聚
相关功能放在同一类中
低耦合
最小化类之间的依赖关系
🎯 应用场景
1. 数据保护
1 2 3 4 5 6 7 8
CLASS bank_account DEFINITION. PRIVATE SECTION. DATA: balance TYPE p decimals 2. METHODS: validate_amount IMPORTING amount TYPE p decimals 2. PUBLIC SECTION. METHODS: deposit IMPORTING amount TYPE p decimals 2, get_balance RETURNING VALUE(result) TYPE p decimals 2. ENDCLASS.
2. 业务逻辑封装
1 2 3 4 5 6 7 8 9 10
CLASS order_processor DEFINITION. PRIVATE SECTION. DATA: order_data TYPE order_struct. METHODS: validate_order, calculate_tax, process_payment. PUBLIC SECTION. METHODS: create_order IMPORTING order_data_in TYPE any, get_order_status RETURNING VALUE(status) TYPE string. ENDCLASS.
3. 工厂模式实现
1 2 3 4 5 6 7 8
CLASS factory DEFINITION. PUBLIC SECTION. CLASS-METHODS: create_object IMPORTING obj_type TYPE string RETURNING VALUE(obj) TYPE ref to any. PRIVATE SECTION. CLASS-METHODS: create_specific_object IMPORTING obj_type TYPE string RETURNING VALUE(obj) TYPE ref to any. ENDCLASS.