Abap 功能模块中的可选参数?

Abap 功能模块中的可选参数?,abap,function-module,Abap,Function Module,我有一个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 commen

我有一个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“特殊”,还需要设置上述可选参数。我目前的情况是有第二种方法:

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”

如注释中所述,首先检查该可选参数的功能模块的默认值。如果没有,则可以提交初始值。如果存在默认值,提交初始值将覆盖默认行为。要确保FM按预期工作,请使用相关FM的默认值初始化参数变量,并仅在需要时覆盖它。

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

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++。

如果FM有默认参数,那么在调用FM时,可能会重写默认值。你可以用默认值定义你的可选参数(如果有,初始值也可以),必要时可以覆盖它。据我所知,它只在可选参数不是初始值时才起作用。因此,使用初始参数应该可以。谢谢。这并不完全正确:“提交初始值是否合适”取决于功能模块是否使用
检查参数(如果参数为初始值)
检查参数(如果提供了参数)
)。如果它使用提供的
,即使提交初始值也可能会产生不希望的结果。感谢您的评论。您的语句是正确的,但是在我的例子中,如果PARAM是初始检查,那么函数实际上是doa。所以很好。