2016-05-23 50 views
5

我有以下一段代码。函数模块调用中的函数方法调用,为什么只与EXPORTING?

REPORT ZZY. 

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE. 
    PUBLIC SECTION. 
    CLASS-METHODS: 
     convert_to_xstring 
     IMPORTING 
      i_param1 TYPE i 
      i_param2 TYPE i 
     RETURNING 
      VALUE(rv_result) TYPE xstring, 
     main. 
ENDCLASS. 

CLASS lcl_main IMPLEMENTATION. 
    METHOD convert_to_xstring. 
    ENDMETHOD. 

    METHOD main. 
    DATA: lt_binary_tab TYPE STANDARD TABLE OF x. 

    DATA(lv_result) = convert_to_xstring(i_param1 = 1 i_param2 = 2). 

    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' 
     EXPORTING 
     buffer = lcl_main=>convert_to_xstring(
        EXPORTING 
        i_param1 = 1 
        i_param2 = 2 
       ) 
     TABLES 
     binary_tab = lt_binary_tab. 

    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    lcl_main=>main(). 

功能方法调用不是功能模块调用的一部分可以这样写。

DATA(lv_result) = convert_to_xstring(i_param1 = 1 i_param2 = 2). 

然而,当我想正是用它上面

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' 
    EXPORTING 
    buffer    = lcl_main=>convert_to_xstring(i_param1 = 1 i_param2 = 2) 
    TABLES 
    binary_tab   = lt_binary_tab. 

我得到以下语法错误书面。

场“CONVERT_TO_XSTRING(”是未知的。它既不处于 指定的表中的一个,也不由“DATA”语句定义。“DATA”语句。

它看起来像编译器的需求在这种情况下,一些指导的属性和方法区别开来。为什么它会是含糊的编译器,让这样的情况下,无需编写EXPORTING

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' 
    EXPORTING 
    buffer    = lcl_main=>convert_to_xstring(EXPORTING i_param1 = 1 i_param2 = 2) 
    TABLES 
    binary_tab   = lt_binary_tab. 
+1

这些方法调用称为[函数方法](https://help.sap.com/abapdocu_70/en/ABAPMETHODS_FUNCTIONAL.htm),它与[内联函数或方法](https:// en .wikipedia.org/wiki/Inline_function),其中AFAIK不存在于ABAP中。我宁愿不混淆这两者。而且,至于你的问题 - “CALL FUNCTION”是一团糟 - 是否足够的答案? ;-) – vwegert

+1

那么是不是说[内嵌](https://scn.sap.com/community/abap/blog/2013/05/23/abap-news-for-release-740--inline-声明)声明一样混乱?尽管如此,我还是会重新翻译一下,因为这种方法调用的方式从一开始就被命名为功能。我记得C++中的'inline'函数,它们对于预处理器宏来说是很好的选择。 – Jagger

回答

2

ABAP的设计也相当糟糕。在re就像函数式方法调用一样,但不能将它与所有命令结合使用。例如,WRITE命令不能与功能方法调用结合使用。这似乎是某种与函数方法调用“部分兼容”的方式。 我不知道为什么(也许闷棍开发人员喝醉了),但这只是我们必须忍受的一个事实。

+1

是的,我同意,但在这种情况下,可以使用功能性方法,但只能用“黑客”来完成。我想知道如果不需要使用'EXPORTING',那么这里可能会有什么含糊不清的地方。 – Jagger

+1

我猜想,这是某种“bug”。但是没有人知道,在sap的世界里...... –