并排的结构值比较并显示差异?

问题描述

如何逐个比较结构值并显示差异?

现在,我以一种非常原始的方式进行操作:

DATA: tkomp  TYPE komp,tkomp2 TYPE komp.

WRITE: `Field differences: `.
DO 500 TIMES.
 ASSIGN COMPONENT sy-index OF STRUCTURE tkomp TO FIELD-SYMBOL(<fld>).
  IF sy-subrc = 0.
   CHECK <fld> IS NOT INITIAL AND CONV string( <fld> ) CN ' 0,.'.
  ENDIF.
  ASSIGN COMPONENT sy-index OF STRUCTURE tkomp2 TO FIELD-SYMBOL(<fld2>).
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  IF <fld> <> <fld2>.
    WRITE: / `Component ` && sy-index && ` differs: ` && <fld>.
  ENDIF.
 ENDDO.

也许还有更漂亮的方法

我发现了oldie threads,也许有类似CL_ABAP_CORRESPONDING之类的东西?

顺便说一句,在上面的线程中他们说 Debugger使用类CL_TPDA_TOOL_DIFF来分析差异,因此是我的追随IP问题:

我们可以在调试器中实现吗?我从未见过ABAP调试器中的applet,该applet允许相互比较结构。

解决方法

您的解决方案实际上还可以。您可能需要添加CL_ABAP_STRUCTDESCR以获得组件的名称,以实现更好的输出。它还使您能够比较和分析组件字段的类型。

不幸的是,没有可重用的类,函数或内置方法。

您将在类CL_ABAP_UNIT_ASSERT的方法ASSERT_EQUALS中找到最精确的比较实现。更准确地说,本地类DATA_DIFF的方法DIFF_STRUCTS显示了如何以允许类型和嵌套的方式比较结构。

我不能代表CL_TPDA_TOOL_DIFF班。我之前听说过它,但是实际上我们在SAP NW 7.52系统中甚至没有。

我也从未见过可以比较结构并显示差异的调试器视图或插件。不知道该评论来自何方。

,

下面有一些代码片段,您可以在cl_abap_typedescr=>describe_by_data中传递结构。

 DATA: lo_struct TYPE REF TO cl_abap_structdescr,        lt_comp   TYPE abap_component_tab,        ls_comp   TYPE abap_componentdescr. 

 CLEAR lo_struct.

  lo_struct ?= cl_abap_typedescr=>describe_by_data( p_data = lt_list_sum  ).

  REFRESH lt_comp.

  lt_comp = lo_struct->get_components( ).

  MOVE-CORRESPONDING gt_mov_grp TO gt_mov_grp_std.

  LOOP AT lt_comp INTO ls_comp.

    CLEAR lv_numeric.

    IF ls_comp-name(4) EQ cx_move.
      lv_numeric = ls_comp-name+5(2).

      READ TABLE gt_mov_grp_std REFERENCE INTO lr_mov_grp WITH KEY report_order = lv_numeric.
      IF sy-subrc EQ 0 AND
         lr_mov_grp IS BOUND.

        APPEND INITIAL LINE TO et_data REFERENCE INTO DATA(lr_data).
        MOVE-CORRESPONDING lr_mov_grp->* TO lr_data->*.
        IF <fs> IS ASSIGNED.
          UNASSIGN <fs>.
        ENDIF.

        ASSIGN COMPONENT ls_comp-name OF STRUCTURE lt_list_sum TO <fs>.
        IF sy-subrc EQ 0 AND
           <fs> IS ASSIGNED.
          lr_data->amount = <fs>.
        ENDIF.

        IF <fs> IS ASSIGNED.
          UNASSIGN <fs>.
        ENDIF.

        ASSIGN COMPONENT cx_currency OF STRUCTURE lt_list_sum TO <fs>.
        IF sy-subrc EQ 0 AND
           <fs> IS ASSIGNED.
          lr_data->currency = <fs>.
        ENDIF.

        lr_data->datum = iv_datum.
        lr_data->werks = iv_werks.
        lr_data->kunnr = iv_kunnr.

      ENDIF.

    ENDIF.

  ENDLOOP.