并排结构值比较并显示差异?
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 系统中甚至没有它。
我也从未见过可以比较结构并显示差异的调试器视图或插件。不知道评论来自哪里。
如何逐个比较结构值并显示差异?
现在我用很原始的方式来做:
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 系统中甚至没有它。
我也从未见过可以比较结构并显示差异的调试器视图或插件。不知道评论来自哪里。