是否可以在END AT语句中对多列进行分组?

问题描述

我有内部表lt_stock,其中包含以下行:

WERKS
LGORT
MATNR
QUANTITY

我想将WERKS LGORT和MATNR分组,并添加QUANTITY。

我使用2个循环来完成此操作:

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.

是否可以使用单个LOOP做到这一点? (例如:AT END OF werks,lgort,matnr

解决方法

基于LOOP...GROUP BY的简单示例:

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( ).

通过将out->write( )替换为APPEND,您可以构造新的总计内部表而不显示它。

,

实际上是可行的,但是它是直接使用三个字段(来自您的示例)的标准方法:

AT END OF matnr.
    SUM.
...
ENDAT.

先决条件是werks,lgort和matnr是内部表的前三个字段,并且表已排序。

如果要使用一个单独的字段(例如您的示例),则新定义的字段(键)必须是内部表中的第一个字段(这是LOOP ... AT的先决条件。 .. ENDAT操作),并且表也必须排序。