gpt4 book ai didi

abap - 不带命名参数调用动态方法

转载 作者:行者123 更新时间:2023-12-04 20:39:07 24 4
gpt4 key购买 nike

我正在像这样动态地调用一个类的方法,它的工作原理是:

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_datsrv_timestamp .
并非每个方法都有这些参数名称,因此我正在寻找一种无需命名参数即可调用它们的方法。
我试过这样,但我得到了很多语法错误。
<ls_import_params>-attr_value = (gc_zcl_mapping_methods)=>(<ls_import_params>-attr_logic_method)(<lv_value>).

我的目标是否有正确的语法来省略参数名称?

最佳答案

不幸的是,您还必须命名返回参数和其他参数。

完整的动态调用在 ABAP documentation 中有解释。

对于您的示例代码,这将给出以下代码:

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.

我让你添加异常处理。

附录:最小、完整且可验证的示例 :

假设这个静态调用是动态完成的:
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.

关于abap - 不带命名参数调用动态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55180557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com