是否可以在 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 而不是显示它。
我有内部 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 而不是显示它。