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

Side by side structure values comparison and showing the difference?

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

现在我用很原始的方式来做:

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 或更新的东西?

顺便说一句,在上面的线程中他们说 调试器使用 class CL_TPDA_TOOL_DIFF 来分析差异 ,因此我的后续问题是:

我们可以在调试器中实现吗?我从未在 ABAP 调试器中看到允许相互比较结构的小程序。

下面有代码片段,可以传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.

你的解决方案其实还可以。您可能想要添加 CL_ABAP_STRUCTDESCR 以获取组件的名称以获得更好的输出。它还可以让您比较和分析组件字段的类型。

遗憾的是,没有可重复使用的 class、函数或 built-in 方法。

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

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

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