新的ABAP语法代替了COLLECT
目前,我有这个编码,它工作得非常好:新的ABAP语法代替了COLLECT,abap,Abap,目前,我有这个编码,它工作得非常好: 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_
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.
类型:从tty_ekpo开始,
ebeln型ebeln,
ebelp类型ebelp,
结束tty_ekpo。
数据:tty_ekpo的lt_ekpo类型表,
像lt_ekpo的ls_ekpo线。
循环gt_lopdata赋值字段-SYMBOL()。
ls_ekpo-ebeln=-ebeln。
ls_ekpo-ebelp=-ebelp。
将ls_ekpo收集到lt_ekpo。
结束循环。
我想对新语法也这样做,可能吗?如果是,如何使用?我使用这个:
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 ) ).
lt_ekpo=VALUE#(对于gt_数据中的组ebelnebelp
分组依据(ebeln=-ebeln)
ebelp=-ebelp)
无成员升序(ebelnebelp))。
好吧,我不同意Joszsef变量,因为没有成员的加法会生成所有组键值,它不会自动对数值字段进行求和收集。您需要为此执行其他操作
以下是增强型Joszef变体,可满足您的需要并收集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 ) ) .
类型:从ty_ekpo开始,
ebeln型ebeln,
ebelp类型ebelp,
网络类型ekpo网络,
蒂埃克波的尽头,
tty_ekpo类型带有空键的ty_ekpo标准表。
数据:具有唯一键ebeln ebelp的ty_ekpo的it_ekpo类型排序表。
数据(lt1_ekpo)=值tty_ekpo(
对于it_ekpo GROUP BY中的组(ebeln=-ebeln ebelp=-ebelp)
让coll_line=REDUCE#(IN组的初始线型为ty_ekpo
下一行ebeln=-ebeln行ebelp=-ebelp行netwr=行netwr+-netwr)
在(coll_线)中)。
另一种口味基于两种口味:
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 ) ) ) ).
DATA(lt2_ekpo)=减少tty_ekpo(初始值=tty_ekpo()
对于it_ekpo GROUP BY中的组(ebeln=-ebeln ebelp=-ebelp)
下一个cline=VALUE#(基本cline(ebeln=-ebeln-ebelp=-ebelp
netwr=减少netwr(初始值类型netwr
为华安
过滤器#(它是ekpo,其中ebeln=-ebeln和ebelp=-ebelp)
下一个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 ) ) .
类型:从ty_ekpo开始,
ebeln型ebeln,
ebelp类型ebelp,
网络类型ekpo网络,
材料类型ekpo材料,
蒂埃克波的尽头,
tty_ekpo类型带有空键的ty_ekpo标准表。
数据:具有唯一键ebeln ebelp的ty_ekpo的it_ekpo类型排序表。
数据(lt1_ekpo)=值tty_ekpo(
对于it_ekpo GROUP BY中的组(ebeln=-ebeln ebelp=-ebelp)
让coll_line=REDUCE#(IN组的初始线型为ty_ekpo
下一行ebeln=-ebeln
行ebelp=-ebelp
line netwr=line netwr+-netwr
行材料编号=-材料编号)
在(coll_线)中)。
ABAP文档:。我只需要对所有条目使用ebeln
和ebelp
。那么,如果此表中有一个MATNR字段,那么Joszef的变体是OK的,并且对于由ebeln和ebelp组合在一起的所有行都是一样的,那么如何在结果表中传输它呢?当前该字段仍然为空。@kdobrev对于第1个变量,您应该扩展ty_ekpo
类型,并在下一个语句中从itab传输它,如下所示NEXT line matnr=-matnr line ebeln=-ebeln line ebelp=代码>