SAP BAdI动态声明与调用方案,解决旧版本系统变更请求导入失败问题
完整实现方案
问题1:动态声明获取BAdI规避传输预检查
你之前直接用CREATE OBJECT创建BAdI实例的写法不符合ABAP BAdI的创建规范,BAdI实例必须通过GET BADI语句生成,正确动态写法如下:
DATA: lv_badi_name TYPE seoclassname VALUE 'FIEB_GET_BANK_STMTS_X', lo_split_badi TYPE REF TO cl_badi_base. " 方式1:提前查询BAdI是否存在 DATA(lv_badi_exists) = xsdbool( EXISTS ( SELECT * FROM sxc_exit WHERE exit_name = lv_badi_name ) ). IF lv_badi_exists = abap_false. " 低版本系统无对应BAdI的兜底逻辑 RETURN. ENDIF. " 方式2:用异常捕获替代查询,写法更简洁 TRY. GET BADI lo_split_badi TYPE (lv_badi_name). CATCH cx_badi_not_found. RETURN. ENDTRY.
该写法声明阶段使用全版本SAP系统都存在的标准基类cl_badi_base,GET BADI语句中BAdI名称用动态字符串传入,传输预检查不会校验括号内的字符串内容,可直接规避低版本系统无对应BAdI导致的导入报错。
问题2:动态调用BAdI方法解决语法报错
CALL BADI直接硬编码方法名时,语法检查会校验该BAdI是否存在对应方法,因此必须用动态方法调用写法,将方法名也用字符串传入:
IF lo_split_badi IS NOT BOUND. RETURN. ENDIF. DATA: lv_cont TYPE string, " 自定义入参变量 lt_xml_string TYPE STANDARD TABLE OF string. " 自定义出参变量 CALL BADI lo_split_badi->('SPLIT') EXPORTING i_string = lv_cont IMPORTING et_string = lt_xml_string EXCEPTIONS split_not_possible = 1 wrong_format = 2 others = 3. IF sy-subrc <> 0. " 方法调用失败的兜底逻辑 ENDIF.
注意事项
- 动态调用的方法名必须使用大写,ABAP运行时方法名以大写存储,小写会导致方法找不到
- 参数名称、参数类型必须和BAdI方法定义完全一致
- 建议补充异常捕获逻辑,避免运行时DUMP
内容的提问来源于stack exchange,提问作者OrdinaryPerson
相关产品推荐
相关产品推荐

