S/4 HANA ABAP 新特性入门:与 ECC ABAP 的核心差异、架构优势与学习路径规划
博客简介:面向有 ECC ABAP 开发经验的开发者,系统梳理 S/4 HANA 底层 HANA 数据库驱动的 ABAP 架构变革,拆解 ABAP for HANA 与传统 ABAP 的语法、开发范式核心差异,对比 S/4 HANA 中过时语法、废弃标准程序的调整点,结合实际升级场景给出 S/4 ABAP 的分阶段学习路径,帮助开发者快速建立新特性的基础认知框架,平滑过渡到 S/4 开发体系。
"业务模块实战篇 28 篇收官!现在进入 S/4 HANA 新特性系列。本篇面向有 ECC 开发经验的开发者,梳理 HANA 驱动的架构变革、过时语法清单、分阶段学习路径,从底层搞懂'为什么要从 ECC 升级到 S/4',为后面 5 篇新语法/CDS/AMDP/OData/迁移指南打基础。"
📖 写在前面
本篇定位
前 53 篇(用户出口 10 + MM 8 + SD 9 + FICO 10 + 跨系统接口 1)全部基于 SAP ECC 6.0 + NetWeaver 7.51 开发。本篇是新特性系列的开篇,切换到 S/4 HANA------SAP 从"功能增强"到"架构重构"的根本性升级。架构变了,ABAP 代码的写法、性能优化的方向、数据源的选择全变了。
本篇适合谁读
- 有 ECC ABAP 开发经验、准备升级 S/4 的开发者
- 想了解 S/4 HANA 架构变革的技术负责人
- 后续 5 篇(新语法/CDS/AMDP/OData/迁移)的前置阅读者
贯穿场景概览
#mermaid-svg-ZHcm2vpNly9Tj0uk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZHcm2vpNly9Tj0uk .error-icon{fill:#552222;}#mermaid-svg-ZHcm2vpNly9Tj0uk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZHcm2vpNly9Tj0uk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .marker.cross{stroke:#333333;}#mermaid-svg-ZHcm2vpNly9Tj0uk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZHcm2vpNly9Tj0uk p{margin:0;}#mermaid-svg-ZHcm2vpNly9Tj0uk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .cluster-label text{fill:#333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .cluster-label span{color:#333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .cluster-label span p{background-color:transparent;}#mermaid-svg-ZHcm2vpNly9Tj0uk .label text,#mermaid-svg-ZHcm2vpNly9Tj0uk span{fill:#333;color:#333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .node rect,#mermaid-svg-ZHcm2vpNly9Tj0uk .node circle,#mermaid-svg-ZHcm2vpNly9Tj0uk .node ellipse,#mermaid-svg-ZHcm2vpNly9Tj0uk .node polygon,#mermaid-svg-ZHcm2vpNly9Tj0uk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZHcm2vpNly9Tj0uk .rough-node .label text,#mermaid-svg-ZHcm2vpNly9Tj0uk .node .label text,#mermaid-svg-ZHcm2vpNly9Tj0uk .image-shape .label,#mermaid-svg-ZHcm2vpNly9Tj0uk .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZHcm2vpNly9Tj0uk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZHcm2vpNly9Tj0uk .rough-node .label,#mermaid-svg-ZHcm2vpNly9Tj0uk .node .label,#mermaid-svg-ZHcm2vpNly9Tj0uk .image-shape .label,#mermaid-svg-ZHcm2vpNly9Tj0uk .icon-shape .label{text-align:center;}#mermaid-svg-ZHcm2vpNly9Tj0uk .node.clickable{cursor:pointer;}#mermaid-svg-ZHcm2vpNly9Tj0uk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .arrowheadPath{fill:#333333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZHcm2vpNly9Tj0uk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZHcm2vpNly9Tj0uk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZHcm2vpNly9Tj0uk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZHcm2vpNly9Tj0uk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZHcm2vpNly9Tj0uk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZHcm2vpNly9Tj0uk .cluster text{fill:#333;}#mermaid-svg-ZHcm2vpNly9Tj0uk .cluster span{color:#333;}#mermaid-svg-ZHcm2vpNly9Tj0uk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZHcm2vpNly9Tj0uk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZHcm2vpNly9Tj0uk rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZHcm2vpNly9Tj0uk .icon-shape,#mermaid-svg-ZHcm2vpNly9Tj0uk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZHcm2vpNly9Tj0uk .icon-shape p,#mermaid-svg-ZHcm2vpNly9Tj0uk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZHcm2vpNly9Tj0uk .icon-shape .label rect,#mermaid-svg-ZHcm2vpNly9Tj0uk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZHcm2vpNly9Tj0uk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZHcm2vpNly9Tj0uk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZHcm2vpNly9Tj0uk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ECC → S/4 HANA 核心变革全景
维度1:数据库层变革
维度2:数据模型重构
维度3:开发范式变革
维度4:过时语法清单
维度5:学习路径规划
行存 → 列存+内存
磁盘 I/O → 内存计算
10-100 倍查询性能
多表 JOIN → ACDOCA 统一表
BKPF+BSEG+ANLA+COSPC
全部合并到一张表
过程式+BAdI+RFC → 声明式+CDS+OData
Dynpro+ALV → Fiori Elements
开发周期缩短 60%
LOOP AT → FOR+GROUP BY
IF 嵌套 → SWITCH/COND
CONCATENATE → 字符串模板
阶段1:入门 1-2 周
阶段2:进阶 3-4 周
阶段3:精通 4-6 周
版本说明 :本篇覆盖 S/4 HANA 2020~2023 版本的架构变革,ABAP 7.55~7.58 新语法。前面 28 篇基于 ECC 6.0 的代码在 S/4 HANA 中80% 可直接运行(向下兼容),但 CDS/AMDP/OData 是 S/4 独有的特性,ECC 6.0 里没有。
一、ECC vs S/4 HANA 核心架构差异
1.1 三层架构对比
| 维度 | SAP ECC 6.0 | SAP S/4 HANA | 核心差异 |
|---|---|---|---|
| 数据库 | Oracle/DB2/SQL Server(行存) | HANA(内存列存) | 列式+内存 = 10-100 倍查询性能 |
| ABAP 运行时 | NetWeaver 7.01~7.51 | ABAP Platform 2020~2023 | 支持 7.50+ 新语法 + ABAP for HANA |
| 前端 | Dynpro + Webdynpro + ALV | Fiori Elements(注解驱动) | CDS 视图 → 自动生成 OData → 自动生成 UI |
| 数据模型 | BKPF+BSEG+BSIK...(多表) | ACDOCA(统一凭证表) | FI+AA+CO 合并到一张表! |
| 事务码 | SE16N / MIGO / MM01 | Fiori App(命名空间 S/4HANA) | 事务码仍可用,但官方推荐 Fiori |
| 性能优化核心 | FOR ALL ENTRIES + 索引优化 | CDS 视图 + AMDP + 列式计算 | 索引不再是瓶颈 |
| 开发周期 | 10-20 天(传统 ABAP) | 2-5 天(CDS+Fiori) | Fiori 注解驱动自动生成 UI |
1.2 ACDOCA 统一凭证表详解
#mermaid-svg-OxiE6tl1EaMVYfrM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OxiE6tl1EaMVYfrM .error-icon{fill:#552222;}#mermaid-svg-OxiE6tl1EaMVYfrM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OxiE6tl1EaMVYfrM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OxiE6tl1EaMVYfrM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OxiE6tl1EaMVYfrM .marker.cross{stroke:#333333;}#mermaid-svg-OxiE6tl1EaMVYfrM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OxiE6tl1EaMVYfrM p{margin:0;}#mermaid-svg-OxiE6tl1EaMVYfrM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OxiE6tl1EaMVYfrM .cluster-label text{fill:#333;}#mermaid-svg-OxiE6tl1EaMVYfrM .cluster-label span{color:#333;}#mermaid-svg-OxiE6tl1EaMVYfrM .cluster-label span p{background-color:transparent;}#mermaid-svg-OxiE6tl1EaMVYfrM .label text,#mermaid-svg-OxiE6tl1EaMVYfrM span{fill:#333;color:#333;}#mermaid-svg-OxiE6tl1EaMVYfrM .node rect,#mermaid-svg-OxiE6tl1EaMVYfrM .node circle,#mermaid-svg-OxiE6tl1EaMVYfrM .node ellipse,#mermaid-svg-OxiE6tl1EaMVYfrM .node polygon,#mermaid-svg-OxiE6tl1EaMVYfrM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OxiE6tl1EaMVYfrM .rough-node .label text,#mermaid-svg-OxiE6tl1EaMVYfrM .node .label text,#mermaid-svg-OxiE6tl1EaMVYfrM .image-shape .label,#mermaid-svg-OxiE6tl1EaMVYfrM .icon-shape .label{text-anchor:middle;}#mermaid-svg-OxiE6tl1EaMVYfrM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OxiE6tl1EaMVYfrM .rough-node .label,#mermaid-svg-OxiE6tl1EaMVYfrM .node .label,#mermaid-svg-OxiE6tl1EaMVYfrM .image-shape .label,#mermaid-svg-OxiE6tl1EaMVYfrM .icon-shape .label{text-align:center;}#mermaid-svg-OxiE6tl1EaMVYfrM .node.clickable{cursor:pointer;}#mermaid-svg-OxiE6tl1EaMVYfrM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OxiE6tl1EaMVYfrM .arrowheadPath{fill:#333333;}#mermaid-svg-OxiE6tl1EaMVYfrM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OxiE6tl1EaMVYfrM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OxiE6tl1EaMVYfrM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OxiE6tl1EaMVYfrM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OxiE6tl1EaMVYfrM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OxiE6tl1EaMVYfrM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OxiE6tl1EaMVYfrM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OxiE6tl1EaMVYfrM .cluster text{fill:#333;}#mermaid-svg-OxiE6tl1EaMVYfrM .cluster span{color:#333;}#mermaid-svg-OxiE6tl1EaMVYfrM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OxiE6tl1EaMVYfrM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OxiE6tl1EaMVYfrM rect.text{fill:none;stroke-width:0;}#mermaid-svg-OxiE6tl1EaMVYfrM .icon-shape,#mermaid-svg-OxiE6tl1EaMVYfrM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OxiE6tl1EaMVYfrM .icon-shape p,#mermaid-svg-OxiE6tl1EaMVYfrM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OxiE6tl1EaMVYfrM .icon-shape .label rect,#mermaid-svg-OxiE6tl1EaMVYfrM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OxiE6tl1EaMVYfrM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OxiE6tl1EaMVYfrM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OxiE6tl1EaMVYfrM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ECC 旧模型
BKPF+BSEG+BSIK
ANLA+ANLB+ANLC
COSTE+COSPC+CEPC
S/4 HANA 新模型
ACDOCA 一张表
FI+AA+CO 全部合并
一次 SELECT 返回
所有维度字段
性能提升 10-50 倍
S/4 HANA 最核心的数据模型变革:ACDOCA
ECC 旧模型(FI 凭证拆成 4 张表):
BKPF(凭证头)→ BSEG(行项目)→ BSIK/BSAD(未清/已清)
+ AA 资产:ANLA + ANLB + ANLC(3 张表)
+ CO 成本:COSTE + COSPC + CEPC + COSL(4 张表)
总计:一张"费用凭证"可能涉及 10+ 张表的 JOIN!
S/4 HANA 新模型(全部合并到 ACDOCA 一张表):
┌──────────────────────────────────────────────────────┐
│ ACDOCA(Accounting Document Line Item) │
│ → 凭证头字段:BELNR / BUKRS / FISCYEAR / DOCNR │
│ → 行项目字段:DOCLN / HSL / WSL / TSL(3 种货币) │
│ → FI 维度:SAKNR / BILLCK / TAX... │
│ → AA 维度:ANLN1 / ANLN2 / AFABE... │
│ → CO 维度:KOSTL / PRCTR / AUFNR / KSTRG... │
│ → 扩展维度:SEGMENT / VBUND / PPRCTR... │
│ → 全部在一张表里! │
└──────────────────────────────────────────────────────┘
ECC FOR ALL ENTRIES 三层 JOIN(第四十三篇的 FI 凭证增强):
BKPF → BSEG → 反查 COSTE → 反查 CEPC
需要 3-4 次 DB 往返
S/4 用 ACDOCA 的写法(一次查询搞定):
SELECT bukrs, kostl, prctr, hsl INTO TABLE @lt_result
FROM acdoca
WHERE bukrs = '1000' AND fyear = 2026 AND perio = '03'.
一次查询返回所有维度!性能提升 10-50 倍!
二、过时语法 vs 新语法 对照
2.1 高频场景对照(前面 28 篇代码的 S/4 迁移)
abap
"=======================================================================
" 场景1:内表遍历 + 条件筛选
" 第四十三篇 FAGL_POSTING_BADI_50 里大量用到
"=======================================================================
" ❌ ECC 旧写法(过程式)
LOOP AT lt_items INTO DATA(ls_item).
IF ls_item-kontakte >= 1000.
APPEND ls_item TO lt_filtered.
ENDIF.
ENDLOOP.
" 代码量:5 行 / 可读性:中
" ✅ S/4 新写法(FOR + WHERE 声明式)
lt_filtered = VALUE #(
FOR ls_item IN lt_items
WHERE ( kontakte >= 1000 )
( ls_item ) ).
" 代码量:4 行 / 可读性:高(一目了然"从 lt_items 里筛选 kontakte>=1000 的")
"=======================================================================
" 场景2:结构赋值 + 自动匹配字段
" 第四十五篇清账逻辑里大量用到
"=======================================================================
" ❌ ECC 旧写法(手动赋值)
DATA: ls_target TYPE ty_target.
MOVE-CORRESPONDING ls_source TO ls_target.
ls_target-belnr = ls_source-belnr.
ls_target-kostl = ls_source-kostl.
" 代码量:4 行 / 容易漏字段
" ✅ S/4 新写法(CORRESPONDING 自动匹配同名字段)
DATA(ls_target) = CORRESPONDING ty_target( ls_source ).
" 代码量:1 行 / 自动匹配所有同名字段!
"=======================================================================
" 场景3:条件表达式(IF→CASE→IF 的嵌套)
" 第五十二篇利润表科目归类里大量用到
"=======================================================================
" ❌ ECC 旧写法(IF 嵌套)
DATA lv_type TYPE char1.
IF ls_hkont+0(1) = '4'.
lv_type = 'R'. " Revenue
ELSEIF ls_hkont+0(1) = '5'.
lv_type = 'C'. " Cost
ELSEIF ls_hkont+0(1) = '6'.
lv_type = 'E'. " Expense
ELSE.
lv_type = 'O'. " Other
ENDIF.
" 代码量:10 行 / 嵌套难读
" ✅ S/4 新写法(SWITCH 多分支)
DATA(lv_type) = SWITCH #( ls_hkont+0(1)
WHEN '4' THEN 'R'
WHEN '5' THEN 'C'
WHEN '6' THEN 'E'
WHEN OTHERS THEN 'O' ).
" 代码量:7 行 / 扁平结构易读
"=======================================================================
" 场景4:字符串拼接(CONCATENATE)
" 前面 28 篇 BCS 邮件里大量用到
"=======================================================================
" ❌ ECC 旧写法(CONCATENATE + 多次追加)
DATA lv_body TYPE string.
CONCATENATE '<html><body>'
'<h4>预算预警</h4>'
'预算对象:' ls_obj
'已占用:' lv_used
'预算上限:' lv_limit
INTO lv_body.
CONCATENATE lv_body '</body></html>' INTO lv_body.
" 代码量:7 行 / 多次 CONCATENATE 繁琐
" ✅ S/4 新写法(字符串模板 |{ }|)
DATA(lv_body) = |<html><body>
<h4>预算预警</h4>
预算对象:{ ls_obj }<br>
已占用:{ lv_used CURRENCY = 'CNY' }<br>
预算上限:{ lv_limit CURRENCY = 'CNY' }
</body></html>|.
" 代码量:5 行 / 嵌入变量、带换行、带 CURRENCY 格式化!
"=======================================================================
" 场景5:内表聚合(COLLECT + SUM)
" 第五十一篇月结年结里大量用到
"=======================================================================
" ❌ ECC 旧写法(COLLECT + READ TABLE)
COLLECT ls_line INTO lt_agg.
READ TABLE lt_agg INTO ls_agg WITH KEY belnr = ls_line-belnr.
ls_agg-amount = ls_agg-amount + ls_line-amount.
MODIFY lt_agg FROM ls_agg INDEX sy-tabix.
" ✅ S/4 新写法(FOR + GROUP BY + REDUCE 聚合)
lt_agg = VALUE #(
FOR ls_line IN lt_raw
GROUP BY ( belnr = ls_line-belnr )
( belnr = ls_line-belnr
amount = REDUCE curr15(
INIT amt = 0
FOR lls IN lt_raw WHERE ( belnr = ls_line-belnr )
NEXT amt = amt + lls-amount ) ) ).
" 代码量:更少 / 声明式聚合,不用手动写 COLLECT 逻辑
2.2 ATC 检查工具 + 过时语法扫描
S/4 HANA 官方代码检查工具:ABAP Test Cockpit(ATC)
配置事务码:ATC → Check Variant → Create
推荐 Variant:
① ABAP Language Version Check(检查 ECC→S/4 语法兼容)
② Performance Check(检查 FOR ALL ENTRIES 全表扫描)
③ Security Check(检查硬编码密码、SQL 注入)
④ Obsolete Statement Check(检查废弃语法)
ECC 代码迁移到 S/4 前,必须跑 ATC:
1. SE38 → 运行 Z_ATC_RUN_FOR_MY_PACKAGE
2. 检查报告里的 "Critical" 级别问题(必须改)
3. 检查报告里的 "Info" 级别问题(建议改)
4. 第五十九篇(迁移指南)详解 ATC 使用
三、S/4 HANA 新开发范式(CDS → OData → Fiori)
3.1 完整开发链路对比
#mermaid-svg-N9AnOdvYFGGdnnbQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N9AnOdvYFGGdnnbQ .error-icon{fill:#552222;}#mermaid-svg-N9AnOdvYFGGdnnbQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N9AnOdvYFGGdnnbQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .marker.cross{stroke:#333333;}#mermaid-svg-N9AnOdvYFGGdnnbQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N9AnOdvYFGGdnnbQ p{margin:0;}#mermaid-svg-N9AnOdvYFGGdnnbQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .cluster-label text{fill:#333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .cluster-label span{color:#333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .cluster-label span p{background-color:transparent;}#mermaid-svg-N9AnOdvYFGGdnnbQ .label text,#mermaid-svg-N9AnOdvYFGGdnnbQ span{fill:#333;color:#333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .node rect,#mermaid-svg-N9AnOdvYFGGdnnbQ .node circle,#mermaid-svg-N9AnOdvYFGGdnnbQ .node ellipse,#mermaid-svg-N9AnOdvYFGGdnnbQ .node polygon,#mermaid-svg-N9AnOdvYFGGdnnbQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N9AnOdvYFGGdnnbQ .rough-node .label text,#mermaid-svg-N9AnOdvYFGGdnnbQ .node .label text,#mermaid-svg-N9AnOdvYFGGdnnbQ .image-shape .label,#mermaid-svg-N9AnOdvYFGGdnnbQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-N9AnOdvYFGGdnnbQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N9AnOdvYFGGdnnbQ .rough-node .label,#mermaid-svg-N9AnOdvYFGGdnnbQ .node .label,#mermaid-svg-N9AnOdvYFGGdnnbQ .image-shape .label,#mermaid-svg-N9AnOdvYFGGdnnbQ .icon-shape .label{text-align:center;}#mermaid-svg-N9AnOdvYFGGdnnbQ .node.clickable{cursor:pointer;}#mermaid-svg-N9AnOdvYFGGdnnbQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .arrowheadPath{fill:#333333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N9AnOdvYFGGdnnbQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N9AnOdvYFGGdnnbQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N9AnOdvYFGGdnnbQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N9AnOdvYFGGdnnbQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N9AnOdvYFGGdnnbQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N9AnOdvYFGGdnnbQ .cluster text{fill:#333;}#mermaid-svg-N9AnOdvYFGGdnnbQ .cluster span{color:#333;}#mermaid-svg-N9AnOdvYFGGdnnbQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N9AnOdvYFGGdnnbQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N9AnOdvYFGGdnnbQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-N9AnOdvYFGGdnnbQ .icon-shape,#mermaid-svg-N9AnOdvYFGGdnnbQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N9AnOdvYFGGdnnbQ .icon-shape p,#mermaid-svg-N9AnOdvYFGGdnnbQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N9AnOdvYFGGdnnbQ .icon-shape .label rect,#mermaid-svg-N9AnOdvYFGGdnnbQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N9AnOdvYFGGdnnbQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N9AnOdvYFGGdnnbQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N9AnOdvYFGGdnnbQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需求:FI 凭证过账时检查预算 + 审批
ECC 传统开发 15-20 天
S/4 HANA 新范式 3-5 天
SE11 建透明表
SE37 写 RFC
SE18 实现 BAdI
SE38 写 ALV 报表
ADT 建 CDS 视图
BDEF 行为定义
自动生成 OData Service
Fiori Elements 自动 UI
ECC 传统开发(第四十三篇 FI 凭证增强):
┌──────────────────────────────────────────────────────┐
│ 需求:FI 凭证过账时检查预算 │
│ │
│ Step 1:建配置表 ZT_BUDGET_HEADER(SE11 → 透明表) │
│ Step 2:写 RFC 函数 Z_RFC_BUDGET_CHECK(SE37) │
│ Step 3:实现 BAdI ZIMPL_BUDGET_CONTROL(SE18) │
│ Step 4:写 ALV 报表 Z_BUDGET_MONITOR(SE38) │
│ Step 5:测试 → 部署 │
│ │
│ 总耗时:15-20 天 │
│ UI:ALV(传统表格,颜色标记+按钮) │
│ 性能:FOR ALL ENTRIES 3 层查询 → 100ms │
└──────────────────────────────────────────────────────┘
S/4 HANA 新范式开发:
┌──────────────────────────────────────────────────────┐
│ 需求:FI 凭证过账时检查预算 + Fiori 审批 │
│ │
│ Step 1:建 CDS 视图 Z_Budget_Header(比透明表更灵活) │
│ Step 2:定义 BDEF 行为(Budget Check + Approve) │
│ Step 3:CDS 视图自动生成 OData Service │
│ Step 4:Fiori Elements 注解驱动自动生成 UI │
│ Step 5:测试 → 部署 │
│ │
│ 总耗时:3-5 天 │
│ UI:Fiori Elements(响应式+钻取+审批状态可视化) │
│ 性能:CDS Join 一次查询 → 10ms(HANA 列式计算) │
└──────────────────────────────────────────────────────┘
3.2 CDS 视图 vs SE11 透明表 对照
| 维度 | SE11 透明表(ECC) | CDS 视图(S/4) | 核心差异 |
|---|---|---|---|
| 创建方式 | SE11 → Create → Transparent Table | ADT → New Data Definition | CDS 是代码+注解声明式 |
| 数据源 | 物理表 | 透明表 + 其他 CDS 视图 JOIN | CDS 可组合其他视图 |
| 聚合计算 | 必须在 ABAP 代码里 COLLECT | 在 CDS 定义里写 SUM/GROUP BY | CDS 在 DB 层计算,更快 |
| 参数化 | 用 SELECT-OPTIONS | PARAMETERS 关键字,Fiori 自动生成筛选栏 | Fiori 自动适配 |
| 扩展字段 | 需要追加结构 CI_* | EXTEND VIEW ... ADD FIELDS | 无需 SE11 |
| OData | 无(需自建 Service Builder) | 自动生成(注解 @OData.publish: true) | 零代码 |
| Fiori UI | 无(需自建 Webdynpro) | 注解 @UI.lineItem/@UI.selectionField 自动生成 | 零代码 |
四、从 ECC 到 S/4:前面 28 篇代码改造清单
4.1 高频改造场景
| ECC 代码位置 | 改造内容 | S/4 替代方案 | 性能提升 |
|---|---|---|---|
| 第四十三篇 FAGL_POSTING_BADI_50 | FOR ALL ENTRIES 3 层 JOIN | CDS 视图 Z_FI_CO_JOIN(一次查询) | 5-10× |
| 第四十五篇 自动清账 | BAPI_OPENITEM_CLEAR_FROM_DATA | 仍可用,但数据源从 BSIK→ACDOCA | 3-5× |
| 第五十二篇 Z_BALANCE_SHEET | FOR ALL ENTRIES 查 FAGLFLEXT | CDS 视图 Z_Segment_Balance(CDS 内部聚合) | 10-20× |
| 第四十八篇 折旧计算 | BADI_FA_CALCULATE | 仍可用,但数据源从 ANLC→ACDOCA-ANLN1 | 2-3× |
| 第四十九篇 Z_RFC_EXPENSE_CREATE | RFC + FOR ALL ENTRIES | OData Service + CDS | 3-5× |
| 第五十三篇 接口加密 | CL_HTTP_CLIENT + Z_SM4_ENCRYPT | 仍可用(HTTP 客户端不变) | 0 |
4.2 不必改造的场景
#mermaid-svg-FGHaavl6eIuVRkK6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FGHaavl6eIuVRkK6 .error-icon{fill:#552222;}#mermaid-svg-FGHaavl6eIuVRkK6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FGHaavl6eIuVRkK6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FGHaavl6eIuVRkK6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FGHaavl6eIuVRkK6 .marker.cross{stroke:#333333;}#mermaid-svg-FGHaavl6eIuVRkK6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FGHaavl6eIuVRkK6 p{margin:0;}#mermaid-svg-FGHaavl6eIuVRkK6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FGHaavl6eIuVRkK6 .cluster-label text{fill:#333;}#mermaid-svg-FGHaavl6eIuVRkK6 .cluster-label span{color:#333;}#mermaid-svg-FGHaavl6eIuVRkK6 .cluster-label span p{background-color:transparent;}#mermaid-svg-FGHaavl6eIuVRkK6 .label text,#mermaid-svg-FGHaavl6eIuVRkK6 span{fill:#333;color:#333;}#mermaid-svg-FGHaavl6eIuVRkK6 .node rect,#mermaid-svg-FGHaavl6eIuVRkK6 .node circle,#mermaid-svg-FGHaavl6eIuVRkK6 .node ellipse,#mermaid-svg-FGHaavl6eIuVRkK6 .node polygon,#mermaid-svg-FGHaavl6eIuVRkK6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FGHaavl6eIuVRkK6 .rough-node .label text,#mermaid-svg-FGHaavl6eIuVRkK6 .node .label text,#mermaid-svg-FGHaavl6eIuVRkK6 .image-shape .label,#mermaid-svg-FGHaavl6eIuVRkK6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-FGHaavl6eIuVRkK6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FGHaavl6eIuVRkK6 .rough-node .label,#mermaid-svg-FGHaavl6eIuVRkK6 .node .label,#mermaid-svg-FGHaavl6eIuVRkK6 .image-shape .label,#mermaid-svg-FGHaavl6eIuVRkK6 .icon-shape .label{text-align:center;}#mermaid-svg-FGHaavl6eIuVRkK6 .node.clickable{cursor:pointer;}#mermaid-svg-FGHaavl6eIuVRkK6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FGHaavl6eIuVRkK6 .arrowheadPath{fill:#333333;}#mermaid-svg-FGHaavl6eIuVRkK6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FGHaavl6eIuVRkK6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FGHaavl6eIuVRkK6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FGHaavl6eIuVRkK6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FGHaavl6eIuVRkK6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FGHaavl6eIuVRkK6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FGHaavl6eIuVRkK6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FGHaavl6eIuVRkK6 .cluster text{fill:#333;}#mermaid-svg-FGHaavl6eIuVRkK6 .cluster span{color:#333;}#mermaid-svg-FGHaavl6eIuVRkK6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FGHaavl6eIuVRkK6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FGHaavl6eIuVRkK6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-FGHaavl6eIuVRkK6 .icon-shape,#mermaid-svg-FGHaavl6eIuVRkK6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FGHaavl6eIuVRkK6 .icon-shape p,#mermaid-svg-FGHaavl6eIuVRkK6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FGHaavl6eIuVRkK6 .icon-shape .label rect,#mermaid-svg-FGHaavl6eIuVRkK6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FGHaavl6eIuVRkK6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FGHaavl6eIuVRkK6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FGHaavl6eIuVRkK6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 前面 28 篇代码
80% 直接可用
15% 需小改
5% 需重写
BAdI 实现类
RFC 函数
ZT_* 配置表 40+ 张
BAPI_ACC_DOCUMENT_POST
FOR ALL ENTRIES → CDS
BSEG → ACDOCA
过时语法替换
集群表 ANLA/COSTE
不能直接 INSERT/UPDATE
必须用 BAPI
不必改造的场景:
✅ BAdI 实现类
→ BADI_BADI_... 接口定义在 S/4 中保持兼容,旧代码可直接运行
✅ RFC 函数
→ 远程函数接口不变,外部系统调用无感知
✅ 自定义配置表(ZT_* 系列 40+ 张)
→ 透明表 SE11 创建,S/4 完全兼容,无需改造
✅ BAPI_ACC_DOCUMENT_POST
→ 函数签名不变,内部实现 S/4 优化过(更快)
✅ ALV 报表
→ CL_SALV_TABLE 仍可用,但推荐迁移到 Fiori Elements
五、学习路径规划(分 3 阶段)
5.1 阶段 1:入门(1-2 周)
阶段目标:理解架构 + 识别过时代码
Day 1-2:HANA 架构 vs ECC 架构
→ 列式存储 vs 行式存储(看 HANA 官方白皮书)
→ ACDOCA 统一凭证表(对比 BSEG 多表)
→ 索引不再是瓶颈(HANA 自动最优查询)
Day 3-4:跑 ATC 检查
→ 事务码 ATC → 创建 Check Variant
→ 检查自己维护的包
→ 解读检查报告里的 Critical 级别问题
Day 5-7:找出可以立即用 CDS 重写的场景
→ 前面 28 篇里的 FOR ALL ENTRIES 查询
→ 找 1-2 个典型场景(如第五十二篇 Z_BALANCE_SHEET)
→ 看 S/4 Fiori App 的 CDS 定义(SE16N → 输入 CDS 名称)
推荐资源:
→ SAP Help Portal:S/4 HANA Architecture Guide
→ ABAP for HANA Cookbook(SAP Press)
5.2 阶段 2:进阶(3-4 周)
阶段目标:掌握 S/4 新特性语法 + CDS + AMDP
Week 1:ABAP 7.4+/7.50+ 新语法(第五十五篇详解)
→ FOR + WHERE + GROUP BY(内表遍历)
→ CORRESPONDING # / VALUE # / REDUCE(结构赋值/聚合)
→ COND / SWITCH(条件表达式)
→ |{ }|(字符串模板 + 格式化)
→ INLINE 声明(DATA(ls_var))
Week 2:CDS 视图(第五十六篇详解)
→ 创建 CDS 视图(ADT → New Data Definition)
→ 关联定义(ASSOCIATION)
→ 聚合计算(GROUP BY + SUM)
→ 参数视图(PARAMETERS)
→ 注解(@UI / @OData / @Metadata)
→ 发布成 OData Service
Week 3-4:AMDP(第五十七篇详解)
→ 创建 AMDP 类(SE24 → Add-on → AMDP)
→ SQLScript 嵌入语法
→ 表函数(Table Function)
→ 调用 HANA 原生函数(CE_CALC / CE_PROJECTION)
→ 性能测试 vs FOR ALL ENTRIES
推荐资源:
→ ABAP Development Tools(ADT)官方教程
→ CDS Views - SAP Community Tutorials
→ SAP HANA SQLScript Reference
5.3 阶段 3:精通(4-6 周)
阶段目标:Fiori Elements + 迁移实战
Week 1-2:OData + BDEF + Fiori Elements(第五十八篇详解)
→ CDS → OData 自动生成
→ BDEF 行为定义(CRUD + Draft + Approval)
→ Fiori Elements 注解驱动 UI 生成
→ 权限控制(DCL Data Control Language)
Week 3-4:ECC→S/4 迁移(第五十九篇详解)
→ ATC 全包扫描
→ 过时语法替换
→ 集群表适配(ANLA→ACDOCA / BSIK→ACDOCA)
→ 性能基准测试
→ 坑点排查(字段长度变化/事务码废弃)
Week 5-6:项目落地 + 性能调优
→ 选 1-2 个核心场景重写(如 FAGL_POSTING_BADI_50 + CDS)
→ 性能基准测试(ECC vs S/4 对比报告)
→ 团队培训
→ 写内部规范
推荐资源:
→ SAP Activate Methodology(S/4 HANA 实施方法论)
→ SAP Transformation Navigator(迁移路径规划工具)
→ Fiori Elements - SAP Community Tutorials
六、常见问题与排查
-
Q1:ECC 代码在 S/4 里能直接跑吗?
A:80% 以上能直接跑,20% 需要改 。原因:①S/4 保持了 99% 的 ABAP 语法向下兼容 ------旧的 FOR ALL ENTRIES / LOOP AT / IF 嵌套继续可用,只是有警告;②ACDOCA 替代了多表 ------如果代码硬查 BSEG/BKPF,S/4 里这些表还是存在(兼容视图),但性能不如直接查 ACDOCA;③集群表废弃 ------前面 28 篇里用到的 ANLA/ANLB/ANLC/COSTE/COSPC 这些 S/4 里变成了兼容视图(底层查 ACDOCA),SE11 还能看,但不能直接写 INSERT/UPDATE(必须用 BAPI)。
-
Q2:为什么要学 CDS 视图?SE11 透明表不够用吗?
A:CDS 不是替代透明表,是替代"SE11 建表+ABAP 写查询" 。对比:①透明表 是物理存储结构(SE11 Create → Transparent Table),需要定义数据元素/域/表字段才能存数据;②CDS 视图 是逻辑虚拟结构(ADT → New Data Definition),不存数据 ,运行时从底表/其他视图 JOIN 计算。CDS 的优势:①一次定义,多端复用 (CDS → 自动 OData → 自动 Fiori UI → 自动 Mobile App);②聚合计算在 DB 层完成 (SUM/GROUP BY 在 CDS 定义里写,DB 计算比 ABAP 快 10-50 倍);③注解驱动(@UI.selectionField 自动成为 Fiori 筛选栏,零 UI 代码)。
-
Q3:AMDP 是什么?和 FOR ALL ENTRIES 什么关系?
A:AMDP(ABAP Managed Database Procedure)是 ABAP 里嵌入 SQLScript 的技术 。FOR ALL ENTRIES 在 ECC 里是为了减少 DB 往返次数 (把 N 次 SELECT 变成 1 次 SELECT ... WHERE prctr IN ( lt_prctr-prctr )),在 HANA 里列式存储本身就是为并行计算设计的 ------FOR ALL ENTRIES 在 HANA 上比 ECC 快,但 AMDP 可以调用 HANA 原生函数(CE_CALC 矩阵运算、CE_PROJECTION 列投影),复杂算法快 10-100 倍。适合场景:大数据量统计(百万行以上)、复杂数学计算(矩阵/向量)、实时预测。
-
Q4:学习 S/4 HANA 要不要先学 Fiori 前端?
A:不必 。S/4 HANA 新范式的核心是注解驱动开发 ------CDS 视图里写一个注解 @UI.selectionField,Fiori Elements 自动生成选择屏幕;写 @OData.publish: true,自动生成 OData Service;写 BDEF 行为定义,自动生成 CRUD 逻辑。前端代码一行都不用写(除非要做复杂的自定义 UI)。ABAP 开发者只需要会写 CDS + BDEF,就能生成一个完整的 Fiori 页面。
-
Q5:从 ECC 升级到 S/4 要改多少代码?
A:官方统计:平均 15-20% 自定义代码需要改造 。原因:①废弃语法 (ATC Critical 级别问题)约占 10%,需要替换成新语法;②集群表适配 (ANLA/BSIK 等变成兼容视图,不能直接 INSERT/UPDATE)约占 5%;③性能优化 (FOR ALL ENTRIES → CDS/AMDP)约占 5%。前面 28 篇的代码改造量约 10-15%------主要是 FOR ALL ENTRIES 替换成 CDS,BSEG 替换成 ACDOCA,语法用 SWITCH/COND/CORRESPONDING 简化。
-
Q6:S/4 HANA Fiori 和传统 Dynpro ALV 能共存吗?
A:完全可以共存,而且 SAP 官方就是这么设计的 。S/4 HANA 提供了经典应用兼容模式 :传统事务码(SE16N / MIGO / MM01)默认打开 Fiori 界面,但可以通过 SU3 设置参数 WDDISABLED='X' 切回经典 Dynpro 界面。企业可以渐进式迁移:新开发用 Fiori,旧代码继续跑 Dynpro。前面 28 篇的 ALV 报表(CL_SALV_TABLE)在 S/4 里继续可用,只是 UI 还是传统表格风格,不如 Fiori Elements 的响应式界面好看。
总结
S/4 HANA vs ECC 五大核心差异
| 维度 | ECC 传统 | S/4 HANA | 核心收益 |
|---|---|---|---|
| 数据库 | 行存 + 磁盘 | 列存 + 内存 | 查询性能 10-100 倍 |
| 数据模型 | 多表 JOIN(ACDOCA 前) | 统一凭证表 ACDOCA | 减少 80% 关联复杂度 |
| 开发范式 | 过程式 + BAdI + RFC | 声明式 + CDS + OData | 开发周期缩短 60% |
| UI | Dynpro + ALV | Fiori Elements(注解驱动) | 零 UI 代码 |
| 语法 | LOOP AT / IF 嵌套 | FOR + SWITCH + 字符串模板 | 代码量减少 30% |
学习路径 3 阶段速查
| 阶段 | 周期 | 核心内容 | 产出 |
|---|---|---|---|
| 入门 | 1-2 周 | HANA 架构 + ATC 扫描 | 代码改造清单 |
| 进阶 | 3-4 周 | ABAP 新语法 + CDS + AMDP | 2-3 个 CDS 视图 |
| 精通 | 4-6 周 | OData + BDEF + Fiori + 迁移 | 1-2 个项目场景重写 |
本篇与后续的衔接
| 本篇(架构入门) | 下一篇(新语法实战) | 后续(CDS/AMDP/OData/迁移) |
|---|---|---|
| 架构差异 | FOR + SWITCH + 字符串模板 | CDS 关联/聚合/注解 |
| 过时语法识别 | 场景化对照(前面 28 篇代码) | AMDP SQLScript 嵌入 |
| ATC 检查 | - | OData + BDEF + Fiori Elements |
| 学习路径 | - | ECC→S/4 迁移指南 |
S/4 HANA 新特性系列预告(6 篇):
- 第五十四篇 ✅ 本篇入门:架构 + 过时语法 + 学习路径
- 第五十五篇:ABAP 7.40+/7.50+ 新语法实战(FOR/COND/CORRESPONDING/字符串模板)
- 第五十六篇:CDS 视图进阶(关联/聚合/注解/参数视图)
- 第五十七篇:AMDP 开发实战(SQLScript + 表函数 + HANA 原生调用)
- 第五十八篇:OData + Fiori Elements 适配开发(BDEF + 注解驱动 UI)
- 第五十九篇:ECC→S/4 HANA 迁移指南(ATC + 过时语法替换 + 性能优化)
作者 :爱喝水的鱼丶
版本记录:2026 年 10 月
💬 你们公司是在 S/4 HANA 吗?从 ECC 升级过来的还是直接上的 S/4?代码改造量大概多少?用 CDS 重写过 FOR ALL ENTRIES 吗?AMDP 实际用在什么场景?欢迎分享你的 S/4 HANA 开发经验。