SAP-ABAP:S/4 HANA ABAP 新特性入门:与 ECC ABAP 的核心差异、架构优势与学习路径规划

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 开发经验。

相关推荐
贵州诚鑫致达科技有限公司8 小时前
Linux的yum源怎么重启?源不是服务
linux·运维·服务器
余槐i8 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹8 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo8 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人9 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
遇印记9 小时前
传输层,网络层
运维·服务器·网络·windows·学习
品牌常新9 小时前
景区巡逻机器人怎么选?派宝S5全地形守护解析
运维·人工智能·机器人
Elastic 中国社区官方博客10 小时前
一条 ES|QL 查询,涵盖365天的审计日志:在热数据和可搜索快照上执行相同的搜索
大数据·运维·服务器·elasticsearch·搜索引擎·全文检索