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

Is it possible to GROUP multiple columns in END AT statement?

我有内部 table 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

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

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

前提是werks,lgort,matnr是内部table的前三个字段,table已排序

如果你想用一个单独的字段来做(就像你的例子),新定义的字段(键)必须是内部 table 中的第一个字段(这是先决条件LOOP ... AT ... ENDAT 操作)和 table 也必须排序。

基于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,您可以构建新的内部总计 table 而不是显示它。