我需要从> 的最高exbel registers 获得线条。 结果表可能包含相同Vkont值的几行,如果后一个在源表中具有几行,具有相同的最高EXBEL值。
实际源表:
SPARTE VKONT EXBEL
05 800000008422 1NSN150900000058
L2 800000008422 1NSN150900000058
05 800000008422 1NSN150900000037
L2 800000008422 1NSN150900000037
05 800000008422 1NSN150900000013
L2 800000008422 1NSN150900000013
05 800000008415 1HSN151200000009
S1 800000008415 1HSN151200000009
05 800000008415 1HSN151200000008
S1 800000008415 1HSN151200000008
L1 800000008422 1NSN150900000050
L1 800000008422 1NSN150900000029
L1 800000008422 1NSN150900000023
05 800000008415 1HSN151200000012
S1 800000008415 1HSN151200000012
05 800000008422 1NSN150900000058
L2 800000008422 1NSN150900000058
05 800000008415 1HSN151200000009
S1 800000008415 1HSN151200000009
预期结果表:
SPARTE VKONT EXBEL
05 800000008422 1NSN150900000058
L2 800000008422 1NSN150900000058
05 800000008415 1HSN151200000012
S1 800000008415 1HSN151200000012
我尝试了不同的解决方案,但没有起作用。
任何帮助将不胜感激。
raúl。
从7.52开始,您可以在内部表上选择。
下面的示例代码。TYPES:
BEGIN OF ty_s_value,
sparte TYPE char2,
vkont TYPE char12,
exbel TYPE char16,
END OF ty_s_value.
TYPES:
ty_t_value TYPE STANDARD TABLE OF ty_s_value .
DATA:
lt_value TYPE ty_t_value.
lt_value = VALUE #(
( sparte = '05' vkont = '800008422' exbel = '0000000000000001')
( sparte = 'l2' vkont = '800008422' exbel = '0000000000000002')
( sparte = 'l2' vkont = '800008422' exbel = '0000000000000004')
( sparte = '05' vkont = '800008423' exbel = '0000000000000003')
( sparte = 'l2' vkont = '800008423' exbel = '0000000000000002')
( sparte = 'l2' vkont = '800008423' exbel = '0000000000000005')
).
SELECT FROM @lt_value AS a FIELDS a~sparte, a~vkont, MAX( a~exbel ) AS exbel
GROUP BY a~sparte, a~vkont
ORDER BY a~sparte, a~vkont INTO TABLE @DATA(result).
收集到哈希表
这与当前支持的任何版本相比,这与 1 相比,
FIELD-SYMBOLS: <fs_itab> LIKE LINE OF lt_original.
DATA: ls_itab LIKE LINE OF lt_original,
lt_hashed TYPE HASHED TABLE OF itab WITH UNIQUE KEY vkont.
LOOP AT lt_original INTO ls_itab.
READ TABLE lt_hashed ASSIGNING <fs_itab>
WITH KEY vkont = ls_itab-vkont.
IF sy-subrc = 0.
IF ls_itab-exbel > <fs_itab>-exbel.
<fs_itab>-exbel = ls_itab-exbel.
<fs_itab>-sparte = ls_itab-sparte. "remove this if not needed"
ENDIF.
ELSE.
INSERT ls_itab INTO TABLE lt_hashed.
ENDIF.
ENDLOOP.
- sort dad的速度缩放为o(n*log(n)),而它具有o(n)
这里是减少解决方案,降低操作员是可依次的,因为ABAP 7.40 SP08。
TYPES: BEGIN OF ty_s_value,
sparte TYPE char2,
vkont TYPE char12,
exbel TYPE char16,
END OF ty_s_value.
TYPES: ty_t_value TYPE STANDARD TABLE OF ty_s_value WITH EMPTY KEY.
DATA(lt_tab) =
VALUE ty_t_value(
( sparte = '05' vkont = '800000008422' exbel = '1NSN150900000058')
( sparte = 'L2' vkont = '800000008422' exbel = '1NSN150900000058')
( sparte = '05' vkont = '800000008422' exbel = '1NSN150900000037')
( sparte = 'L2' vkont = '800000008422' exbel = '1NSN150900000037')
( sparte = '05' vkont = '800000008422' exbel = '1NSN150900000013')
( sparte = 'L2' vkont = '800000008422' exbel = '1NSN150900000013')
( sparte = '05' vkont = '800000008415' exbel = '1HSN151200000009')
( sparte = 'S1' vkont = '800000008415' exbel = '1HSN151200000009')
( sparte = '05' vkont = '800000008415' exbel = '1HSN151200000008')
( sparte = 'S1' vkont = '800000008415' exbel = '1HSN151200000008')
( sparte = 'L1' vkont = '800000008422' exbel = '1NSN150900000050')
( sparte = 'L1' vkont = '800000008422' exbel = '1NSN150900000029')
...
).
DATA(lt_result) =
VALUE ty_t_value( FOR GROUPS <group_key> OF <wa> IN lt_tab
GROUP BY ( sparte = <wa>-sparte vkont = <wa>-vkont )
LET max2 =
REDUCE #( INIT max =
VALUE ty_s_value( )
FOR <m> IN GROUP <group_key>
NEXT max = COND #( WHEN <m>-exbel > max-exbel THEN <m> ELSE max ) )
IN ( max2 ) ).
顺便说一句,您的预期结果集缺少L1行,我认为您在您的选择中不仅尊重Vkont,而且也尊重Sparte。
您可以使用SORT
,然后使用DELETE ADJACENT DUPLICATES
,因为后者将在某些行中删除所有行,除了组的第一行。
SORT itab BY vkont exbel DESCENDING. " Group by VKONT and put highest EXBEL in the group first
DELETE ADJACENT DUPLICATES FROM itab COMPARING VKONT.
如果您需要保持原始itab
完整。