共计 1880 个字符,预计需要花费 5 分钟才能阅读完成。
痛点分析:AS02 标准功能的局限性
在 SAP 系统中,AS02 事务码用于维护资产主数据,但标准功能经常无法满足企业的个性化需求。以下是几个典型场景:

- 字段校验缺失:比如某些自定义字段需要必填,但标准程序未做强制检查
- 业务规则无法嵌入:例如资产类别为特定值时需要自动派生折旧码
- 日志记录不足:标准操作日志不包含业务需要的变更追踪信息
- 数据联动困难:资产创建时无法自动更新关联系统数据
这些需求都无法通过配置实现,必须通过增强技术来解决。
技术选型:BADI vs User Exit
SAP 提供了两种主要的增强方式:
- BADI_METHOD_IMP(业务插件)
- 基于面向对象实现
- 支持多实现和过滤值
-
需要通过事务码 SE19 激活
-
USEREXIT_SAVE_DOCUMENT(用户出口)
- 传统 Form 例程
- 直接修改 include 程序
- 使用事务码 SMOD/CMOD 管理
对于 AS02 增强,推荐优先使用 BADI,因为:
- 不需要修改标准程序
- 支持多客户端环境
- 有明确的接口定义
核心实现:FICO_ACDOCA_CI BADI 示例
以下是使用 FICO_ACDOCA_CI BADI 的完整示例代码:
CLASS zcl_asset_badi_impl DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_ex_fico_acdoca_ci.
ENDCLASS.
CLASS zcl_asset_badi_impl IMPLEMENTATION.
METHOD if_ex_fico_acdoca_ci~change_document.
" 检查是否为资产相关凭证
IF iv_object = 'ANLA' AND iv_change_indicator = 'I'. "I= 插入,U= 更新" 获取资产主数据
DATA(ls_asset) = VALUE bapi1022_feglg001( );
CALL FUNCTION 'BAPI_FIXEDASSET_GETDETAIL'
EXPORTING
asset = iv_object_value
IMPORTING
asset_header = ls_asset.
" 示例:自动派生折旧码
IF ls_asset-assetclass = '3000' AND ls_asset-depr_key IS INITIAL.
ls_asset-depr_key = 'STD'.
" 更新资产数据
CALL FUNCTION 'BAPI_FIXEDASSET_CHANGE'
EXPORTING
asset = iv_object_value
asset_header = ls_asset
IMPORTING
return = DATA(lt_return).
" 记录日志
MESSAGE s398(00) WITH '自动设置折旧码:STD' INTO DATA(lv_msg).
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_msgty = 'S'
i_msgid = '00'
i_msgno = '398'
i_msgv1 = lv_msg.
ENDIF.
ENDIF.
ENDMETHOD.
ENDCLASS.
关键点说明:
- 使用 BAPI 而非直接修改表,避免系统兼容性问题
- 通过
iv_change_indicator区分创建和修改操作 - 使用应用日志 (BAL) 而非直接 MESSAGE,避免中断用户操作
性能优化建议
增强点代码执行时会影响事务整体性能,特别注意:
- 避免循环查询
- 预取数据到内表再处理
-
使用 FOR ALL ENTRIES 替代单条查询
-
减少 COMMIT 次数
- 合并更新操作
-
必要时使用 BAPI 的
COMMIT WORK参数 -
异步处理非关键逻辑
- 耗时操作可通过 BDC 或 RFC 异步执行
- 示例:
CALL FUNCTION 'Z_ASYNC_UPDATE_ASSET' IN BACKGROUND TASK EXPORTING asset_number = iv_object_value.
避坑指南
增强未生效排查
- 检查 BADI 实现是否激活(SE19)
- 确认过滤条件是否正确设置
- 在 ST05 中跟踪是否执行了增强点
调试技巧
- 使用
/h在事务开始时启动调试 - 在 BADI 方法内设置外部断点
- 通过
SY-SUBRC检查 BAPI 调用结果
多客户端处理
- 所有自定义表必须包含 MANDT 字段
- 使用
CLIENT SPECIFIED谨慎处理跨客户端操作 - 测试时注意客户端特定的配置差异
思考与扩展
- 如果同时存在 BADI 和 User Exit,它们的执行顺序如何确定?
- 在增强点中如何正确处理事务一致性?
- 当多个增强实现存在冲突时,有哪些协调方案?
建议在开发系统中尝试以下扩展实践:
- 增加自定义字段的自动校验
- 实现资产创建时的编号范围检查
- 集成工作流审批功能
正文完
