Abap 是否可以在END AT语句中对多个列进行分组?
我有一个内部表Abap 是否可以在END AT语句中对多个列进行分组?,abap,Abap,我有一个内部表lt\u stock,包含以下行: WERKS LGORT MATNR QUANTITY 我想将WERKS LGORT和MATNR分组并添加数量 我使用了两个循环来完成此操作: LOOP AT lt_stock INTO ls_stock. MOVE-CORRESPONDING ls_stock TO ls_stock_key. CONCATENATE ls_stock-werks ls_stock-lgort ls_stock-matnr INTO ls_stock_
lt\u stock
,包含以下行:
WERKS
LGORT
MATNR
QUANTITY
我想将WERKS LGORT和MATNR分组并添加数量
我使用了两个循环来完成此操作:
LOOP AT lt_stock INTO ls_stock.
MOVE-CORRESPONDING ls_stock TO ls_stock_key.
CONCATENATE ls_stock-werks ls_stock-lgort ls_stock-matnr INTO ls_stock_key-key.
APPEND ls_stock_key TO lt_stock_key.
ENDLOOP.
LOOP AT lt_stock_key INTO ls_stock_key.
AT END OF key.
SUM.
APPEND ls_stock_key TO lt_stock_calculated.
ENDAT.
ENDLOOP.
是否可以使用单个循环来执行此操作?
(示例:
在werks,lgort,matnr的末尾
)这实际上是可能的,但它的标准方式是直接使用这三个字段(来自您的示例):
AT END OF matnr.
SUM.
...
ENDAT.
先决条件是werks、lgort和matnr是内部表的前三个字段,并对表进行排序
如果要使用单独的字段(如您的示例中所示),则新定义的字段(键)必须是内部表中的第一个字段(这是循环…在…结束时操作的先决条件),并且还必须对表进行排序。这实际上是可能的,但使用这三个字段的标准方式(来自您的示例)直接:
AT END OF matnr.
SUM.
...
ENDAT.
先决条件是werks、lgort和matnr是内部表的前三个字段,并对表进行排序
如果要使用单独的字段(如示例中所示),新定义的字段(键)必须是内部表中的第一个字段(这是循环…在…结束时操作的先决条件),并且还必须对表进行排序。基于
循环…分组方式的简单示例:
TYPES: BEGIN OF ty_stock,
werks TYPE werks_d,
lgort TYPE lgort_d,
matnr TYPE matnr,
qty TYPE volum,
END OF ty_stock,
tty_stock TYPE STANDARD TABLE OF ty_stock WITH NON-UNIQUE KEY primary_key COMPONENTS werks lgort matnr.
DATA: lt_input TYPE tty_stock.
DATA(out) = cl_demo_output=>new( ).
lt_input = VALUE #( ( werks = 1000 lgort = 100 matnr = '10130101' qty = 40 )
( werks = 1000 lgort = 120 matnr = '10140101' qty = 150 )
( werks = 1000 lgort = 130 matnr = '10150101' qty = 300 )
( werks = 1000 lgort = 130 matnr = '10150101' qty = 100 )
( werks = 1000 lgort = 140 matnr = '10140101' qty = 200 )
( werks = 1000 lgort = 140 matnr = '10140101' qty = 180 )
( werks = 1000 lgort = 150 matnr = '10190101' qty = 120 )
( werks = 1000 lgort = 130 matnr = '10190101' qty = 200 )
( werks = 1000 lgort = 120 matnr = '10140101' qty = 300 )
( werks = 1000 lgort = 200 matnr = '10170101' qty = 500 )
).
DATA: qty TYPE volum.
LOOP AT lt_input ASSIGNING FIELD-SYMBOL(<fs_inp>) USING KEY primary_key GROUP BY ( werks = <fs_inp>-werks lgort = <fs_inp>-lgort matnr = <fs_inp>-matnr ) REFERENCE INTO DATA(stock).
LOOP AT GROUP stock ASSIGNING FIELD-SYMBOL(<fs_member>).
qty = qty + <fs_member>-qty.
ENDLOOP.
out->write( stock->lgort && '/' && stock->matnr && ` qty: ` && qty ).
CLEAR qty.
ENDLOOP.
out->display( ).
类型:从TYU库存开始,
werks类型werks\u d,
lgort类型lgort\U d,
matnr类型matnr,
数量类型体积,
蒂尤股票的结束,
tty_库存类型带有非唯一主要关键部件的tty_库存标准表werks lgort matnr。
数据:lt\U输入类型tty\U库存。
数据(输出)=cl_演示_输出=>new()。
lt_输入=值(werks=1000 lgort=100材料=10130101数量=40)
(werks=1000 lgort=120材料数量=10140101数量=150)
(werks=1000 lgort=130材料编号=10150101数量=300)
(werks=1000 lgort=130材料编号=10150101数量=100)
(werks=1000 lgort=140材质=10140101数量=200)
(werks=1000 lgort=140材质=10140101数量=180)
(werks=1000 lgort=150材料数量=10190101数量=120)
(werks=1000 lgort=130材料编号=10190101数量=200)
(werks=1000 lgort=120材料数量=10140101数量=300)
(werks=1000 lgort=200材料编号=10170101数量=500)
).
数据:数量类型体积。
在lt_输入处循环,将字段-SYMBOL()使用键primary_键组BY(werks=-werks lgort=-lgort matnr=-matnr)引用分配到数据(stock)中。
在组库存分配字段-SYMBOL()处循环。
数量=数量+-数量。
结束循环。
输出->写入(库存->港口和库存->材料和数量:`&&qty)。
清除数量。
结束循环。
输出->显示()。
通过将out->write()
替换为APPEND
,您可以构建新的总计内部表,而不是显示它。基于循环…分组方式的简单示例:
TYPES: BEGIN OF ty_stock,
werks TYPE werks_d,
lgort TYPE lgort_d,
matnr TYPE matnr,
qty TYPE volum,
END OF ty_stock,
tty_stock TYPE STANDARD TABLE OF ty_stock WITH NON-UNIQUE KEY primary_key COMPONENTS werks lgort matnr.
DATA: lt_input TYPE tty_stock.
DATA(out) = cl_demo_output=>new( ).
lt_input = VALUE #( ( werks = 1000 lgort = 100 matnr = '10130101' qty = 40 )
( werks = 1000 lgort = 120 matnr = '10140101' qty = 150 )
( werks = 1000 lgort = 130 matnr = '10150101' qty = 300 )
( werks = 1000 lgort = 130 matnr = '10150101' qty = 100 )
( werks = 1000 lgort = 140 matnr = '10140101' qty = 200 )
( werks = 1000 lgort = 140 matnr = '10140101' qty = 180 )
( werks = 1000 lgort = 150 matnr = '10190101' qty = 120 )
( werks = 1000 lgort = 130 matnr = '10190101' qty = 200 )
( werks = 1000 lgort = 120 matnr = '10140101' qty = 300 )
( werks = 1000 lgort = 200 matnr = '10170101' qty = 500 )
).
DATA: qty TYPE volum.
LOOP AT lt_input ASSIGNING FIELD-SYMBOL(<fs_inp>) USING KEY primary_key GROUP BY ( werks = <fs_inp>-werks lgort = <fs_inp>-lgort matnr = <fs_inp>-matnr ) REFERENCE INTO DATA(stock).
LOOP AT GROUP stock ASSIGNING FIELD-SYMBOL(<fs_member>).
qty = qty + <fs_member>-qty.
ENDLOOP.
out->write( stock->lgort && '/' && stock->matnr && ` qty: ` && qty ).
CLEAR qty.
ENDLOOP.
out->display( ).
类型:从TYU库存开始,
werks类型werks\u d,
lgort类型lgort\U d,
matnr类型matnr,
数量类型体积,
蒂尤股票的结束,
tty_库存类型带有非唯一主要关键部件的tty_库存标准表werks lgort matnr。
数据:lt\U输入类型tty\U库存。
数据(输出)=cl_演示_输出=>new()。
lt_输入=值(werks=1000 lgort=100材料=10130101数量=40)
(werks=1000 lgort=120材料数量=10140101数量=150)
(werks=1000 lgort=130材料编号=10150101数量=300)
(werks=1000 lgort=130材料编号=10150101数量=100)
(werks=1000 lgort=140材质=10140101数量=200)
(werks=1000 lgort=140材质=10140101数量=180)
(werks=1000 lgort=150材料数量=10190101数量=120)
(werks=1000 lgort=130材料编号=10190101数量=200)
(werks=1000 lgort=120材料数量=10140101数量=300)
(werks=1000 lgort=200材料编号=10170101数量=500)
).
数据:数量类型体积。
在lt_输入处循环,将字段-SYMBOL()使用键primary_键组BY(werks=-werks lgort=-lgort matnr=-matnr)引用分配到数据(stock)中。
在组库存分配字段-SYMBOL()处循环。
数量=数量+-数量。
结束循环。
输出->写入(库存->港口和库存->材料和数量:`&&qty)。
清除数量。
结束循环。
输出->显示()。
通过将out->write()
替换为APPEND
,您可以构建新的总计内部表,而不是显示它。SUM
已过时,关于末尾的,SAP(自7.40起):“如果可能,建议使用加法分组,因为在这种情况下,分组不取决于行的结构和处理顺序。“既然只有键字段和数量字段,为什么不使用COLLECT语句呢?下面是相同的问题和一些示例,以及新的组处理的替代方案:@astentx,但我使用了一个循环来创建密钥,这实际上就是问题所在。我想看看是否可以只使用一个循环。@OvidiuPocnet您使用了一个循环来生成密钥,但为什么?只需在该循环中收集或分组,我已经提供了一个链接。SUM
已过时,关于末尾的,SAP(从7.40开始):“如果可能,建议使用加法group by,因为在这种情况下分组不依赖于行的结构和处理顺序。”既然只有key和quantity字段,为什么不使用COLLECT语句呢?下面是相同的问题和一些示例,以及新的组处理的替代方案:@astentx,但我使用了一个循环来创建密钥,这实际上就是问题所在。我