如何解决是否可以在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操作),并且表也必须排序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。