目前,我有这个编码,它工作得很好:
TYPES: BEGIN OF tty_ekpo,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
END OF tty_ekpo.
DATA: lt_ekpo TYPE TABLE OF tty_ekpo,
ls_ekpo LIKE LINE OF lt_ekpo.
LOOP AT gt_lopdata ASSIGNING FIELD-SYMBOL(<fs_collect>).
ls_ekpo-ebeln = <fs_collect>-ebeln.
ls_ekpo-ebelp = <fs_collect>-ebelp.
COLLECT ls_ekpo INTO lt_ekpo.
ENDLOOP.
我想用新语法做同样的事情,可能吗?
如果是,如何?
我使用这个:
lt_ekpo = VALUE #( FOR GROUPS ebelnebelp OF <ls_collect> IN gt_lopdata
GROUP BY ( ebeln = <ls_collect>-ebeln
ebelp = <ls_collect>-ebelp )
ASCENDING WITHOUT MEMBERS ( ebelnebelp ) ).
好吧,我不同意 Joszsef 变体,因为加法WITHOUT MEMBERS
会产生所有组键值,它不会像COLLECT
一样自动对数值字段求和。为此,您需要执行其他操作。
这是增强的约瑟夫变体,可满足您的需求并收集 NETWR 字段:
TYPES: BEGIN OF ty_ekpo,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
netwr TYPE ekpo-netwr,
END OF ty_ekpo,
tty_ekpo TYPE STANDARD TABLE OF ty_ekpo WITH EMPTY KEY.
DATA: it_ekpo TYPE SORTED TABLE OF ty_ekpo WITH UNIQUE KEY ebeln ebelp.
DATA(lt1_ekpo) = VALUE tty_ekpo(
FOR GROUPS <group_key> OF <g> IN it_ekpo GROUP BY ( ebeln = <g>-ebeln ebelp = <g>-ebelp )
LET coll_line = REDUCE #( INIT line TYPE ty_ekpo FOR <m> IN GROUP <group_key>
NEXT line-ebeln = <m>-ebeln line-ebelp = <m>-ebelp line-netwr = line-netwr + <m>-netwr )
IN ( coll_line ) ) .
另一种基于两个REDUCE的口味:
DATA(lt2_ekpo) = REDUCE tty_ekpo( INIT cline = VALUE tty_ekpo( )
FOR GROUPS <group_key> OF <g> IN it_ekpo GROUP BY ( ebeln = <g>-ebeln ebelp = <g>-ebelp )
NEXT cline = VALUE #( BASE cline ( ebeln = <group_key>-ebeln ebelp = <group_key>-ebelp
netwr = REDUCE netwr( INIT val TYPE netwr
FOR wa IN
FILTER #( it_ekpo WHERE ebeln = <group_key>-ebeln AND ebelp = <group_key>-ebelp )
NEXT val = val + wa-netwr ) ) ) ).
我看到在您的原始帖子中,您也没有进行总结,您只是将关键字段收集到表中。如果这是你需要的,Joszef 片段是可以的。只是要注意COLLECT
做的远不止这些。
为了回答我自己的问题,结果将是这样的:
TYPES: BEGIN OF ty_ekpo,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
netwr TYPE ekpo-netwr,
matnr type ekpo-matnr,
END OF ty_ekpo,
tty_ekpo TYPE STANDARD TABLE OF ty_ekpo WITH EMPTY KEY.
DATA: it_ekpo TYPE SORTED TABLE OF ty_ekpo WITH UNIQUE KEY ebeln ebelp.
DATA(lt1_ekpo) = VALUE tty_ekpo(
FOR GROUPS <group_key> OF <g> IN it_ekpo GROUP BY ( ebeln = <g>-ebeln ebelp = <g>-ebelp )
LET coll_line = REDUCE #( INIT line TYPE ty_ekpo FOR <m> IN GROUP <group_key>
NEXT line-ebeln = <m>-ebeln
line-ebelp = <m>-ebelp
line-netwr = line-netwr + <m>-netwr
line-matnr = <m>-matnr )
IN ( coll_line ) ) .