按值比较结构体与另一个结构体的结构

3
我有这段动态代码。我需要检查一个键的结构是否在另一个结构中,如果可能的话,不需要检查每个字段的值。
逻辑上应该像这样:
IF ls_keys IN ls_data_struc.
  "do stuff
ENDIF.

我知道那段代码片段不起作用,但我认为它最能表达我的问题。

TYPES: BEGIN OF tys_keys,
        matnr TYPE matnr,
        vkorg TYPE vkorg,
       END OF tys_keys.

TYPES: BEGIN OF tys_data,
        matnr TYPE matnr,
        vkorg TYPE vkorg,
        mtpos TYPE mtpos,
       END OF tys_data.

DATA: ls_keys TYPE tys_keys,
      ls_data_struc TYPE tys_data.

应该可以正常工作的示例:

ls_keys-matnr = '009988776655443322'.
ls_keys-vkorg = '0001'.

ls_data_struc-matnr = '009988776655443322'.
ls_data_struc-vkorg = '0001'.
ls_data_struc-mtpos = 'ALEN'.

IF ls_keys IN ls_data_struc.
  "do something
ENDIF.

不应该工作的示例:

ls_keys-matnr = '112233445566778899'.
ls_keys-vkorg = '3145'.

ls_data_struc-matnr = '009988776655443322'.
ls_data_struc-vkorg = '0001'.
ls_data_struc-mtpos = 'ALEN'.

IF ls_keys IN ls_data_struc.
  "do something
ENDIF.
2个回答

6

如果只需要比较两个结构体的组件值,最简单的解决方案是使用构造运算符CORRESPONDING

IF ls_keys = CORRESPONDING tys_keys( ls_data_struc ).
  "do something
ENDIF.

0
如果字段的布局实际上类似于您问题中的代码片段,
If ls_keys = ls_data_struc(22). 
  “Do something
Endif.

应该也能工作。可能比使用相应的运算符更快,但适用性会更有限。


这是一个可能的解决方案,但我认为硬编码字段长度之和并不利于可维护性(如果结构具有非字符组件或未按相同顺序排列,则无法使用),仅仅对性能更好(在我的系统中,“Substring: 35256.00 < CORRESPONDING: 78607.00”,基于100,000次迭代)。 - Sandra Rossi
2
我同意,在许多情况下,你的答案更好。这就是我回答中所说的“适用性更有限”的原因。话虽如此,有时候你想要挤出每一点性能,对于那些不太可能改变且可维护风险相当低的表格来说,这样做是可以接受的。 - Bryan Cain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接