4

我有一个 ABAP-OO 类,我想在方法 foo() 中调用一个函数模块。有两种情况(A 和 B)我必须使用方法 foo()。假设案例 A 是默认的,并且使用需要这样的功能模块:

METHOD foo.
  CALL FUNCTION 'A_FUNCTION'
    EXPORTING
      required_param_x = something
      required_param_y = something_else.
      " optional_param = " i am commented out and only need for case B
ENDMETHOD.

案例 B “很特殊”,还需要设置上面的 optional_param。我目前的情况是有第二种方法:

METHOD foo_b_case.
  CALL FUNCTION 'A_FUNCTION'
    EXPORTING
      required_param_x = something
      required_param_y = something_else
      optional_param = case_b_stuff.
ENDMETHOD.

当然,这是非常多余的。如上所示,我的现实生活中的编码也更加复杂。我的问题是,我怎样才能摆脱这种方法 foo_b_case( ) 并使 foo( ) 适合这两种情况?

可以说,我将参数“case_b_stuff”设为可选,并在每种情况下传递它。如果“case_b_stuff”是初始值,ABAP 如何处理“optional_param”?

4

2 回答 2

3

要动态选择功能模块的参数,请查看PARAMETER-TABLE关键字。不幸的是,这不适用于 RFC 调用,但对于本地调用,您可以将其与IS SUPPLIED条件一起使用。

IF case_b_stuff IS SUPPLIED.
  "add the parameter to the table to be included in PARAMETER-TABLE call
ENDIF.
CALL FUNCTION 'A_FUNCTION'
  PARAMETER-TABLE
    lt_parameter
  EXCEPTION-TABLE
    lt_exception.

这样你就可以只有一种foo方法。这种方法的主体是否整洁,是另一个问题。这都是因为 ABAP 不允许像在 Java 或 C++ 中那样重载方法名称。

于 2014-11-07T09:05:06.157 回答
2

正如评论中已经解释的那样,首先检查该可选参数的功能模块具有什么默认值。如果没有,提交一个初始值就可以了。如果存在默认值,则提交初始值将覆盖默认行为。为确保 FM 按预期工作,请使用相关 FM 的默认值初始化参数变量,并仅在需要时覆盖它。

于 2014-11-06T09:37:22.330 回答