SAP ABAP 常见问题 FAQ

作者:郑德鼎 约 25 分钟阅读 更新日期:2026-07-18 新发布 标签:ABAP, FAQ, 开发, 数据工程, 系统管理
目录

本文汇总了 SAP ABAP 开发中最常见的 23 个问题,按照语法基础、ALV 报表、性能优化、增强与 BADI、接口与集成五大类别进行组织,帮助开发人员快速定位并解决日常开发中的典型问题。

一、语法与基础

Q1:TYPE 和 LIKE 有什么区别?

TYPE 引用的是数据类型(Data Type),而 LIKE 引用的是已有数据对象(Data Object)。

  • TYPE:引用 ABAP 字典中的类型或自定义类型。例如 DATA: lv_matnr TYPE matnr,引用的是字典中定义的 MATNR 数据元素。
  • LIKE:引用某个已有变量或数据库表字段的结构。例如 DATA: lv_matnr LIKE mara-matnr,引用的是 MARA 表的 MATNR 字段。

在实际开发中,推荐优先使用 TYPE,因为它更明确地表达了数据类型的来源,且在类型定义变更时更容易追踪影响范围。LIKE 主要用于引用结构体或内表时保持一致性,如 DATA: ls_mara LIKE LINE OF gt_mara

Q2:什么时候用 FIELD-SYMBOLS,什么时候用数据引用(Data Reference)?

FIELD-SYMBOLS(字段符号)是 ABAP 中的指针/别名,不占用额外内存空间,直接指向目标数据对象。

  • 适用于:遍历内表(LOOP AT itab ASSIGNING <fs>)、动态访问结构体字段、修改内表行时避免复制开销。

数据引用(Data Reference)是通过 CREATE DATAGET REFERENCE OF 创建的指向数据对象的引用变量,类型为 REF TO data

  • 适用于:需要动态创建数据对象时(运行时才确定类型)、需要传递数据引用而非数据本身时、实现泛型编程时。

关键区别:FIELD-SYMBOLS 必须在声明时确定类型(或使用泛型),不能独立存储;数据引用可以存储在变量中、传递给方法、放入内表。

Q3:如何调试后台作业(Background Job)?

调试后台作业有以下几种常用方法:

  1. JDBG 事务码:在 SM37 中找到失败的后台作业,选中后输入 /nJDBG,系统会以调试模式重新执行该作业的程序。
  2. SM50 外部断点:在 SM50 中找到正在运行的后台工作进程,选择"程序"→"调试"即可进入调试。
  3. 硬编码无限循环:在程序中加入 DO. IF sy-subrc = 0. EXIT. ENDIF. ENDDO.,然后在 SM50 中调试该进程,修改条件变量跳出循环。
  4. 设置后台断点:在 SE38 或 ADT 中设置"后台断点"(Breakpoint → Set Breakpoint → Background),程序在后台执行时会触发。
Q4:ABAP 7.40+ 有哪些新语法特性?

ABAP 7.40 引入了大量现代化语法特性,显著提升了代码简洁性和可读性:

特性语法示例说明
内联声明DATA(lv_matnr) = lv_value.在表达式内声明变量
构造运算符VALUE #( matnr = '100001' )构造结构体或内表
CONV 运算符CONV matnr( lv_char )类型转换
CORRESPONDINGCORRESPONDING #( ls_source )结构体赋值(同名映射)
COND / SWITCHCOND #( WHEN lv_x = 'A' THEN 1 ELSE 0 )条件表达式
字符串模板|物料号: { lv_matnr ALPHA = OUT }|字符串插值
FOR 迭代VALUE #( FOR ls IN gt_itab ( ls-matnr ) )内表迭代构造
REDUCEREDUCE i( INIT s = 0 FOR i = 1 UNTIL i > 10 NEXT s = s + i )聚合运算
FILTERFILTER #( gt_itab USING KEY k1 WHERE col = 'X' )基于条件过滤内表
表表达式gt_itab[ matnr = '100001' ]-maktx直接通过键读取内表行
Q5:如何使用内联声明(Inline Declaration)?

内联声明是 ABAP 7.40 引入的重要特性,允许在赋值的同时声明变量,编译器自动推断类型:

" 基本变量内联声明 DATA(lv_count) = 0. " 类型为 I DATA(lv_name) = |ABAP|. " 类型为 STRING DATA(lv_date) = sy-datum. " 类型为 DATS " SELECT 结果内联声明 SELECT matnr, maktx FROM makt INTO TABLE @DATA(lt_makt) WHERE spras = @sy-langu. " 循环中内联声明 LOOP AT lt_makt INTO DATA(ls_makt). WRITE: / ls_makt-matnr, ls_makt-maktx. ENDLOOP. " 读取内表行内联声明 DATA(lv_maktx) = lt_makt[ matnr = '100001' ]-maktx. " 方法返回值内联声明 DATA(lv_result) = cl_some_class=>get_value( ).

注意事项:内联声明的变量作用域与声明位置相同(如 IF 块内声明的变量仅在该块内可见);不能在类的声明部分使用内联声明;字段符号使用 FIELD-SYMBOL(<fs>) 进行内联声明。

Q6:什么是 ABAP OO 中的事件(Events)?

ABAP 面向对象中的事件(Events)是类之间通信的机制。一个类可以触发(TRIGGER)事件,其他类可以注册为该事件的监听者(HANDLER)。

  • 定义事件:在类定义中声明 EVENTS: data_changed
  • 触发事件:在方法中使用 RAISE EVENT data_changed
  • 处理事件:在另一个类中定义 METHODS: on_data_changed FOR EVENT data_changed OF cl_sender,并通过 SET HANDLER on_data_changed FOR lo_sender 注册。

典型应用场景:ALV 事件处理(如 cl_gui_alv_griddata_changeddouble_click 等)、自定义框架中的观察者模式实现。

二、ALV 报表

Q7:如何创建 ALV Grid 报表?

创建 ALV Grid 报表有两种主要方式:

方式一:使用函数模块 REUSE_ALV_GRID_DISPLAY(传统方式)

DATA: lt_fieldcat TYPE slis_t_fieldcat_alv, ls_fieldcat TYPE slis_fieldcat_alv, ls_layout TYPE slis_layout_alv. " 构建字段目录 CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_structure_name = 'MARA' CHANGING ct_fieldcat = lt_fieldcat. " 设置布局 ls_layout-zebra = abap_true. ls_layout-colwidth_optimize = abap_true. " 显示 ALV CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_structure_name = 'MARA' is_layout = ls_layout it_fieldcat = lt_fieldcat TABLES t_outtab = gt_mara.

方式二:使用 CL_GUI_ALV_GRID 类(面向对象方式)

需要创建容器(cl_gui_custom_container)、ALV Grid 对象,并在 PBO 中调用 set_table_for_first_display 方法。OO 方式支持更丰富的交互功能(如单元格编辑、事件处理等),但需要创建屏幕。

Q8:REUSE_ALV_GRID_DISPLAY 和 CL_GUI_ALV_GRID 有什么区别?
对比项REUSE_ALV_GRID_DISPLAYCL_GUI_ALV_GRID
编程范式函数式面向对象
屏幕要求无需自定义屏幕需要自定义屏幕+容器
事件处理通过回调子程序(I_CALLBACK_PF_STATUS_SET 等)通过事件(double_click, data_changed 等)
单元格编辑不支持支持
单元格着色有限支持完全支持
多 ALV 同屏不支持支持(多个容器)
交互灵活性较低非常高
代码复杂度简单快速较复杂但功能更强
适用场景简单报表展示复杂交互式报表

建议:如果只需要展示数据,用 REUSE 函数即可快速实现;如果需要复杂交互(编辑、拖放、多ALV联动等),则必须使用 CL_GUI_ALV_GRID。

Q9:如何在 ALV 中添加自定义按钮?

添加自定义按钮的步骤如下:

  1. 复制标准 GUI 状态:在程序中使用 SET PF-STATUS 'STANDARD_FULLSCREEN' 从函数组 SALV 复制标准状态,然后添加自定义按钮。
  2. 设置回调:在 REUSE_ALV_GRID_DISPLAY 中指定 I_CALLBACK_PF_STATUS_SETI_CALLBACK_USER_COMMAND
" 自定义 GUI 状态 FORM pf_status_set USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'ZSTANDARD' EXCLUDING rt_extab. ENDFORM. " 处理用户命令 FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE r_ucomm. WHEN '&ZBTN'. " 自定义按钮功能码 " 执行自定义逻辑 PERFORM process_custom_action. ENDCASE. rs_selfield-refresh = abap_true. " 刷新 ALV ENDFORM. " 调用时传入回调 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_pf_status_set = 'PF_STATUS_SET' i_callback_user_command = 'USER_COMMAND' ...
Q10:如何处理 ALV 双击事件?

REUSE 方式:通过 I_CALLBACK_USER_COMMAND 回调处理:

FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE r_ucomm. WHEN '&IC1'. " ALV 标准双击功能码 READ TABLE gt_data INTO DATA(ls_data) INDEX rs_selfield-tabindex. IF sy-subrc = 0. " 跳转到 MM03 查看物料 SET PARAMETER ID 'MAT' FIELD ls_data-matnr. CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN. ENDIF. ENDCASE. ENDFORM.

CL_GUI_ALV_GRID 方式:注册事件 double_click

" 定义事件处理类 CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: on_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row e_column es_row_no. ENDCLASS. " 注册事件 SET HANDLER lo_handler->on_double_click FOR lo_grid.
Q11:如何修改 ALV 单元格颜色?

修改 ALV 单元格颜色需要在内表中添加一个特殊字段来存储颜色信息:

" 1. 在内表结构中添加颜色字段 TYPES: BEGIN OF ty_data, matnr TYPE matnr, maktx TYPE maktx, cell_color TYPE lvc_t_scol, " 单元格颜色表 END OF ty_data. " 2. 设置颜色信息 DATA: ls_color TYPE lvc_s_scol. ls_color-fname = 'MAKTX'. " 字段名 ls_color-color-col = 6. " 颜色代码(1-7) ls_color-color-int = 1. " 加粗 ls_color-color-inv = 0. " 反色 APPEND ls_color TO ls_data-cell_color. " 3. 在布局中指定颜色字段名 ls_layout-ctab_fname = 'CELL_COLOR'. " 颜色代码说明: " 1 = 灰蓝 2 = 浅灰 3 = 黄色 " 4 = 蓝绿 5 = 绿色 6 = 红色 7 = 粉红
Q12:如何实现 ALV 的数据修改和保存?

实现可编辑 ALV 需要以下关键步骤:

  1. 在字段目录中设置 ls_fieldcat-edit = abap_true 开启编辑模式。
  2. 注册 data_changed 事件和 data_changed_finished 事件。
  3. 调用 lo_grid->register_edit_event( cl_gui_alv_grid=>mc_evt_enter ) 注册回车事件。
  4. data_changed 事件处理方法中进行数据校验,使用 er_data_changed 参数的 mt_mod_cells 获取修改的单元格。
  5. 校验不通过时调用 er_data_changed->add_protocol_entry() 添加错误消息。
  6. 在用户命令中捕获保存按钮,将修改后的内表数据更新到数据库。

三、性能优化

Q13:如何避免 SELECT *?应该怎么做?

SELECT * 会从数据库读取所有字段,带来不必要的网络传输和内存消耗。应该明确列出所需字段:

" 不推荐 SELECT * FROM mara INTO TABLE @DATA(lt_mara) WHERE matnr IN @s_matnr. " 推荐 SELECT matnr, ersda, matkl FROM mara INTO TABLE @DATA(lt_mara) WHERE matnr IN @s_matnr. " 使用字段列表的好处: " 1. 减少数据库到应用服务器的数据传输量 " 2. 减少 ABAP 端内表的内存占用 " 3. 数据库可以更好地利用覆盖索引 " 4. 代码可读性更好,明确表达需要哪些字段

例外:如果确实需要所有字段(如通用数据提取程序),可以使用 SELECT *,但应评估是否真的有必要。

Q14:什么时候使用 FOR ALL ENTRIES?

FOR ALL ENTRIES 用于将内表中的值作为 WHERE 条件传入 SQL 语句,替代在 ABAP 层循环执行 SELECT:

" 先确保内表不为空,否则会读取全部数据 IF gt_mara IS NOT INITIAL. SELECT matnr, werks, lgort FROM mard INTO TABLE @DATA(lt_mard) FOR ALL ENTRIES IN @gt_mara WHERE matnr = @gt_mara-matnr. ENDIF.

使用注意事项

  • 内表为空时,FOR ALL ENTRIES 等价于没有 WHERE 条件,会读取全部数据——务必先检查内表是否为空。
  • 内表中重复的键值会被自动去重,可能影响结果集数量。
  • 数据库会自动将大数据量的 FOR ALL ENTRIES 分包执行,包大小由 rsdb/max_blocking_factor 参数控制。
  • 在 HANA 数据库上,优先考虑使用 JOIN 替代 FOR ALL ENTRIES,HANA 对 JOIN 的优化更好。
  • FOR ALL ENTRIES 不支持 LIKE、IN 子查询等操作。
Q15:如何使用内表的二级索引(Secondary Table Keys)?

ABAP 7.0 EhP2 引入了内表二级索引,可大幅提升内表查找性能:

" 定义带二级索引的内表 TYPES: BEGIN OF ty_item, vbeln TYPE vbeln, posnr TYPE posnr, matnr TYPE matnr, END OF ty_item, tt_item TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY vbeln posnr WITH NON-UNIQUE SORTED KEY k_matnr COMPONENTS matnr. DATA: gt_item TYPE tt_item. " 使用二级索引读取 DATA(lt_result) = FILTER #( gt_item USING KEY k_matnr WHERE matnr = '100001' ). " 使用二级索引循环 LOOP AT gt_item USING KEY k_matnr WHERE matnr = '100001' INTO DATA(ls_item). " ... ENDLOOP. " 使用二级索引读取单行 DATA(ls_found) = gt_item[ USING KEY k_matnr WHERE matnr = '100001' ].

二级索引类型:SORTED(排序索引,支持范围查询)和 HASH(哈希索引,仅支持等值查询)。二级索引在插入数据时有额外开销,适合读多写少的场景。

Q16:ABAP 表缓冲(Table Buffering)有哪些策略?

SAP 表缓冲是在应用服务器层缓存数据库表数据,减少数据库访问次数。有三种缓冲策略:

缓冲类型说明适用场景同步机制
完全缓冲(Full)整张表加载到缓冲区小且极少变化的表(如配置表 T000、T001)任何修改立即同步
通用缓冲(Generic)按通用键(前 n 个字段)缓冲按集团或组织维度访问的表(如 T001 按集团)按通用键区域同步
单记录缓冲(Single Record)仅缓冲被访问的单条记录大表但单条访问频繁(如客户主数据)按单条记录同步

注意事项:

  • 频繁更新的表不建议开启缓冲,同步开销会抵消性能收益。
  • 使用 BYPASSING BUFFER 可跳过缓冲区直接读数据库。
  • 使用 SELECT ... UP TO 1 ROWS 可能无法利用缓冲。
  • 可以通过 ST05 跟踪缓冲命中情况。
Q17:如何使用 ST05 进行 SQL 跟踪分析?

ST05 是 SAP 提供的 SQL 跟踪工具,用于分析数据库访问性能:

  1. 启动跟踪:执行 ST05,选择"SQL Trace",勾选需要跟踪的组件,点击"Activate Trace"。
  2. 执行业务操作:在另一个会话中执行需要分析的操作。
  3. 停止跟踪:回到 ST05,点击"Deactivate Trace"。
  4. 分析结果:点击"Display Trace",可按执行时间、记录数等排序。

重点关注

  • 执行时间长的 SQL:按 Duration 降序排列,找出耗时最长的语句。
  • 重复执行:同一 SQL 语句执行次数过多,说明可能存在 N+1 查询问题。
  • 全表扫描:Records 列远大于预期返回行数,说明索引可能未被使用。
  • 缓冲未命中:Buffer 列显示"miss",说明缓冲策略可能需要调整。
Q18:如何优化内表操作性能?

内表操作是 ABAP 性能优化的关键领域,以下为核心优化建议:

  • 选择合适的内表类型:需要按键快速查找时用 SORTED 或 HASHED 表;仅顺序遍历时用 STANDARD 表。
  • 使用 ASSIGNING 代替 INTOLOOP AT ... ASSIGNING FIELD-SYMBOL(<fs>) 避免数据复制。
  • 批量修改用 ASSIGNING:修改内表行时使用字段符号直接修改,而非 MODIFY
  • 避免嵌套循环:将内层循环表改为 SORTED/HASHED 表,用 READ TABLE ... BINARY SEARCH 或表表达式 itab[ key = value ] 替代。
  • 预分配内表空间gt_itab = VALUE #( FOR i = 1 THEN i + 1 UNTIL i > 10000 ( col = i ) )APPEND 循环快得多。
  • 合理使用 SORT:如果后续需要二分查找,先 SORT 再用 READ TABLE ... BINARY SEARCH

四、增强与 BADI

Q19:User Exit 和 BADI 有什么区别?
对比项User Exit(用户出口)BADI(业务加载项)
技术基础函数模块(在函数组中实现)ABAP 对象(类实现接口)
可用数量每个出口只能有一个实现每个 BADI 可有多个实现(多用途 BADI)
过滤器不支持支持过滤器(按条件激活不同实现)
查找方式CMOD/SMOD 事务码SE18/SE19 或 SPAK Enhancement Spots
SAP 版本R/3 早期版本ABAP 4.6C+ 引入,S/4HANA 推荐
命名规范EXIT_SAPLxxxx_nnnZCL_IM_xxxxxx
继承性不支持支持(经典 BADI 不支持,新 BADI 支持)
状态管理项目激活后所有出口生效每个实现独立激活/停用

结论:新项目应优先使用 BADI,它更灵活、更符合面向对象设计。User Exit 仅在 SAP 未提供对应 BADI 时才考虑。

Q20:如何查找一个事务码对应的 BADI?

查找 BADI 的常用方法:

  1. 通过 SE24 查找:打开 SE24,输入 CL_EXITHANDLER,在 GET_INSTANCE 方法中设置断点。然后执行目标事务码,调试器会在每次调用 BADI 时停下,EXIT_NAME 变量即为 BADI 名称。
  2. 通过 SPRO 查找:在 SPRO 中找到对应模块的业务功能,部分节点会直接标注增强点。
  3. 通过表查找:查询表 TADIRPGMID = 'R3TR'OBJECT = 'SMOD' 的记录;或查询 SXS_ATTR 表。
  4. 通过代码搜索:在 SE80 中搜索 CL_EXITHANDLER=>GET_INSTANCEGET BADI 关键字。
  5. 使用 SAP Note:搜索 SAP Note "BADI list for transaction XXXX"。
Q21:如何实现一个 BADI?

BADI 实现步骤如下:

  1. 查找 BADI 定义:SE18 输入 BADI 名称,查看接口方法定义。
  2. 创建实现:SE19 输入 BADI 名称,点击"Create Implementation",输入实现类名(如 ZCL_IM_BADI_NAME)。
  3. 编写代码:在实现类的方法中编写业务逻辑。
  4. 激活实现:激活实现类和 BADI 实现。
" 新式 BADI 语法(ABAP 7.0 EhP2+) " 获取 BADI 实例 DATA(lo_badi) = cl_badi_custom_factory=>get_instance( badi_name = 'BADI_NAME' ). " 调用 BADI 方法 lo_badi->some_method( EXPORTING iv_param = lv_value IMPORTING ev_result = lv_result ). " 带过滤器的 BADI DATA(lo_badi) = cl_badi_custom_factory=>get_instance( badi_name = 'BADI_NAME' filter_vals = VALUE #( ( name = 'FILTER_NAME' value = 'X' ) ) ).
Q22:Enhancement Spots 和经典 User Exit 有什么区别?

Enhancement Spots(增强点)是 SAP 从 NetWeaver 7.0 开始引入的新增强框架,也称为"新 BADI"或"Enhancement Framework":

对比项经典增强(User Exit/CMOD)Enhancement Spots
增强位置仅限 SAP 预定义的出口可在任意代码位置插入增强点
增强类型函数出口、菜单出口、屏幕出口BADI、代码增强(Source Code Plug-in)、函数增强
多实现每个出口仅一个实现支持多个实现,可定义执行顺序
切换框架不支持支持 Switch Framework(业务功能切换)
管理工具CMOD/SMODSE18/SE19/SE20/SPA 思路
S/4HANA 兼容仍可用但推荐迁移推荐方式
Q23:如何调试 Enhancement 的执行?

调试增强代码的方法:

  1. 直接在实现类中设断点:在 SE19 中找到 BADI 实现类,在方法中设置断点。
  2. 使用 SE20 查找增强点:SE20 中可以列出某程序的所有增强点位置,然后手动在增强点处设断点。
  3. 通过 CL_EXITHANDLER 断点:在 CL_EXITHANDLER=>GET_INSTANCE 方法中设断点,跟踪 BADI 的调用。
  4. SAT 事务码分析:使用 SAT 进行运行时分析,可以查看哪些增强被调用。
  5. 查看激活状态:在 SE19 中确认 BADI 实现是否已激活。未激活的实现不会被执行。

常见问题:BADI 代码不执行——检查实现是否激活、过滤器条件是否匹配、是否在正确的 BADI 版本(经典 vs 新式)中创建实现。

五、接口与集成

Q24:如何从 ABAP 调用外部 API?

从 ABAP 调用外部 API 主要有以下方式:

方式一:使用 CL_HTTP_CLIENT(经典方式)

DATA: lo_client TYPE REF TO if_http_client, lv_url TYPE string VALUE 'https://api.example.com/data', lv_response TYPE string. " 创建 HTTP 客户端 cl_http_client=>create_by_url( EXPORTING url = lv_url IMPORTING client = lo_client ). " 设置请求方法和 Header lo_client->request->set_method( if_http_request=>co_request_method_get ). lo_client->request->set_header_field( name = 'Authorization' value = 'Bearer xxx' ). lo_client->request->set_content_type( content_type = 'application/json' ). " 发送请求并接收响应 lo_client->send( ). lo_client->receive( ). " 获取响应数据 lv_response = lo_client->response->get_cdata( ). lo_client->close( ).

方式二:使用 if_http_client 的 REST 风格(推荐)

在 S/4HANA 中推荐使用 cl_http_client=>create_by_dest 配合 SM59 中配置的 RFC Destination(类型为 G/HTTP),这样 URL、SSL 证书等配置集中在 SM59 中管理,代码更简洁。

注意事项:调用外部 HTTPS API 需要通过 STRUST 事务码导入 SSL 证书到 SAP 系统的证书库中。

Q25:如何创建 OData 服务?

创建 OData 服务的标准步骤:

  1. 定义数据模型:在 SEGW(Service Builder)中创建项目,定义 Entity Type、Entity Set、Association 等。
  2. 实现服务:重新生成运行时对象(MPC 和 DPC 类),在 DPC_EXT 类中重写 CRUD 方法:
    • ENTITYSET_GET_ENTITYSET:查询(GET)
    • ENTITYSET_CREATE_ENTITY:创建(POST)
    • ENTITYSET_UPDATE_ENTITY:更新(PUT/MERGE)
    • ENTITYSET_DELETE_ENTITY:删除(DELETE)
  3. 注册服务:在事务码 /IWFND/MAINT_SERVICE 中注册服务,将其添加到 SAP Gateway。
  4. 测试服务:使用 /IWFND/GW_CLIENT 或 Postman 测试 OData 服务的各个操作。

在 S/4HANA 中,还可以使用 CDS View + OData Publish 的方式自动暴露 OData 服务,无需手动创建 SEGW 项目。

Q26:SAP 中 REST 和 SOAP 有什么区别?
对比项SOAPREST
协议基于 XML 的消息协议基于 HTTP 的架构风格
数据格式仅 XMLJSON、XML、纯文本等
SAP 集成方式通过 PI/PO、Web Service(SOAMANAGER)通过 OData、HTTP Client
WSDL有标准的 WSDL 描述文件无标准描述(可用 OData Metadata)
事务支持支持 WS-Transaction无事务概念
安全性WS-Security 标准HTTPS + OAuth/API Key
性能较重(XML 解析开销大)较轻(JSON 更紧凑)
SAP 推荐传统集成场景(如与旧系统对接)Fiori/S/4HANA 新场景

趋势:SAP 在 S/4HANA 中大力推行 REST/OData 方式,SOAP 主要用于与遗留系统的集成。PI/PO 中间件仍同时支持两种协议。

郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由作者基于多年 SAP ABAP 开发经验整理,仅用于内部技术分享与学习交流。