Вызов динамического метода без именования параметров - PullRequest
2 голосов
/ 15 марта 2019

Я вызываю метод класса динамически, как это, и он работает:

CALL METHOD (gc_zcl_mapping_methods)=>(<ls_import_params>-attr_logic_method)
  EXPORTING
    iv_dats      = <lv_value>
  RECEIVING
    rv_timestamp = <ls_import_params>-attr_value.

Проблема в том, что я называю два параметра iv_dats и rv_timestamp.
Не у каждого метода есть эти имена параметров, поэтому я ищу способ вызывать их без именования параметров.
Я пытался так, но я получаю много синтаксических ошибок.

<ls_import_params>-attr_value = (gc_zcl_mapping_methods)=>(<ls_import_params>-attr_logic_method)(<lv_value>).

Существует ли правильный синтаксис для моей цели пропустить имена параметров?

1 Ответ

7 голосов
/ 15 марта 2019

К сожалению, вы должны назвать возвращаемый параметр и другие параметры тоже.

Полный динамический вызов объясняется здесь в ABAP документации

Для вашего примера кода, что даст следующий код:

DATA(ptab) = VALUE abap_parmbind_tab( 
    ( name  = 'IV_DATS' 
      kind  = cl_abap_objectdescr=>exporting 
      value = REF #( <lv_value> ) )
    ( name  = 'RV_TIMESTAMP'
      kind  = cl_abap_objectdescr=>receiving
      value = REF #( <ls_import_params>-attr_value ) ) ). 

DATA(etab) = VALUE abap_excpbind_tab( ).

CALL METHOD (gc_zcl_mapping_methods)=>(<ls_import_params>-attr_logic_method) 
    PARAMETER-TABLE ptab 
    EXCEPTION-TABLE etab. 

Вы можете получить имя возвращаемого параметра, используя RTTI (здесь, я полагаю, что класс является глобальным), вы также можете адаптировать его для получения других имен параметров:

DATA(rtti_class) = CAST cl_abap_objectdescr( 
    cl_abap_typedescr=>describe_by_name( '\CLASS=' && gc_zcl_mapping_methods ) ).

DATA(method) = rtti_class->methods[ name = <ls_import_params>-attr_logic_method ].

DATA(returning_parameter) = method-parameters[ parm_kind = cl_abap_objectdescr=>returning ].

DATA(returning_parameter_name) = returning_parameter-name.

Я позволю вам добавить обработку исключений.


ADDENDUM: минимальный, полный и проверяемый пример :

Допустим, этот статический вызов должен выполняться динамически:

DATA(result) = VALUE sychar01( ).
DATA(ltxttab) = VALUE rslinltab( ( kind = 'E' numb = 1 param = 'MSGID' value = 'MESSAGEGY9' )
                                 ( kind = 'E' numb = 1 param = 'PRAGMA' value = '##DUMMY' ) ).

cl_abap_syntax_message=>long_text_exists(
  EXPORTING
    p_kind            = 'E'
    p_number          = 1
    p_ltxttab         = ltxttab
  RECEIVING
    p_result          = result
  EXCEPTIONS
    message_not_found = 1 ).

Динамическая версия (также параметр RECEIVING определяется динамически во время выполнения, но обычно он не нужен, поскольку его имя известно во время компиляции):

DATA(rtti_class) = CAST cl_abap_objectdescr(
    cl_abap_typedescr=>describe_by_name( '\CLASS=' && 'CL_ABAP_SYNTAX_MESSAGE' ) ).
DATA(method) = rtti_class->methods[ name = 'LONG_TEXT_EXISTS' ].
DATA(returning_parameter) = method-parameters[ parm_kind = cl_abap_objectdescr=>returning ].
DATA(returning_parameter_name) = returning_parameter-name.
ASSERT returning_parameter_name = 'P_RESULT'. " <=== just for the demo

DATA(ptab) = VALUE abap_parmbind_tab(
    ( name  = 'P_KIND'
      kind  = cl_abap_objectdescr=>exporting
      value = REF #( 'E' ) )
    ( name  = 'P_NUMBER'
      kind  = cl_abap_objectdescr=>exporting
      value = REF #( 1 ) )
    ( name  = 'P_LTXTTAB'
      kind  = cl_abap_objectdescr=>exporting
      value = REF #( ltxttab ) )
    ( name  = returning_parameter_name
      kind  = cl_abap_objectdescr=>receiving
      value = REF #( result ) ) ).

DATA(etab) = VALUE abap_excpbind_tab(
    ( name = 'MESSAGE_NOT_FOUND' value = 1 ) ).

CALL METHOD ('CL_ABAP_SYNTAX_MESSAGE')=>('LONG_TEXT_EXISTS')
  PARAMETER-TABLE ptab
  EXCEPTION-TABLE etab.
...