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”相当于什么? 的相关文章

  • 什么是 PHP 中的呼叫转移和静态呼叫或后期静态绑定? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我从网站上获得了一个代码示例 但我很难理解输出 我正在分享代码 class A public static function foo
  • 适当使用静态方法

    从概念上讲 当方法仅接受输入并将输入重新格式化为输出时 使用静态方法 C 是否合适 例如 public static string FormatString string inputString return some formatting
  • 在java中将对象声明为final

    有人可以澄清以下代码的意义吗 class A int i 10 public void setI int b i b public int getI return i class Test public static void main S
  • 如何使用工厂来创建使用策略模式的对象?

    假设我们的在线商店有一个简单的支付功能 我们希望使用不同的交易处理器来管理不同的交易 交易可以是付款或退款 交易处理器可以是 Paypal 或 Payplug 所以我们有以下课程 class PaymentTransaction imple
  • 当代码依赖于两个对象的子类型时,是否有设计模式可以处理

    我会尽力尽可能明确 以防有比回答我的问题更好的解决方案 我正在使用 C 工作 我有一个报告模板 可以包含任意数量的打开的 功能 功能可能是信息表 饼图 条形图 列表等 我将报告生成为文本文件或 PDF 将来可能有其他选项 到目前为止我有一个
  • 静态类属性上的 isset

    class A public static foo 42 class A attribute foo var dump isset class attribute gives bool false 我如何检查这个类中是否存在这个静态属性 U
  • PHP - 多个不同的数据库依赖注入类

    我花了过去几个小时试图找到 最佳 最合乎逻辑的方法的答案 以编写一个 php 数据库类以同时连接到一个 postgresql 数据库和一个 mysql 数据库 另外 我想采用依赖注入设计 但对整个概念还是陌生的 到目前为止我已经想出了 cl
  • 初始化父类时如何返回子类的新实例?

    给定一个类层次结构如下 class A def initialize param if param 1 then initialize and return instance of B else initialize and return
  • 不在对象上下文中时使用 $this php

    我刚刚开始学习 php 中的 OOPS 我写了一个简单的程序来实现继承 当不在对象上下文中时 我收到 this 的致命错误 谁能解释一下这个错误 它是什么意思 这是我的代码
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • 我可以在 Laravel 5.2 中创建一个继承自 User 的新类吗?

    我对 Laravel 还很陌生 使用的是迄今为止的最新版本 5 2 因此我遇到了以下困境 我知道 Laravel 附带了一个User开箱即用的类 但我想开发一个系统 在其中我可以有另外两种类型的用户 称为Researcher and Adm
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa
  • 如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?

    在我的应用程序中 我有这样的内容 user ts export class User 现在 我这样做 应用程序组件 ts callAnotherFunction User 如果我将类名作为字符串 即 我该如何做到这一点 User 如果可能的
  • 树的递归和非递归过程

    我们知道树是递归数据结构 我们在编写树的过程中使用递归 例如BST的删除方法等 递归的好处是 我们的程序变得非常小 例如中序遍历的代码只有4或5行 而不是非递归程序 虽然会很长 但从理解的角度来看 不像递归程序那么复杂 这就是为什么我讨厌递
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 使用元类的 __call__ 方法而不是 __new__?

    在讨论元类时 the docs http docs python org reference datamodel html state 您当然也可以重写其他类方法 或添加新的 方法 例如定义一个自定义 call 方法中的 元类允许在调用类时

随机推荐