2016-05-23 33 views
5

Mam następujący fragment kodu.Funkcjonalne wywołanie metody w wywołaniu modułu funkcji, dlaczego tylko z 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(). 

Wywołanie funkcji funkcjonalnej, które nie jest częścią wywołania modułu funkcji, można zapisać w ten sposób.

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

Jednak gdy chcę go używać dokładnie tak, jak napisane powyżej

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. 

pojawia się następujący błąd składni.

Pole „CONVERT_TO_XSTRING (” nie jest znane. Nie jest to ani w jednym z określonych tabel ani zdefiniowane przez „dane” oświadczeniu. „DATA” oświadczenie.

Wygląda potrzeb kompilatora pewne wskazówki w tym przypadku rozróżnić atrybutu i metody. Dlaczego byłoby dwuznaczne dla kompilator niech taki przypadek bez pisania 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

Te wywołania metod są nazywane [metodami funkcyjnymi] (https://help.sap.com/abapdocu_70/en/ABAPMETHODS_FUNCTIONAL.htm), co jest bardzo różne od [funkcji lub metody inline] (https: // pl .wikipedia.org/wiki/Inline_function), którego AFAIK nie istnieje w ABAP. Wolałbym nie pomylić tych dwóch. A co do twojego pytania - "FUNKCJA POŁĄCZENIA" to bałagan - czy to wystarczająca odpowiedź? ;-) – vwegert

+1

Nie mówi się o [inline] (https://scn.sap.com/community/abap/blog/2013/05/23/abap-news-for-release-740--inline- deklaracje) tak samo mylące? Będę jednak przeformułować, ponieważ ten sposób wywołania metody został rzeczywiście nazwany funkcjonalnie od samego początku. Pamiętam funkcję 'inline' w C++, są one dobrą alternatywą dla makr preprocesorów. – Jagger

Odpowiedz

2

konstrukcja ABAP jest bardzo złe. na re jest czymś w rodzaju wywołań metod funkcjonalnych, ale nie można go używać w połączeniu ze wszystkimi poleceniami. Na przykład polecenie WRITE nie działa w połączeniu z wywołaniami metod funkcjonalnych. Wydaje się, że jest to rodzaj "częściowej kompatybilności" z wywołaniami funkcji. Nie wiem dlaczego (może ludzie z populacją sapów byli pijani), ale jest to po prostu fakt, z którym musimy żyć.

+1

Tak, zgadzam się, ale w tym przypadku możliwe jest użycie metody funkcjonalnej, tylko trzeba to zrobić z "hack". Zastanawiam się, jaka byłaby możliwa niejednoznaczność, gdyby nie trzeba było używać "EXPORTING". – Jagger

+1

Zgaduję, że to jakiś "błąd". Ale nikt nie wie, w świecie soków ... –