2014-11-06 92 views
3

我有一个ABAP-OO类,我想调用一个方法foo()中的函数模块。有两种情况(A & B),我必须使用方法foo()。比方说,情况A是默认的,并使用需要的功能模块是这样的:ABAP:如何在调用功能时使用可选参数并减少冗余?

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

案例B“是特”,还需要optional_param以上进行设置。

我现在的情况是有一个这样的第二种方法:

" importing something something_else case_b_stuff 
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”?

+1

如果您的FM具有该可选参数的默认值,那么在使用初始值调用FM时,您可能会覆盖该默认值。您可以使用默认值(如果有,否则初始状态良好)定义您的可选参数,并在必要时覆盖它。 – 2014-11-06 09:09:13

+0

我检查了FM。据我所知,只有当可选参数不是初始值时才会执行某些操作。所以使用初始参数应该没问题。谢谢。 – SDD64 2014-11-06 09:25:59

回答

1

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

+1

这并不完全正确:“提交初始值是否正常”取决于功能模块是用“IF参数IS INITIAL”还是“IF参数IS SUPPLIED”来检查参数。如果它使用'IS SUPPLIED',则即使提交初始值也可能产生不良结果。 – vwegert 2014-11-09 19:49:06

+0

感谢您的评论。你的陈述是正确的,但在我的情况下,该函数实际上做了IF PARAM IS INITIAL检查。所以没问题。 – SDD64 2014-11-10 13:34:16

2

要动态选择功能模块的参数,请查看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++中那样重载方法名称。