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,但我使用了一个循环来创建密钥,这实际上就是问题所在。我