ABAP 对象中的“ADD-CORRESPONDING”相当于什么?

2024-02-02

对于以下可执行程序,存在以下语法错误:

OO 上下文中不支持“ADD-CORRESPONDING”

相当于什么ADD-CORRESPONDING在ABAP对象中?

REPORT.
CLASS lcl_app DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
  METHOD main.
    TYPES: BEGIN OF ty_struc1,
             number1 TYPE i,
             number2 TYPE i,
           END OF ty_struc1,
           BEGIN OF ty_struc2,
             number1 TYPE i,
             number3 TYPE i,
           END OF ty_struc2.
    DATA(struc1) = VALUE ty_struc1( number1 = 1 number2 = 1 ).
    DATA(struc2) = VALUE ty_struc2( number1 = 1 number3 = 1 ).
    ADD-CORRESPONDING struc1 TO struc2.
    cl_abap_unit_assert=>assert_equals( act = struc2 exp = VALUE ty_struc2( number1 = 2 number3 = 1 ) ).
  ENDMETHOD.
ENDCLASS.

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

您可以自己编写等效逻辑。有一个测试代码来演示它是如何工作的。此代码在 7.40 SP08 中编译:

CLASS lcx_add_corresp_not_all_struct DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS add_corresponding IMPORTING from_struct TYPE any
                                    CHANGING  to_struct   TYPE any
                                    RAISING   lcx_add_corresp_not_all_struct
                                              cx_sy_conversion_overflow.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
  METHOD add_corresponding.
    TYPES: ty_names            TYPE HASHED TABLE OF abap_compname WITH UNIQUE KEY table_line,
           ty_names_in_structs TYPE STANDARD TABLE OF ty_names WITH EMPTY KEY,
           ty_table_rtti       TYPE STANDARD TABLE OF REF TO cl_abap_typedescr WITH EMPTY KEY.
    DATA(rtti_from_struct) = cl_abap_typedescr=>describe_by_data( from_struct ).
    DATA(rtti_to_struct) = cl_abap_typedescr=>describe_by_data( to_struct ).
    IF rtti_from_struct->kind <> rtti_from_struct->kind_struct
        OR rtti_to_struct->kind <> rtti_to_struct->kind_struct.
      RAISE EXCEPTION NEW lcx_add_corresp_not_all_struct( ).
    ENDIF.
    DATA(names_in_structs) = VALUE ty_names_in_structs(
        FOR rtti IN VALUE ty_table_rtti( ( rtti_from_struct ) ( rtti_to_struct ) )
        ( VALUE #( FOR <comp> IN CAST cl_abap_structdescr( rtti )->components
                           WHERE ( type_kind CA '8abeFIPs' ) " all numeric types
                           ( <comp>-name ) ) ) ).
    DATA(same_names) = FILTER ty_names( names_in_structs[ 1 ] IN names_in_structs[ 2 ] WHERE table_line = table_line ).
    LOOP AT same_names REFERENCE INTO DATA(same_name).
      ASSIGN COMPONENT same_name->* OF STRUCTURE from_struct TO FIELD-SYMBOL(<from_number>).
      ASSERT sy-subrc = 0.
      ASSIGN COMPONENT same_name->* OF STRUCTURE to_struct TO FIELD-SYMBOL(<to_number>).
      ASSERT sy-subrc = 0.
      <to_number> = <to_number> + <from_number>.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

CLASS ltc_app DEFINITION
      FOR TESTING
      DURATION SHORT
      RISK LEVEL HARMLESS.
  PRIVATE SECTION.
    METHODS test FOR TESTING RAISING cx_static_check.
    METHODS overflow FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltc_app IMPLEMENTATION.
  METHOD test.
    TYPES: ty_output LIKE ls_output.
    ls_output = VALUE #( clabs = 100 ceinm = 500 ).
    DATA(ls_output2) = ls_output.
    lcl_app=>add_corresponding( EXPORTING from_struct = ls_output2 CHANGING to_struct = ls_output ).
    cl_abap_unit_assert=>assert_equals( act = ls_output exp = VALUE ty_output( clabs = 200 ceinm = 1000 ) ).
  ENDMETHOD.
  METHOD overflow.
    TYPES: BEGIN OF ty_struct,
             int1 TYPE int1,
           END OF ty_struct.
    DATA(from_struct) = VALUE ty_struct( int1 = 200 ).
    DATA(to_struct) = from_struct.
    TRY.
        lcl_app=>add_corresponding( EXPORTING from_struct = from_struct CHANGING to_struct = to_struct ).
      CATCH cx_sy_conversion_overflow INTO DATA(arithmetic_overflow).
    ENDTRY.
    cl_abap_unit_assert=>assert_bound( act = arithmetic_overflow msg = |Actual: { to_struct-int1 } ; expected: arithmetic overflow| ).
  ENDMETHOD.
ENDCLASS.

注意:代替ADD-CORRESPONDING,你可以简单地使用ls_output-clabs = ls_output-clabs + ls_mchb-clabs并对所有数字组件重复此操作。

NB: ADD-CORRESPONDING和其他算术“对应”语句是已过时,因为它们被认为容易出错 https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abapadd-corresponding.htm:

“这些语句很容易出错,因为,特别是在复杂的结构中,检查相同名称的组件是否具有数字运算所需的数据类型和内容并不容易。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ABAP 对象中的“ADD-CORRESPONDING”相当于什么? 的相关文章

随机推荐