如何解决并排的结构值比较并显示差异?
如何逐个比较结构值并显示差异?
现在,我以一种非常原始的方式进行操作:
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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。