第五十九篇:ECC→S/4HANA ABAP 迁移升级指南------程序改造、语法兼容与性能优化
导语
面向 ECC 升级 S/4HANA 的项目场景,梳理旧 ABAP 代码在 S/4HANA 中的适配点,包括过时语法替换、集群表/池化表兼容、传统 SQL 逻辑优化,并结合 ATC 讲解升级前检查、兼容改造、性能测试和常见坑点,帮助原有业务程序平稳迁移并实现性能提升。
说明:文中"80% 可直接运行、20% 需改造""耗时/提升倍数"等均为项目经验值,实际取决于代码质量、数据量和系统版本。
一、迁移全流程与 ATC 扫描
1.1 四阶段迁移方法
| 阶段 |
主要工作 |
输出 |
| Phase 1:代码体检 |
ATC 全包扫描,统计 Critical/Warning/Info,制定改造计划 |
改造清单、优先级 |
| Phase 2:语法改造 |
过时语法替换、兼容视图适配、FOR ALL ENTRIES 优化 |
可编译、可运行版本 |
| Phase 3:性能测试 |
ECC vs S/4HANA 基准测试,SQL Trace/AMDP Profiler 定位热点 |
性能对比报告、优化清单 |
| Phase 4:部署上线 |
Sandbox→Quality→Production,灰度、监控、回滚预案 |
上线方案、运维手册 |
1.2 ATC 检查项建议
| 检查项 |
作用 |
关注级别 |
| ABAP Language Version Check |
检查新语法/版本兼容 |
Critical |
| Obsolete Statement Check |
检查废弃或高风险语句 |
Critical/Warning |
| Performance Check |
FOR ALL ENTRIES、全表扫描、隐式转换 |
Warning |
| Security Check |
硬编码、SQL 注入、权限检查缺失 |
Warning |
| Table Check |
集群表/池化表、兼容视图访问 |
Critical/Warning |
| Unicode Check |
字符长度、字节处理风险 |
Warning |
报告解读:
- Critical:可能导致编译失败、运行时 DUMP 或 DML 不允许,优先处理。
- Warning:可能存在兼容性、性能或权限风险,建议处理。
- Info:可读性/性能优化建议,可按收益排期。
ATC Quick Fix 可辅助替换部分语法,但不建议无审查批量替换,需逐项验证业务语义。
二、过时语法与高风险写法
2.1 优先处理清单
| 场景 |
旧写法/风险 |
建议 |
| ENDSELECT |
逐行处理,性能差 |
改为 SELECT INTO TABLE + LOOP AT |
| 方法中提前退出 |
混用 EXIT/CHECK 可读性差 |
按意图用 RETURN、CONTINUE、EXIT |
| 泛化异常捕获 |
CATCH cx_root 掩盖问题 |
优先捕获具体异常 |
| 集群表/兼容视图直接 DML |
INSERT/UPDATE 可能被拦截 |
使用标准 BAPI/API |
| 表行数/字段描述 |
DESCRIBE TABLE LINES 旧写法 |
推荐 lines( );字段信息可用 RTTI |
| SELECT * |
列式存储取全部列慢 |
只取必要字段 |
| FOR ALL ENTRIES |
空表未检查导致全表扫描风险 |
先判断内表非空 |
| 权限检查缺失 |
敏感数据越权 |
增加 AUTHORITY-CHECK |
2.2 关键示例
" ENDSELECT → SELECT INTO TABLE + LOOP AT
SELECT *
FROM bseg
INTO TABLE @DATA(lt_bseg)
WHERE bukrs = '1000'.
LOOP AT lt_bseg INTO DATA(ls_bseg).
WRITE: / ls_bseg-belnr.
ENDLOOP.
" 方法中提前返回:按意图使用 RETURN
METHOD my_method.
IF sy-subrc <> 0.
RETURN.
ENDIF.
IF lv_amount <= 0.
RETURN.
ENDIF.
ENDMETHOD.
" FOR ALL ENTRIES 先检查内表非空
IF lt_kostl IS NOT INITIAL.
SELECT belnr, kostl, wrbtr
INTO TABLE @DATA(lt_result)
FROM bseg
FOR ALL ENTRIES IN lt_kostl
WHERE kostl = lt_kostl-kostl.
ELSE.
lt_result = VALUE #( ).
ENDIF.
" 只取必要字段
SELECT belnr, fyear, perio, racct, kostl, prctr, hsl, hwaer
INTO TABLE @DATA(lt_acdoca)
FROM acdoca
WHERE bukrs = '1000'.
" 敏感数据增加权限检查
AUTHORITY-CHECK OBJECT 'F_T001_BUK'
ID 'BUKRS' FIELD '1000'.
IF sy-subrc <> 0.
RETURN.
ENDIF.
三、集群表/池化表适配
3.1 常见替代关系
| ECC 表 |
用途 |
S/4HANA 适配建议 |
难度 |
| BKPF + BSEG |
FI 凭证 |
ACDOCA;简单查询可用兼容视图 |
中 |
| ANLA/ANLB/ANLC |
资产主数据/折旧 |
ACDOCA + BAPI;禁止直接 DML |
高 |
| COSTE/COSPC/COSL |
CO 成本 |
ACDOCA/兼容视图 |
中 |
| BSIK/BSAD |
未清/已清 |
ACDOCA + 兼容视图 |
中 |
| FAGLFLEXT |
总账汇总 |
ACDOCA + 兼容视图 |
中 |
| T880/T881 |
公司代码汇总 |
配置表,通常仍可用 |
低 |
3.2 BSEG→ACDOCA 示例
" 旧写法:BSEG + 多层 FOR ALL ENTRIES 反查 BSIK
" 新写法:ACDOCA 一次查询获取凭证、科目、金额、清账状态等
SELECT belnr,
racct AS hkont,
kostl,
hsl AS wrbtr,
koart,
augdt,
zuonr
INTO TABLE @DATA(lt_acdoca)
FROM acdoca
WHERE bukrs = iv_bukrs
AND belnr = iv_belnr.
" koart = 'D' AND augdt IS NULL → 应收未清
" koart = 'K' AND augdt IS NULL → 应付未清
3.3 资产折旧示例
" 旧写法:ANLA + ANLB + ANLC 多次查询
" 新写法:ACDOCA 聚合查询
SELECT anln1,
racct AS hkont,
SUM( hsl ) AS dep_amount
INTO @DATA(ls_result)
FROM acdoca
WHERE bukrs = iv_bukrs
AND anln1 = '100001'
AND racct BETWEEN '6000000000' AND '6999999999'
AND koart = 'A'
GROUP BY anln1, racct.
3.4 兼容视图使用策略
- 简单查询:可继续使用 BSEG、FAGLFLEXT、BSIK/BSAD 等兼容视图,风险较低。
- 复杂多表 JOIN:建议重写为 CDS 视图,用 ACDOCA 一次查询完成。
- INSERT/UPDATE/DELETE:禁止直接操作兼容视图/集群表,改用标准 BAPI/API。
- 渐进式改造:先保证兼容运行,再按高频、关键场景逐步重写。
四、FOR ALL ENTRIES 重写策略
| 判断条件 |
建议 |
| 未做空表检查 |
必须补空表检查 |
| 数据量 < 1000 行 |
可保留,注意空表和字段 |
| 1000--10000 行 |
评估 CDS 重写 |
| > 10000 行 |
优先 CDS/AMDP |
| 3 层以上 FOR ALL ENTRIES |
优先重写为 CDS JOIN/ASSOCIATION |
| 需要 Fiori/OData |
优先 CDS |
| 需要窗口函数/复杂计算 |
优先 AMDP + SQLScript |
CDS 重写示例
@AbapCatalog.sqlViewName: 'ZBALSHEET_S4'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Balance Sheet S4'
define view Z_Balance_Sheet_S4
with parameters
p_bukrs : bukrs,
p_fyear : gjahr,
p_perio : char2
as select from faglflext as flext
association [1..1] to zt_fi_account_group as _group
on _group.range_from <= flext.racct
and _group.range_to >= flext.racct
and _group.active = abap.true
association [1..1] to t001 as _company
on _company.bukrs = flext.bukrs
and _company.land1 = 'CN'
{
key flext.racct as Account,
_group.group_name as AccountGroup,
_company.butxt as CompanyName,
sum(case when flext.perio < :p_perio then flext.hslvt else 0 end) as OpeningBalance,
sum(case when flext.perio = :p_perio then flext.hslvt else 0 end) as PeriodAmount,
sum(flext.hslvt) as ClosingBalance
}
where flext.bukrs = :p_bukrs
and flext.fyear = :p_fyear
and flext.perio <= :p_perio
group by flext.racct, _group.group_name, _company.butxt;
SELECT *
FROM z_balance_sheet_s4(
p_bukrs = '1000',
p_fyear = '2026',
p_perio = '09' )
INTO TABLE @DATA(lt_result).
五、性能测试与热点定位
5.1 基准测试场景
| 场景 |
关注点 |
| 资产负债表汇总 |
聚合、兼容视图 vs CDS |
| 应收账龄分析 |
BSIK/BSAD 兼容视图、ACDOCA |
| 销售业绩汇总 |
VBAP 大数据量、索引 |
| FI 过账增强 |
BAdI 内查询次数、ACDOCA |
| 成本分摊 |
COSTE 兼容视图、聚合 |
| 批量发票过账 |
循环内提交、锁、更新终止 |
| 利润中心分析 |
CDS 嵌入式分析 |
测试建议:相同数据集、冷/热启动、至少 3 次取平均,记录 ECC 与 S/4HANA 对比。
5.2 热点定位步骤
ST12 开启 SQL Trace,找 TOP 慢 SQL。
- 检查是否
SELECT *、缺索引、FOR ALL ENTRIES 空表、嵌套 LOOP。
- ADT 中查看 HANA 执行计划,关注全表扫描、DB 聚合、分区裁剪。
- 高频/大数据场景优先 CDS 聚合;复杂计算考虑 AMDP。
- 优化后回归业务口径和性能。
六、常见坑点汇总
| 类别 |
坑点 |
处理建议 |
| 编译/运行 |
集群表/兼容视图直接 INSERT/UPDATE |
改 BAPI/API |
| 编译/运行 |
ENDSELECT 逐行处理 |
SELECT INTO TABLE + LOOP |
| 编译/运行 |
方法中 EXIT/CHECK 语义混用 |
按意图 RETURN/CONTINUE/EXIT |
| 编译/运行 |
泛化 CATCH cx_root |
捕获具体异常 |
| 性能 |
SELECT * FROM ACDOCA |
指定字段 |
| 性能 |
多层 FOR ALL ENTRIES |
CDS JOIN/ASSOCIATION |
| 性能 |
ABAP COLLECT 大数量 |
CDS GROUP BY + SUM |
| 性能 |
ACDOCA 未按公司代码过滤 |
必须加分区/公司代码条件 |
| 业务 |
未清判断 augdt = '' vs IS NULL |
统一用 IS NULL 并验证 |
| 业务 |
ACDOCA 金额方向与 BSEG 差异 |
查 SAP Note,做口径验证 |
| 工具 |
SE11 直接加字段 |
评估 CDS Extend View |
| 工具 |
旧 SAPGUI 不支持新语法 |
升级 SAPGUI |
| 工具 |
SE16N 查兼容视图变慢 |
用 CDS/Fiori 或限定条件 |
七、实施路线图
| 阶段 |
工作 |
时间参考 |
| 第一批:保运行 |
改 Critical:ENDSELECT、直接 DML、方法退出、异常类 |
1--2 天 |
| 第二批:热点优化 |
3 层 FOR ALL、BSIK/FAGLFLEXT 高频查询重写 CDS/ACDOCA |
3--5 天 |
| 第三批:全面优化 |
Warning 清理、SELECT *、COLLECT、字符串模板等 |
5--10 天 |
| 第四批:新特性 |
新增 CDS Fiori、AMDP 大数据报表、新语法替换 |
持续 |
渐进式策略:
- Sandbox 先保证 100% 可编译、可运行。
- Quality 验证热点场景性能收益。
- Production 灰度上线,准备回滚预案。
- 上线后持续监控、培训和规范沉淀。
总结
- 先跑再改:先处理 Critical,让旧代码在 S/4HANA 跑起来,再处理 Warning 和优化。
- 渐进式优化:优先改高频、关键、慢查询场景,小步验证收益。
- 保持兼容:自定义透明表、BAdI 实现、RFC 签名通常可延续;CDS/AMDP 作为增强手段逐步引入。
- 以 ATC 和性能测试为准:文中比例、耗时、提升倍数为经验值,实际以系统版本、ATC 报告和基准测试为准。