1

我想为 BAdI 实现定义一个对象,该对象不会在声明中按其名称初始化 BAdI。

我不想要的例子:

DATA l_split_badi TYPE REF TO fieb_get_bank_stmts_x.

问题 1:我想要类似的东西

DATA l_split_badi TYPE REF TO object.
lv_class_name = 'fieb_get_bank_stmts_x'.
create object l_split_badi type (lv_class_name).

如果我像上面那样声明,我会收到以下语法错误:

“L_SPLIT_BADI”在这里不是有效的 BAdI 句柄。

我需要执行此类实现的原因是,在将更改请求导入具有较旧 SAP 版本的系统时,由于 BAdI 声明TYPE REF TO(因为系统中不存在 BAdI),导入失败。

我的想法是使用动态声明来避免在导入更改请求时进行预检查。

欢迎任何想法!谢谢大家 !


编辑问题 2:在 Sandra Rossi 提出使用DATA l_split_badi TYPE REF TO cl_badi_baseand的解决方案之后GET BADI l_split_badi TYPE ('FIEB_GET_BANK_STMTS_X'),我在下面的行中得到了相同的语法错误CALL BADI l_split_badi->split

CALL BADI l_split_badi->split
  EXPORTING
    i_string           = lv_cont
  IMPORTING
    et_string          = lt_xml_string
  EXCEPTIONS
    split_not_possible = 1
    wrong_format       = 2.
4

1 回答 1

3

问题 1

对于作为增强点的一部分的 BAdI(通过事务代码显示 BAdI SE18,您就会知道),您不能使用CREATE OBJECT,而是使用具有动态变体的GET BADI :

DATA badi TYPE REF TO cl_badi_base.
TRY.
    GET BADI badi TYPE ('FIEB_GET_BANK_STMTS_X')...
  CATCH cx_badi_unknown_error INTO DATA(lx).
    " The BAdI doesn't exist, handle the case...
ENDTRY.

编辑:请注意,实例声明引用CL_BADI_BASE的是所有 BAdI 定义的超类。

问题2

SPLIT静态调用该方法是SPLIT无效的,因为CL_BADI_BASE. 您必须使用CALL BADI的动态变体:

CALL BADI l_split_badi->('SPLIT')
  EXPORTING
    i_string           = lv_cont
  IMPORTING
    et_string          = lt_xml_string
  EXCEPTIONS
    split_not_possible = 1
    wrong_format       = 2.
于 2021-10-02T22:24:16.743 回答