首页 > 解决方案 > LOOP itab vs VALUE FOR 过滤,哪个更高效?

问题描述

我正在尝试为以下场景编写一个 for 循环语句:

我使用了一个选择将多个tvarvc条目数据放入T_TVARVC.

LOOP AT t_tvarvc INTO DATA(s_tvarvc).
    CASE s_tvarvc-name.
      WHEN c_augru.
        s_tvarvc_range = CORRESPONDING #( s_tvarvc ).
        APPEND s_tvarvc_range TO t_augru.

      WHEN c_vkorg.
        s_tvarvc_range = CORRESPONDING #( s_tvarvc ).
        APPEND s_tvarvc_range TO t_vkorg.
    ENDCASE.
ENDLOOP. 

这就是我想出的:

DATA(t_augru) = VALUE tt_tvarvc( FOR s_tvarvc IN t_tvarvc
                                  WHERE ( name = c_augru )
                                  ( CORRESPONDING #( s_tvarvc ) ) ).

DATA(t_vkorg) = VALUE tt_tvarvc( FOR s_tvarvc IN t_tvarvc
                                  WHERE ( name = c_vkorg )
                                  ( CORRESPONDING #( s_tvarvc ) ) ). 

我的观察是,通过使用LOOP ATCASE语句组合,迭代次数将与T_TVARVC. 但是当对每个范围表
使用循环时,必须遍历更多次才能到达所需的条目,从而导致比第一种情况更多的迭代。FORT_TVARVC

这可以以更有效的方式编写吗?

标签: loopsabapinternal-tables

解决方案


我同意您关于将迭代加倍并使其更快的观察,我认为唯一的解决方案是仅使用一个循环,考虑到内部表尚未排序,这极大地限制了可能的解决方案,我来这个解决方案:

TYPES: tt_tvarvc TYPE STANDARD TABLE OF tvarvc WITH EMPTY KEY,
       BEGIN OF ty_ranges,
         t_augru TYPE tt_tvarvc,
         t_vkorg TYPE tt_tvarvc,
       END OF ty_ranges.
CONSTANTS: c_augru TYPE tvarvc-name VALUE 'AUGRU',
           c_vkorg TYPE tvarvc-name VALUE 'VKORG'.

DATA(t_tvarvc) = VALUE tt_tvarvc( for i = 1 while i <= 100 ( name = c_augru ) 
                                                           ( name = c_vkorg ) ).
DATA(ranges) = REDUCE ty_ranges(
                  INIT ranges2 = VALUE ty_ranges( )
                  FOR <tvarv> IN t_tvarvC
                  NEXT ranges2-t_augru = COND #( WHEN <tvarv>-name = c_augru
                                              THEN VALUE #( BASE ranges2-t_augru ( <tvarv> ) )
                                              ELSE ranges2-t_augru )
                       ranges2-t_vkorg = COND #( WHEN <tvarv>-name = c_vkorg
                                              THEN VALUE #( BASE ranges2-t_vkorg ( <tvarv> ) )
                                              ELSE ranges2-t_vkorg ) ).

(您将在代码中使用ranges-t_augruandranges-t_vkorg而不是t_augruand t_vkorg

您可以立即看到该代码比您的两个片段中的任何一个都更不清晰。

此外,与经典循环相比,性能没有任何提升。

回到带有两次 FOR 迭代的代码段,我们可以看到与经典循环相比,目标非常明确(我的观点)。它当然更慢,但可能你不需要获得几微秒,所以我认为这是最好的解决方案(我仍然认为)。


推荐阅读